{"id":4343,"date":"2026-09-14T16:45:46","date_gmt":"2026-09-14T14:45:46","guid":{"rendered":"https:\/\/weiss-apparatebau.de\/service\/tri-clamp-connections-stainless-steel\/"},"modified":"2026-09-23T14:40:51","modified_gmt":"2026-09-23T12:40:51","slug":"tri-clamp-connections-stainless-steel","status":"publish","type":"page","link":"https:\/\/weiss-apparatebau.de\/en\/service\/tri-clamp-connections-stainless-steel\/","title":{"rendered":"Stainless steel Tri-Clamp connections"},"content":{"rendered":"<p><div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-1 fusion-flex-container has-pattern-background has-mask-background weiss-landing-hero nonhundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-padding-top:72px;--awb-padding-bottom:72px;--awb-padding-top-small:32px;--awb-padding-bottom-small:32px;--awb-flex-wrap:wrap;\" ><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"max-width:1248px;margin-left: calc(-4% \/ 2 );margin-right: calc(-4% \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-0 fusion_builder_column_1_2 1_2 fusion-flex-column fusion-flex-align-self-center fusion-no-small-visibility\" style=\"--awb-bg-size:cover;--awb-width-large:50%;--awb-spacing-right-large:3.84%;--awb-margin-bottom-large:0px;--awb-spacing-left-large:3.84%;--awb-width-medium:50%;--awb-order-medium:0;--awb-spacing-right-medium:3.84%;--awb-spacing-left-medium:3.84%;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:1.92%;--awb-margin-bottom-small:60px;--awb-spacing-left-small:1.92%;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div class=\"fusion-image-element \" style=\"--awb-mask-url: url(https:\/\/weiss-apparatebau.de\/wp-content\/plugins\/fusion-builder\/\/assets\/images\/masks\/mask-16.svg);--awb-mask-size: 100%;--awb-mask-position: bottom left;--awb-caption-title-font-family:var(--h2_typography-font-family);--awb-caption-title-font-weight:var(--h2_typography-font-weight);--awb-caption-title-font-style:var(--h2_typography-font-style);--awb-caption-title-size:var(--h2_typography-font-size);--awb-caption-title-transform:var(--h2_typography-text-transform);--awb-caption-title-line-height:var(--h2_typography-line-height);--awb-caption-title-letter-spacing:var(--h2_typography-letter-spacing);\"><span class=\" fusion-imageframe imageframe-none imageframe-1 hover-type-none has-mask\"><img decoding=\"async\" width=\"1200\" height=\"1020\" alt=\"Top of a vessel with Tri-Clamp connections, valves and an open manway\" title=\"weiss-tri-clamp-anschlu\u0308sse-beha\u0308lter\" src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/09\/weiss-tri-clamp-anschluesse-behaelter.jpg\" data-orig-src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/09\/weiss-tri-clamp-anschluesse-behaelter.jpg\" class=\"lazyload img-responsive wp-image-4322\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%271200%27%20height%3D%271020%27%20viewBox%3D%270%200%201200%201020%27%3E%3Crect%20width%3D%271200%27%20height%3D%271020%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-srcset=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/09\/weiss-tri-clamp-anschluesse-behaelter-200x170.jpg 200w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/09\/weiss-tri-clamp-anschluesse-behaelter-400x340.jpg 400w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/09\/weiss-tri-clamp-anschluesse-behaelter-600x510.jpg 600w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/09\/weiss-tri-clamp-anschluesse-behaelter-800x680.jpg 800w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/09\/weiss-tri-clamp-anschluesse-behaelter.jpg 1200w\" data-sizes=\"auto\" data-orig-sizes=\"(max-width: 800px) 100vw, 600px\" \/><\/span><\/div><\/div><\/div><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-1 fusion_builder_column_1_2 1_2 fusion-flex-column fusion-flex-align-self-center\" style=\"--awb-padding-right:40px;--awb-padding-left:40px;--awb-padding-right-small:0px;--awb-padding-left-small:0px;--awb-bg-size:cover;--awb-width-large:50%;--awb-spacing-right-large:3.84%;--awb-margin-bottom-large:0px;--awb-spacing-left-large:3.84%;--awb-width-medium:50%;--awb-order-medium:0;--awb-spacing-right-medium:3.84%;--awb-spacing-left-medium:3.84%;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:1.92%;--awb-spacing-left-small:1.92%;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div class=\"fusion-title title fusion-title-1 fusion-sep-none fusion-title-text fusion-title-size-one weiss-hero-title\" style=\"--awb-margin-bottom:24px;--awb-margin-bottom-small:20px;--awb-font-size:40px;\"><h1 class=\"fusion-title-heading title-heading-left fusion-responsive-typography-calculated\" style=\"margin:0;font-size:1em;text-transform:var(--awb-typography1-text-transform);--fontSize:40;line-height:var(--awb-typography1-line-height);\">Stainless steel Tri-Clamp connections<\/h1><\/div><div class=\"fusion-text fusion-text-1 fusion-text-no-margin weiss-hero-intro\" style=\"--awb-margin-bottom:24px;\"><p>Clamps, ferrules and gaskets for your piping and vessels.<\/p>\n<p>Select the matching components and send us your technical inquiry.<\/p>\n<\/div><div ><a class=\"fusion-button button-flat fusion-button-default-size button-custom fusion-button-default button-1 fusion-button-default-span fusion-button-default-type weiss-config-trigger weiss-norm-din32676 weiss-hero-cta fusion-has-button-gradient\" style=\"--button_accent_color:var(--awb-color8);--button_border_color:var(--awb-color7);--button_accent_hover_color:var(--awb-custom_color_1);--button_border_hover_color:var(--awb-custom_color_1);--button_border_width-top:1px;--button_border_width-right:1px;--button_border_width-bottom:1px;--button_border_width-left:1px;--button_gradient_start:92%;--button_gradient_end:92%;--button_gradient_top_color:hsla(var(--awb-color1-h),var(--awb-color1-s),var(--awb-color1-l),calc(var(--awb-color1-a) - 100%));--button_gradient_bottom_color:var(--awb-color5);--button_gradient_top_color_hover:var(--awb-color5);--button_gradient_bottom_color_hover:var(--awb-color5);--button_padding-top:20px;--button_padding-right:36px;--button_padding-bottom:22px;--button_padding-left:36px;--button_margin-bottom:10px;\" target=\"_self\" data-hover=\"bg_slide_left\" href=\"#\" data-toggle=\"modal\" data-target=\".fusion-modal.weiss-fittings-modal\"><span class=\"fusion-button-text awb-button__text awb-button__text--default\">Configure Tri-Clamp<\/span><i class=\"awb-factoryarrow-right awb-button__icon awb-button__icon--default button-icon-right\" aria-hidden=\"true\"><\/i><\/a><\/div><div class=\"fusion-image-element fusion-no-medium-visibility fusion-no-large-visibility\" style=\"--awb-mask-url: url(https:\/\/weiss-apparatebau.de\/wp-content\/plugins\/fusion-builder\/\/assets\/images\/masks\/mask-16.svg);--awb-mask-size: 100%;--awb-mask-position: bottom left;--awb-margin-bottom-small:20px;--awb-caption-title-font-family:var(--h2_typography-font-family);--awb-caption-title-font-weight:var(--h2_typography-font-weight);--awb-caption-title-font-style:var(--h2_typography-font-style);--awb-caption-title-size:var(--h2_typography-font-size);--awb-caption-title-transform:var(--h2_typography-text-transform);--awb-caption-title-line-height:var(--h2_typography-line-height);--awb-caption-title-letter-spacing:var(--h2_typography-letter-spacing);\"><span class=\" fusion-imageframe imageframe-none imageframe-2 hover-type-none has-mask\"><img decoding=\"async\" width=\"1200\" height=\"1020\" alt=\"Top of a vessel with Tri-Clamp connections, valves and an open manway\" title=\"weiss-tri-clamp-anschlu\u0308sse-beha\u0308lter\" src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/09\/weiss-tri-clamp-anschluesse-behaelter.jpg\" data-orig-src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/09\/weiss-tri-clamp-anschluesse-behaelter.jpg\" class=\"lazyload img-responsive wp-image-4322\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%271200%27%20height%3D%271020%27%20viewBox%3D%270%200%201200%201020%27%3E%3Crect%20width%3D%271200%27%20height%3D%271020%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-srcset=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/09\/weiss-tri-clamp-anschluesse-behaelter-200x170.jpg 200w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/09\/weiss-tri-clamp-anschluesse-behaelter-400x340.jpg 400w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/09\/weiss-tri-clamp-anschluesse-behaelter-600x510.jpg 600w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/09\/weiss-tri-clamp-anschluesse-behaelter-800x680.jpg 800w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/09\/weiss-tri-clamp-anschluesse-behaelter.jpg 1200w\" data-sizes=\"auto\" data-orig-sizes=\"(max-width: 800px) 100vw, 600px\" \/><\/span><\/div><\/div><\/div><\/div><\/div><div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-2 fusion-flex-container has-pattern-background has-mask-background hundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-flex-wrap:wrap;\" ><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"width:104% !important;max-width:104% !important;margin-left: calc(-4% \/ 2 );margin-right: calc(-4% \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-2 fusion_builder_column_1_1 1_1 fusion-flex-column\" style=\"--awb-bg-size:cover;--awb-width-large:100%;--awb-spacing-right-large:1.92%;--awb-margin-bottom-large:0px;--awb-spacing-left-large:1.92%;--awb-width-medium:100%;--awb-order-medium:0;--awb-spacing-right-medium:1.92%;--awb-spacing-left-medium:1.92%;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:1.92%;--awb-spacing-left-small:1.92%;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div class=\"fusion-image-carousel fusion-image-carousel-auto fusion-image-carousel-1\"><div class=\"awb-carousel awb-swiper awb-swiper-carousel awb-swiper-dots-position-bottom awb-carousel--carousel awb-carousel--masked\" data-layout=\"carousel\" data-autoplay=\"yes\" data-autoplayspeed=\"2500\" data-autoplaypause=\"no\" data-columns=\"6.0\" data-columnsmedium=\"0\" data-columnssmall=\"0\" data-itemmargin=\"13\" data-itemwidth=\"180\" data-touchscroll=\"no\" data-freemode=\"no\" data-imagesize=\"auto\" data-scrollitems=\"0\" data-centeredslides=\"no\" data-rotationangle=\"50\" data-depth=\"100\" data-speed=\"500\" data-shadow=\"no\" style=\"--awb-columns:6.0;--awb-dots-align:center;\"><div class=\"swiper-wrapper awb-image-carousel-wrapper fusion-flex-align-items-center\"><div class=\"swiper-slide\"><div class=\"fusion-carousel-item-wrapper\"><div class=\"fusion-image-wrapper hover-type-none\"><img decoding=\"async\" width=\"800\" height=\"800\" src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/389-097_rattiinox2.webp\" class=\"attachment-full size-full lazyload\" alt=\"\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27800%27%20height%3D%27800%27%20viewBox%3D%270%200%20800%20800%27%3E%3Crect%20width%3D%27800%27%20height%3D%27800%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-orig-src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/389-097_rattiinox2.webp\" data-srcset=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/389-097_rattiinox2-66x66.webp 66w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/389-097_rattiinox2-150x150.webp 150w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/389-097_rattiinox2-200x200.webp 200w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/389-097_rattiinox2-300x300.webp 300w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/389-097_rattiinox2-400x400.webp 400w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/389-097_rattiinox2-600x600.webp 600w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/389-097_rattiinox2-768x768.webp 768w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/389-097_rattiinox2.webp 800w\" data-sizes=\"auto\" \/><\/div><\/div><\/div><div class=\"swiper-slide\"><div class=\"fusion-carousel-item-wrapper\"><div class=\"fusion-image-wrapper hover-type-none\"><img decoding=\"async\" width=\"800\" height=\"800\" src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/382-039_rattiinox.webp\" class=\"attachment-full size-full lazyload\" alt=\"\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27800%27%20height%3D%27800%27%20viewBox%3D%270%200%20800%20800%27%3E%3Crect%20width%3D%27800%27%20height%3D%27800%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-orig-src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/382-039_rattiinox.webp\" data-srcset=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/382-039_rattiinox-66x66.webp 66w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/382-039_rattiinox-150x150.webp 150w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/382-039_rattiinox-200x200.webp 200w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/382-039_rattiinox-300x300.webp 300w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/382-039_rattiinox-400x400.webp 400w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/382-039_rattiinox-600x600.webp 600w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/382-039_rattiinox-768x768.webp 768w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/382-039_rattiinox.webp 800w\" data-sizes=\"auto\" \/><\/div><\/div><\/div><div class=\"swiper-slide\"><div class=\"fusion-carousel-item-wrapper\"><div class=\"fusion-image-wrapper hover-type-none\"><img decoding=\"async\" width=\"800\" height=\"800\" src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/379-035_rattiinox.webp\" class=\"attachment-full size-full lazyload\" alt=\"\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27800%27%20height%3D%27800%27%20viewBox%3D%270%200%20800%20800%27%3E%3Crect%20width%3D%27800%27%20height%3D%27800%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-orig-src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/379-035_rattiinox.webp\" data-srcset=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/379-035_rattiinox-66x66.webp 66w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/379-035_rattiinox-150x150.webp 150w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/379-035_rattiinox-200x200.webp 200w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/379-035_rattiinox-300x300.webp 300w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/379-035_rattiinox-400x400.webp 400w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/379-035_rattiinox-600x600.webp 600w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/379-035_rattiinox-768x768.webp 768w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/379-035_rattiinox.webp 800w\" data-sizes=\"auto\" \/><\/div><\/div><\/div><div class=\"swiper-slide\"><div class=\"fusion-carousel-item-wrapper\"><div class=\"fusion-image-wrapper hover-type-none\"><img decoding=\"async\" width=\"800\" height=\"800\" src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/376-034_rattiinox.webp\" class=\"attachment-full size-full lazyload\" alt=\"\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27800%27%20height%3D%27800%27%20viewBox%3D%270%200%20800%20800%27%3E%3Crect%20width%3D%27800%27%20height%3D%27800%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-orig-src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/376-034_rattiinox.webp\" data-srcset=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/376-034_rattiinox-66x66.webp 66w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/376-034_rattiinox-150x150.webp 150w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/376-034_rattiinox-200x200.webp 200w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/376-034_rattiinox-300x300.webp 300w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/376-034_rattiinox-400x400.webp 400w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/376-034_rattiinox-600x600.webp 600w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/376-034_rattiinox-768x768.webp 768w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/376-034_rattiinox.webp 800w\" data-sizes=\"auto\" \/><\/div><\/div><\/div><div class=\"swiper-slide\"><div class=\"fusion-carousel-item-wrapper\"><div class=\"fusion-image-wrapper hover-type-none\"><img decoding=\"async\" width=\"800\" height=\"800\" src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/374-026_rattiinox.webp\" class=\"attachment-full size-full lazyload\" alt=\"\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27800%27%20height%3D%27800%27%20viewBox%3D%270%200%20800%20800%27%3E%3Crect%20width%3D%27800%27%20height%3D%27800%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-orig-src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/374-026_rattiinox.webp\" data-srcset=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/374-026_rattiinox-66x66.webp 66w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/374-026_rattiinox-150x150.webp 150w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/374-026_rattiinox-200x200.webp 200w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/374-026_rattiinox-300x300.webp 300w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/374-026_rattiinox-400x400.webp 400w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/374-026_rattiinox-600x600.webp 600w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/374-026_rattiinox-768x768.webp 768w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/374-026_rattiinox.webp 800w\" data-sizes=\"auto\" \/><\/div><\/div><\/div><div class=\"swiper-slide\"><div class=\"fusion-carousel-item-wrapper\"><div class=\"fusion-image-wrapper hover-type-none\"><img decoding=\"async\" width=\"800\" height=\"800\" src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/369-026_rattiinox.webp\" class=\"attachment-full size-full lazyload\" alt=\"\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27800%27%20height%3D%27800%27%20viewBox%3D%270%200%20800%20800%27%3E%3Crect%20width%3D%27800%27%20height%3D%27800%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-orig-src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/369-026_rattiinox.webp\" data-srcset=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/369-026_rattiinox-66x66.webp 66w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/369-026_rattiinox-150x150.webp 150w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/369-026_rattiinox-200x200.webp 200w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/369-026_rattiinox-300x300.webp 300w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/369-026_rattiinox-400x400.webp 400w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/369-026_rattiinox-600x600.webp 600w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/369-026_rattiinox-768x768.webp 768w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/369-026_rattiinox.webp 800w\" data-sizes=\"auto\" \/><\/div><\/div><\/div><div class=\"swiper-slide\"><div class=\"fusion-carousel-item-wrapper\"><div class=\"fusion-image-wrapper hover-type-none\"><img decoding=\"async\" width=\"800\" height=\"800\" src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/349-040_rattiinox.webp\" class=\"attachment-full size-full lazyload\" alt=\"\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27800%27%20height%3D%27800%27%20viewBox%3D%270%200%20800%20800%27%3E%3Crect%20width%3D%27800%27%20height%3D%27800%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-orig-src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/349-040_rattiinox.webp\" data-srcset=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/349-040_rattiinox-66x66.webp 66w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/349-040_rattiinox-150x150.webp 150w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/349-040_rattiinox-200x200.webp 200w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/349-040_rattiinox-300x300.webp 300w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/349-040_rattiinox-400x400.webp 400w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/349-040_rattiinox-600x600.webp 600w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/349-040_rattiinox-768x768.webp 768w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/349-040_rattiinox.webp 800w\" data-sizes=\"auto\" \/><\/div><\/div><\/div><div class=\"swiper-slide\"><div class=\"fusion-carousel-item-wrapper\"><div class=\"fusion-image-wrapper hover-type-none\"><img decoding=\"async\" width=\"800\" height=\"800\" src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/345-028_rattiinox.webp\" class=\"attachment-full size-full lazyload\" alt=\"\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27800%27%20height%3D%27800%27%20viewBox%3D%270%200%20800%20800%27%3E%3Crect%20width%3D%27800%27%20height%3D%27800%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-orig-src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/345-028_rattiinox.webp\" data-srcset=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/345-028_rattiinox-66x66.webp 66w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/345-028_rattiinox-150x150.webp 150w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/345-028_rattiinox-200x200.webp 200w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/345-028_rattiinox-300x300.webp 300w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/345-028_rattiinox-400x400.webp 400w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/345-028_rattiinox-600x600.webp 600w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/345-028_rattiinox-768x768.webp 768w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/345-028_rattiinox.webp 800w\" data-sizes=\"auto\" \/><\/div><\/div><\/div><div class=\"swiper-slide\"><div class=\"fusion-carousel-item-wrapper\"><div class=\"fusion-image-wrapper hover-type-none\"><img decoding=\"async\" width=\"800\" height=\"800\" src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/341-031_rattiinox.webp\" class=\"attachment-full size-full lazyload\" alt=\"\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27800%27%20height%3D%27800%27%20viewBox%3D%270%200%20800%20800%27%3E%3Crect%20width%3D%27800%27%20height%3D%27800%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-orig-src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/341-031_rattiinox.webp\" data-srcset=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/341-031_rattiinox-66x66.webp 66w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/341-031_rattiinox-150x150.webp 150w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/341-031_rattiinox-200x200.webp 200w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/341-031_rattiinox-300x300.webp 300w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/341-031_rattiinox-400x400.webp 400w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/341-031_rattiinox-600x600.webp 600w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/341-031_rattiinox-768x768.webp 768w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/341-031_rattiinox.webp 800w\" data-sizes=\"auto\" \/><\/div><\/div><\/div><div class=\"swiper-slide\"><div class=\"fusion-carousel-item-wrapper\"><div class=\"fusion-image-wrapper hover-type-none\"><img decoding=\"async\" width=\"800\" height=\"800\" src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/338-030_rattiinox.webp\" class=\"attachment-full size-full lazyload\" alt=\"\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27800%27%20height%3D%27800%27%20viewBox%3D%270%200%20800%20800%27%3E%3Crect%20width%3D%27800%27%20height%3D%27800%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-orig-src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/338-030_rattiinox.webp\" data-srcset=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/338-030_rattiinox-66x66.webp 66w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/338-030_rattiinox-150x150.webp 150w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/338-030_rattiinox-200x200.webp 200w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/338-030_rattiinox-300x300.webp 300w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/338-030_rattiinox-400x400.webp 400w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/338-030_rattiinox-600x600.webp 600w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/338-030_rattiinox-768x768.webp 768w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/338-030_rattiinox.webp 800w\" data-sizes=\"auto\" \/><\/div><\/div><\/div><div class=\"swiper-slide\"><div class=\"fusion-carousel-item-wrapper\"><div class=\"fusion-image-wrapper hover-type-none\"><img decoding=\"async\" width=\"1400\" height=\"1400\" src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/326-085_rattiinox.webp\" class=\"attachment-full size-full lazyload\" alt=\"\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%271400%27%20height%3D%271400%27%20viewBox%3D%270%200%201400%201400%27%3E%3Crect%20width%3D%271400%27%20height%3D%271400%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-orig-src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/326-085_rattiinox.webp\" data-srcset=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/326-085_rattiinox-66x66.webp 66w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/326-085_rattiinox-150x150.webp 150w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/326-085_rattiinox-200x200.webp 200w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/326-085_rattiinox-300x300.webp 300w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/326-085_rattiinox-400x400.webp 400w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/326-085_rattiinox-600x600.webp 600w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/326-085_rattiinox-768x768.webp 768w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/326-085_rattiinox-800x800.webp 800w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/326-085_rattiinox-1024x1024.webp 1024w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/326-085_rattiinox-1200x1200.webp 1200w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/326-085_rattiinox.webp 1400w\" data-sizes=\"auto\" \/><\/div><\/div><\/div><div class=\"swiper-slide\"><div class=\"fusion-carousel-item-wrapper\"><div class=\"fusion-image-wrapper hover-type-none\"><img decoding=\"async\" width=\"800\" height=\"800\" src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/311-110_rattiinox.webp\" class=\"attachment-full size-full lazyload\" alt=\"\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27800%27%20height%3D%27800%27%20viewBox%3D%270%200%20800%20800%27%3E%3Crect%20width%3D%27800%27%20height%3D%27800%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-orig-src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/311-110_rattiinox.webp\" data-srcset=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/311-110_rattiinox-66x66.webp 66w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/311-110_rattiinox-150x150.webp 150w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/311-110_rattiinox-200x200.webp 200w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/311-110_rattiinox-300x300.webp 300w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/311-110_rattiinox-400x400.webp 400w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/311-110_rattiinox-600x600.webp 600w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/311-110_rattiinox-768x768.webp 768w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/311-110_rattiinox.webp 800w\" data-sizes=\"auto\" \/><\/div><\/div><\/div><div class=\"swiper-slide\"><div class=\"fusion-carousel-item-wrapper\"><div class=\"fusion-image-wrapper hover-type-none\"><img decoding=\"async\" width=\"800\" height=\"800\" src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/301-048_rattiinox.webp\" class=\"attachment-full size-full lazyload\" alt=\"\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27800%27%20height%3D%27800%27%20viewBox%3D%270%200%20800%20800%27%3E%3Crect%20width%3D%27800%27%20height%3D%27800%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-orig-src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/301-048_rattiinox.webp\" data-srcset=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/301-048_rattiinox-66x66.webp 66w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/301-048_rattiinox-150x150.webp 150w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/301-048_rattiinox-200x200.webp 200w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/301-048_rattiinox-300x300.webp 300w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/301-048_rattiinox-400x400.webp 400w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/301-048_rattiinox-600x600.webp 600w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/301-048_rattiinox-768x768.webp 768w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/301-048_rattiinox.webp 800w\" data-sizes=\"auto\" \/><\/div><\/div><\/div><div class=\"swiper-slide\"><div class=\"fusion-carousel-item-wrapper\"><div class=\"fusion-image-wrapper hover-type-none\"><img decoding=\"async\" width=\"800\" height=\"800\" src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/288-049Z_rattiinox.webp\" class=\"attachment-full size-full lazyload\" alt=\"\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27800%27%20height%3D%27800%27%20viewBox%3D%270%200%20800%20800%27%3E%3Crect%20width%3D%27800%27%20height%3D%27800%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-orig-src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/288-049Z_rattiinox.webp\" data-srcset=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/288-049Z_rattiinox-66x66.webp 66w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/288-049Z_rattiinox-150x150.webp 150w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/288-049Z_rattiinox-200x200.webp 200w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/288-049Z_rattiinox-300x300.webp 300w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/288-049Z_rattiinox-400x400.webp 400w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/288-049Z_rattiinox-600x600.webp 600w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/288-049Z_rattiinox-768x768.webp 768w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/288-049Z_rattiinox.webp 800w\" data-sizes=\"auto\" \/><\/div><\/div><\/div><div class=\"swiper-slide\"><div class=\"fusion-carousel-item-wrapper\"><div class=\"fusion-image-wrapper hover-type-none\"><img decoding=\"async\" width=\"800\" height=\"800\" src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/199-046_rattiinox.webp\" class=\"attachment-full size-full lazyload\" alt=\"\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27800%27%20height%3D%27800%27%20viewBox%3D%270%200%20800%20800%27%3E%3Crect%20width%3D%27800%27%20height%3D%27800%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-orig-src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/199-046_rattiinox.webp\" data-srcset=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/199-046_rattiinox-66x66.webp 66w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/199-046_rattiinox-150x150.webp 150w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/199-046_rattiinox-200x200.webp 200w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/199-046_rattiinox-300x300.webp 300w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/199-046_rattiinox-400x400.webp 400w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/199-046_rattiinox-600x600.webp 600w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/199-046_rattiinox-768x768.webp 768w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/199-046_rattiinox.webp 800w\" data-sizes=\"auto\" \/><\/div><\/div><\/div><div class=\"swiper-slide\"><div class=\"fusion-carousel-item-wrapper\"><div class=\"fusion-image-wrapper hover-type-none\"><img decoding=\"async\" width=\"1400\" height=\"1400\" src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/1776-097A_rattiinox.webp\" class=\"attachment-full size-full lazyload\" alt=\"\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%271400%27%20height%3D%271400%27%20viewBox%3D%270%200%201400%201400%27%3E%3Crect%20width%3D%271400%27%20height%3D%271400%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-orig-src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/1776-097A_rattiinox.webp\" data-srcset=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/1776-097A_rattiinox-66x66.webp 66w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/1776-097A_rattiinox-150x150.webp 150w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/1776-097A_rattiinox-200x200.webp 200w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/1776-097A_rattiinox-300x300.webp 300w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/1776-097A_rattiinox-400x400.webp 400w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/1776-097A_rattiinox-600x600.webp 600w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/1776-097A_rattiinox-768x768.webp 768w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/1776-097A_rattiinox-800x800.webp 800w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/1776-097A_rattiinox-1024x1024.webp 1024w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/1776-097A_rattiinox-1200x1200.webp 1200w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/1776-097A_rattiinox.webp 1400w\" data-sizes=\"auto\" \/><\/div><\/div><\/div><div class=\"swiper-slide\"><div class=\"fusion-carousel-item-wrapper\"><div class=\"fusion-image-wrapper hover-type-none\"><img decoding=\"async\" width=\"800\" height=\"614\" src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/1763-CADCONOnPipe-3.webp\" class=\"attachment-full size-full lazyload\" alt=\"\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27800%27%20height%3D%27614%27%20viewBox%3D%270%200%20800%20614%27%3E%3Crect%20width%3D%27800%27%20height%3D%27614%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-orig-src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/1763-CADCONOnPipe-3.webp\" data-srcset=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/1763-CADCONOnPipe-3-200x154.webp 200w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/1763-CADCONOnPipe-3-300x230.webp 300w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/1763-CADCONOnPipe-3-400x307.webp 400w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/1763-CADCONOnPipe-3-600x461.webp 600w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/1763-CADCONOnPipe-3-768x589.webp 768w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/1763-CADCONOnPipe-3.webp 800w\" data-sizes=\"auto\" \/><\/div><\/div><\/div><div class=\"swiper-slide\"><div class=\"fusion-carousel-item-wrapper\"><div class=\"fusion-image-wrapper hover-type-none\"><img decoding=\"async\" width=\"800\" height=\"661\" src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/1759-CADCON-OnPipe-rattiinox.webp\" class=\"attachment-full size-full lazyload\" alt=\"\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27800%27%20height%3D%27661%27%20viewBox%3D%270%200%20800%20661%27%3E%3Crect%20width%3D%27800%27%20height%3D%27661%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-orig-src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/1759-CADCON-OnPipe-rattiinox.webp\" data-srcset=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/1759-CADCON-OnPipe-rattiinox-200x165.webp 200w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/1759-CADCON-OnPipe-rattiinox-300x248.webp 300w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/1759-CADCON-OnPipe-rattiinox-400x331.webp 400w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/1759-CADCON-OnPipe-rattiinox-600x496.webp 600w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/1759-CADCON-OnPipe-rattiinox-768x635.webp 768w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/1759-CADCON-OnPipe-rattiinox.webp 800w\" data-sizes=\"auto\" \/><\/div><\/div><\/div><div class=\"swiper-slide\"><div class=\"fusion-carousel-item-wrapper\"><div class=\"fusion-image-wrapper hover-type-none\"><img decoding=\"async\" width=\"800\" height=\"661\" src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/1076-CADCON_rattiinox.webp\" class=\"attachment-full size-full lazyload\" alt=\"\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27800%27%20height%3D%27661%27%20viewBox%3D%270%200%20800%20661%27%3E%3Crect%20width%3D%27800%27%20height%3D%27661%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-orig-src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/1076-CADCON_rattiinox.webp\" data-srcset=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/1076-CADCON_rattiinox-200x165.webp 200w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/1076-CADCON_rattiinox-300x248.webp 300w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/1076-CADCON_rattiinox-400x331.webp 400w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/1076-CADCON_rattiinox-600x496.webp 600w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/1076-CADCON_rattiinox-768x635.webp 768w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/1076-CADCON_rattiinox.webp 800w\" data-sizes=\"auto\" \/><\/div><\/div><\/div><div class=\"swiper-slide\"><div class=\"fusion-carousel-item-wrapper\"><div class=\"fusion-image-wrapper hover-type-none\"><img decoding=\"async\" width=\"800\" height=\"661\" src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/871-CONCON_rattiinox_2.webp\" class=\"attachment-full size-full lazyload\" alt=\"\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27800%27%20height%3D%27661%27%20viewBox%3D%270%200%20800%20661%27%3E%3Crect%20width%3D%27800%27%20height%3D%27661%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-orig-src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/871-CONCON_rattiinox_2.webp\" data-srcset=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/871-CONCON_rattiinox_2-200x165.webp 200w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/871-CONCON_rattiinox_2-300x248.webp 300w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/871-CONCON_rattiinox_2-400x331.webp 400w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/871-CONCON_rattiinox_2-600x496.webp 600w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/871-CONCON_rattiinox_2-768x635.webp 768w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/871-CONCON_rattiinox_2.webp 800w\" data-sizes=\"auto\" \/><\/div><\/div><\/div><div class=\"swiper-slide\"><div class=\"fusion-carousel-item-wrapper\"><div class=\"fusion-image-wrapper hover-type-none\"><img decoding=\"async\" width=\"800\" height=\"800\" src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/390-036_rattiinox.webp\" class=\"attachment-full size-full lazyload\" alt=\"\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27800%27%20height%3D%27800%27%20viewBox%3D%270%200%20800%20800%27%3E%3Crect%20width%3D%27800%27%20height%3D%27800%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-orig-src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/390-036_rattiinox.webp\" data-srcset=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/390-036_rattiinox-66x66.webp 66w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/390-036_rattiinox-150x150.webp 150w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/390-036_rattiinox-200x200.webp 200w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/390-036_rattiinox-300x300.webp 300w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/390-036_rattiinox-400x400.webp 400w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/390-036_rattiinox-600x600.webp 600w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/390-036_rattiinox-768x768.webp 768w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/09\/390-036_rattiinox.webp 800w\" data-sizes=\"auto\" \/><\/div><\/div><\/div><\/div><div class=\"swiper-pagination\"><\/div><\/div><\/div><\/div><\/div><\/div><\/div><div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-3 fusion-flex-container has-pattern-background has-mask-background nonhundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-padding-top:100px;--awb-padding-bottom:100px;--awb-padding-top-small:36px;--awb-padding-bottom-small:35px;--awb-background-color:hsla(var(--awb-color4-h),var(--awb-color4-s),calc(var(--awb-color4-l) - 15%),var(--awb-color4-a));--awb-flex-wrap:wrap;\" ><div class=\"awb-background-pattern\" style=\"background-image:  url(data:image\/svg+xml;utf8,%3Csvg%20width%3D%2280%22%20height%3D%22120%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cg%20clip-path%3D%22url%28%23prefix__clip0_43_320%29%22%20fill%3D%22rgba%280%2C0%2C0%2C0.3%29%22%3E%3Cpath%20d%3D%22M40%200L0%2030v30l40-30V0zm0%2030v30l40%2030V60L40%2030zM40-30V0l40%2030V0L40-30zm0%2090L0%2090v30l40-30V60zm0%2030v30l40%2030v-30L40%2090z%22%2F%3E%3C%2Fg%3E%3Cdefs%3E%3CclipPath%20id%3D%22prefix__clip0_43_320%22%3E%3Cpath%20fill%3D%22%23fff%22%20d%3D%22M0%200h80v120H0z%22%2F%3E%3C%2FclipPath%3E%3C%2Fdefs%3E%3C%2Fsvg%3E);opacity: 0.2 ;background-size:100%;mix-blend-mode:normal;\"><\/div><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"max-width:1248px;margin-left: calc(-4% \/ 2 );margin-right: calc(-4% \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-3 fusion_builder_column_1_1 1_1 fusion-flex-column\" style=\"--awb-bg-size:cover;--awb-width-large:100%;--awb-spacing-right-large:1.92%;--awb-margin-bottom-large:60px;--awb-spacing-left-large:1.92%;--awb-width-medium:100%;--awb-order-medium:0;--awb-spacing-right-medium:1.92%;--awb-spacing-left-medium:1.92%;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:1.92%;--awb-spacing-left-small:1.92%;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div class=\"fusion-title title fusion-title-2 fusion-sep-none fusion-title-text fusion-title-size-two\" style=\"--awb-text-color:var(--awb-color1);\"><h2 class=\"fusion-title-heading title-heading-left fusion-responsive-typography-calculated\" style=\"margin:0;text-transform:var(--awb-typography1-text-transform);--fontSize:50;line-height:1.3;\">Tri-Clamp for hygienic production plants<\/h2><\/div><div class=\"fusion-title title fusion-title-3 fusion-sep-none fusion-title-text fusion-title-size-two\" style=\"--awb-text-color:var(--awb-color1);\"><h2 class=\"fusion-title-heading title-heading-left fusion-responsive-typography-calculated\" style=\"margin:0;text-transform:var(--awb-typography1-text-transform);--fontSize:50;line-height:1.3;\">Combining Tri-Clamp components correctly<\/h2><\/div><\/div><\/div><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-4 fusion_builder_column_1_1 1_1 fusion-flex-column\" style=\"--awb-bg-size:cover;--awb-width-large:100%;--awb-spacing-right-large:1.92%;--awb-margin-bottom-large:0px;--awb-spacing-left-large:1.92%;--awb-width-medium:100%;--awb-order-medium:0;--awb-spacing-right-medium:1.92%;--awb-spacing-left-medium:1.92%;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:1.92%;--awb-spacing-left-small:1.92%;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div class=\"fusion-builder-row fusion-builder-row-inner fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"width:104% !important;max-width:104% !important;margin-left: calc(-4% \/ 2 );margin-right: calc(-4% \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column_inner fusion-builder-nested-column-0 fusion_builder_column_inner_1_3 1_3 fusion-flex-column fusion-flex-align-self-stretch\" style=\"--awb-bg-size:cover;--awb-border-color:hsla(var(--awb-color1-h),var(--awb-color1-s),var(--awb-color1-l),calc(var(--awb-color1-a) - 85%));--awb-border-top:0px;--awb-border-right:1px;--awb-border-bottom:0px;--awb-border-left:0px;--awb-border-style:solid;--awb-width-large:33.333333333333%;--awb-spacing-right-large:5.76%;--awb-margin-bottom-large:0px;--awb-spacing-left-large:5.76%;--awb-width-medium:33.333333333333%;--awb-order-medium:0;--awb-spacing-right-medium:5.76%;--awb-spacing-left-medium:5.76%;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:1.92%;--awb-margin-bottom-small:40px;--awb-spacing-left-small:1.92%;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-center fusion-content-layout-column\"><div class=\"fusion-image-element \" style=\"text-align:center;--awb-max-width:250px;--awb-caption-title-font-family:var(--h2_typography-font-family);--awb-caption-title-font-weight:var(--h2_typography-font-weight);--awb-caption-title-font-style:var(--h2_typography-font-style);--awb-caption-title-size:var(--h2_typography-font-size);--awb-caption-title-transform:var(--h2_typography-text-transform);--awb-caption-title-line-height:var(--h2_typography-line-height);--awb-caption-title-letter-spacing:var(--h2_typography-letter-spacing);\"><span class=\" fusion-imageframe imageframe-none imageframe-3 hover-type-none\"><img decoding=\"async\" width=\"640\" height=\"640\" title=\"weiss-triclamp-klammer-20260913\" src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/09\/weiss-triclamp-klammer-20260913.png\" data-orig-src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/09\/weiss-triclamp-klammer-20260913.png\" alt class=\"lazyload img-responsive wp-image-4244\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27640%27%20height%3D%27640%27%20viewBox%3D%270%200%20640%20640%27%3E%3Crect%20width%3D%27640%27%20height%3D%27640%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-srcset=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/09\/weiss-triclamp-klammer-20260913-200x200.png 200w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/09\/weiss-triclamp-klammer-20260913-400x400.png 400w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/09\/weiss-triclamp-klammer-20260913-600x600.png 600w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/09\/weiss-triclamp-klammer-20260913.png 640w\" data-sizes=\"auto\" data-orig-sizes=\"(max-width: 800px) 100vw, 400px\" \/><\/span><\/div><\/div><\/div><div class=\"fusion-layout-column fusion_builder_column_inner fusion-builder-nested-column-1 fusion_builder_column_inner_2_3 2_3 fusion-flex-column fusion-flex-align-self-center\" style=\"--awb-padding-left:30px;--awb-padding-left-small:0px;--awb-bg-size:cover;--awb-width-large:66.666666666667%;--awb-spacing-right-large:2.88%;--awb-margin-bottom-large:0px;--awb-spacing-left-large:2.88%;--awb-width-medium:66.666666666667%;--awb-order-medium:0;--awb-spacing-right-medium:2.88%;--awb-spacing-left-medium:2.88%;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:1.92%;--awb-spacing-left-small:1.92%;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div class=\"fusion-title title fusion-title-4 fusion-sep-none fusion-title-text fusion-title-size-three\" style=\"--awb-text-color:var(--awb-color1);--awb-margin-top:20px;--awb-font-size:24px;\"><h3 class=\"fusion-title-heading title-heading-left fusion-responsive-typography-calculated\" style=\"margin:0;font-size:1em;text-transform:capitalize;--fontSize:24;line-height:1.4;\">Clamps<\/h3><\/div><div class=\"fusion-text fusion-text-2\" style=\"--awb-text-color:hsla(var(--awb-color1-h),var(--awb-color1-s),var(--awb-color1-l),calc(var(--awb-color1-a) - 30%));\"><p>Clamps and clamping rings join the matching ferrules with the selected gasket. Special designs and any required component certificates are agreed for your application.<\/p>\n<\/div><div style=\"text-align:left;\"><a class=\"fusion-button button-flat button-medium button-custom fusion-button-default button-2 fusion-button-span-no fusion-button-default-type weiss-config-trigger weiss-inline-cta weiss-norm-din32676 weiss-type-KL\" style=\"--button_accent_color:var(--awb-color1);--button_accent_hover_color:var(--awb-color1);--button_border_hover_color:var(--awb-color1);--button_border_width-top:1px;--button_border_width-right:1px;--button_border_width-bottom:1px;--button_border_width-left:1px;--button_gradient_top_color:transparent;--button_gradient_bottom_color:transparent;--button_gradient_top_color_hover:var(--awb-custom_color_1);--button_gradient_bottom_color_hover:var(--awb-custom_color_1);\" target=\"_self\" href=\"#\" data-toggle=\"modal\" data-target=\".fusion-modal.weiss-fittings-modal\"><span class=\"fusion-button-text awb-button__text awb-button__text--default\">Configure clamp<\/span><i class=\"awb-factoryarrow-right awb-button__icon awb-button__icon--default button-icon-right\" aria-hidden=\"true\"><\/i><\/a><\/div><\/div><\/div><\/div><div class=\"fusion-builder-row fusion-builder-row-inner fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"width:104% !important;max-width:104% !important;margin-left: calc(-4% \/ 2 );margin-right: calc(-4% \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column_inner fusion-builder-nested-column-2 fusion_builder_column_inner_1_1 1_1 fusion-flex-column\" style=\"--awb-padding-top:20px;--awb-padding-bottom:20px;--awb-bg-size:cover;--awb-border-color:hsla(var(--awb-color1-h),var(--awb-color1-s),var(--awb-color1-l),calc(var(--awb-color1-a) - 85%));--awb-border-style:solid;--awb-width-large:100%;--awb-spacing-right-large:1.92%;--awb-margin-bottom-large:0px;--awb-spacing-left-large:1.92%;--awb-width-medium:100%;--awb-order-medium:0;--awb-spacing-right-medium:1.92%;--awb-spacing-left-medium:1.92%;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:1.92%;--awb-spacing-left-small:1.92%;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><\/div><\/div><\/div><div class=\"fusion-builder-row fusion-builder-row-inner fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"width:104% !important;max-width:104% !important;margin-left: calc(-4% \/ 2 );margin-right: calc(-4% \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column_inner fusion-builder-nested-column-3 fusion_builder_column_inner_1_3 1_3 fusion-flex-column fusion-flex-align-self-stretch\" style=\"--awb-bg-size:cover;--awb-border-color:hsla(var(--awb-color1-h),var(--awb-color1-s),var(--awb-color1-l),calc(var(--awb-color1-a) - 85%));--awb-border-top:0px;--awb-border-right:1px;--awb-border-bottom:0px;--awb-border-left:0px;--awb-border-style:solid;--awb-width-large:33.333333333333%;--awb-spacing-right-large:5.76%;--awb-margin-bottom-large:0px;--awb-spacing-left-large:5.76%;--awb-width-medium:33.333333333333%;--awb-order-medium:0;--awb-spacing-right-medium:5.76%;--awb-spacing-left-medium:5.76%;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:1.92%;--awb-margin-bottom-small:40px;--awb-spacing-left-small:1.92%;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-center fusion-content-layout-column\"><div class=\"fusion-image-element \" style=\"text-align:center;--awb-max-width:230px;--awb-caption-title-font-family:var(--h2_typography-font-family);--awb-caption-title-font-weight:var(--h2_typography-font-weight);--awb-caption-title-font-style:var(--h2_typography-font-style);--awb-caption-title-size:var(--h2_typography-font-size);--awb-caption-title-transform:var(--h2_typography-text-transform);--awb-caption-title-line-height:var(--h2_typography-line-height);--awb-caption-title-letter-spacing:var(--h2_typography-letter-spacing);\"><span class=\" fusion-imageframe imageframe-none imageframe-4 hover-type-none\"><img decoding=\"async\" width=\"640\" height=\"640\" title=\"weiss-triclamp-stutzen-20260913\" src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/09\/weiss-triclamp-stutzen-20260913.png\" data-orig-src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/09\/weiss-triclamp-stutzen-20260913.png\" alt class=\"lazyload img-responsive wp-image-4246\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27640%27%20height%3D%27640%27%20viewBox%3D%270%200%20640%20640%27%3E%3Crect%20width%3D%27640%27%20height%3D%27640%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-srcset=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/09\/weiss-triclamp-stutzen-20260913-200x200.png 200w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/09\/weiss-triclamp-stutzen-20260913-400x400.png 400w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/09\/weiss-triclamp-stutzen-20260913-600x600.png 600w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/09\/weiss-triclamp-stutzen-20260913.png 640w\" data-sizes=\"auto\" data-orig-sizes=\"(max-width: 800px) 100vw, 400px\" \/><\/span><\/div><\/div><\/div><div class=\"fusion-layout-column fusion_builder_column_inner fusion-builder-nested-column-4 fusion_builder_column_inner_2_3 2_3 fusion-flex-column fusion-flex-align-self-center\" style=\"--awb-padding-left:30px;--awb-padding-left-small:0px;--awb-bg-size:cover;--awb-width-large:66.666666666667%;--awb-spacing-right-large:2.88%;--awb-margin-bottom-large:0px;--awb-spacing-left-large:2.88%;--awb-width-medium:66.666666666667%;--awb-order-medium:0;--awb-spacing-right-medium:2.88%;--awb-spacing-left-medium:2.88%;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:1.92%;--awb-spacing-left-small:1.92%;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div class=\"fusion-title title fusion-title-5 fusion-sep-none fusion-title-text fusion-title-size-three\" style=\"--awb-text-color:var(--awb-color1);--awb-margin-top:20px;--awb-font-size:24px;\"><h3 class=\"fusion-title-heading title-heading-left fusion-responsive-typography-calculated\" style=\"margin:0;font-size:1em;text-transform:capitalize;--fontSize:24;line-height:1.4;\">Ferrules<\/h3><\/div><div class=\"fusion-text fusion-text-3\" style=\"--awb-text-color:hsla(var(--awb-color1-h),var(--awb-color1-s),var(--awb-color1-l),calc(var(--awb-color1-a) - 30%));\"><p>Tri-Clamp ferrules and tank ferrules in stainless steel: select the connection dimensions, the material and the surface finish your design requires.<\/p>\n<\/div><div style=\"text-align:left;\"><a class=\"fusion-button button-flat button-medium button-custom fusion-button-default button-3 fusion-button-span-no fusion-button-default-type weiss-config-trigger weiss-inline-cta weiss-norm-din32676 weiss-type-TCS\" style=\"--button_accent_color:var(--awb-color1);--button_accent_hover_color:var(--awb-color1);--button_border_hover_color:var(--awb-color1);--button_border_width-top:1px;--button_border_width-right:1px;--button_border_width-bottom:1px;--button_border_width-left:1px;--button_gradient_top_color:transparent;--button_gradient_bottom_color:transparent;--button_gradient_top_color_hover:var(--awb-custom_color_1);--button_gradient_bottom_color_hover:var(--awb-custom_color_1);\" target=\"_self\" href=\"#\" data-toggle=\"modal\" data-target=\".fusion-modal.weiss-fittings-modal\"><span class=\"fusion-button-text awb-button__text awb-button__text--default\">Configure ferrule<\/span><i class=\"awb-factoryarrow-right awb-button__icon awb-button__icon--default button-icon-right\" aria-hidden=\"true\"><\/i><\/a><\/div><\/div><\/div><\/div><div class=\"fusion-builder-row fusion-builder-row-inner fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"width:104% !important;max-width:104% !important;margin-left: calc(-4% \/ 2 );margin-right: calc(-4% \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column_inner fusion-builder-nested-column-5 fusion_builder_column_inner_1_1 1_1 fusion-flex-column\" style=\"--awb-padding-top:20px;--awb-padding-bottom:20px;--awb-bg-size:cover;--awb-border-color:hsla(var(--awb-color1-h),var(--awb-color1-s),var(--awb-color1-l),calc(var(--awb-color1-a) - 85%));--awb-border-style:solid;--awb-width-large:100%;--awb-spacing-right-large:1.92%;--awb-margin-bottom-large:0px;--awb-spacing-left-large:1.92%;--awb-width-medium:100%;--awb-order-medium:0;--awb-spacing-right-medium:1.92%;--awb-spacing-left-medium:1.92%;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:1.92%;--awb-spacing-left-small:1.92%;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><\/div><\/div><\/div><div class=\"fusion-builder-row fusion-builder-row-inner fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"width:104% !important;max-width:104% !important;margin-left: calc(-4% \/ 2 );margin-right: calc(-4% \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column_inner fusion-builder-nested-column-6 fusion_builder_column_inner_1_3 1_3 fusion-flex-column fusion-flex-align-self-stretch\" style=\"--awb-bg-size:cover;--awb-border-color:hsla(var(--awb-color1-h),var(--awb-color1-s),var(--awb-color1-l),calc(var(--awb-color1-a) - 85%));--awb-border-top:0px;--awb-border-right:1px;--awb-border-bottom:0px;--awb-border-left:0px;--awb-border-style:solid;--awb-width-large:33.333333333333%;--awb-spacing-right-large:5.76%;--awb-margin-bottom-large:0px;--awb-spacing-left-large:5.76%;--awb-width-medium:33.333333333333%;--awb-order-medium:0;--awb-spacing-right-medium:5.76%;--awb-spacing-left-medium:5.76%;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:1.92%;--awb-margin-bottom-small:40px;--awb-spacing-left-small:1.92%;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-center fusion-content-layout-column\"><div class=\"fusion-image-element \" style=\"text-align:center;--awb-max-width:250px;--awb-caption-title-font-family:var(--h2_typography-font-family);--awb-caption-title-font-weight:var(--h2_typography-font-weight);--awb-caption-title-font-style:var(--h2_typography-font-style);--awb-caption-title-size:var(--h2_typography-font-size);--awb-caption-title-transform:var(--h2_typography-text-transform);--awb-caption-title-line-height:var(--h2_typography-line-height);--awb-caption-title-letter-spacing:var(--h2_typography-letter-spacing);\"><span class=\" fusion-imageframe imageframe-none imageframe-5 hover-type-none\"><img decoding=\"async\" width=\"640\" height=\"640\" title=\"weiss-triclamp-blinddeckel-20260921\" src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/09\/weiss-triclamp-blinddeckel-20260921.png\" data-orig-src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/09\/weiss-triclamp-blinddeckel-20260921.png\" alt class=\"lazyload img-responsive wp-image-4363\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27640%27%20height%3D%27640%27%20viewBox%3D%270%200%20640%20640%27%3E%3Crect%20width%3D%27640%27%20height%3D%27640%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-srcset=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/09\/weiss-triclamp-blinddeckel-20260921-200x200.png 200w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/09\/weiss-triclamp-blinddeckel-20260921-400x400.png 400w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/09\/weiss-triclamp-blinddeckel-20260921-600x600.png 600w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/09\/weiss-triclamp-blinddeckel-20260921.png 640w\" data-sizes=\"auto\" data-orig-sizes=\"(max-width: 800px) 100vw, 400px\" \/><\/span><\/div><\/div><\/div><div class=\"fusion-layout-column fusion_builder_column_inner fusion-builder-nested-column-7 fusion_builder_column_inner_2_3 2_3 fusion-flex-column fusion-flex-align-self-center\" style=\"--awb-padding-left:30px;--awb-padding-left-small:0px;--awb-bg-size:cover;--awb-width-large:66.666666666667%;--awb-spacing-right-large:2.88%;--awb-margin-bottom-large:0px;--awb-spacing-left-large:2.88%;--awb-width-medium:66.666666666667%;--awb-order-medium:0;--awb-spacing-right-medium:2.88%;--awb-spacing-left-medium:2.88%;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:1.92%;--awb-spacing-left-small:1.92%;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div class=\"fusion-title title fusion-title-6 fusion-sep-none fusion-title-text fusion-title-size-three\" style=\"--awb-text-color:var(--awb-color1);--awb-margin-top:20px;--awb-font-size:24px;\"><h3 class=\"fusion-title-heading title-heading-left fusion-responsive-typography-calculated\" style=\"margin:0;font-size:1em;text-transform:capitalize;--fontSize:24;line-height:1.4;\">Blank caps<\/h3><\/div><div class=\"fusion-text fusion-text-4\" style=\"--awb-text-color:hsla(var(--awb-color1-h),var(--awb-color1-s),var(--awb-color1-l),calc(var(--awb-color1-a) - 30%));\"><p>Blank caps close a clamp connection. They are selected by flange diameter, along with the material and surface finish used for the other Tri-Clamp components.<\/p>\n<\/div><div style=\"text-align:left;\"><a class=\"fusion-button button-flat button-medium button-custom fusion-button-default button-4 fusion-button-span-no fusion-button-default-type weiss-config-trigger weiss-inline-cta weiss-norm-din32676 weiss-type-BD\" style=\"--button_accent_color:var(--awb-color1);--button_accent_hover_color:var(--awb-color1);--button_border_hover_color:var(--awb-color1);--button_border_width-top:1px;--button_border_width-right:1px;--button_border_width-bottom:1px;--button_border_width-left:1px;--button_gradient_top_color:transparent;--button_gradient_bottom_color:transparent;--button_gradient_top_color_hover:var(--awb-custom_color_1);--button_gradient_bottom_color_hover:var(--awb-custom_color_1);\" target=\"_self\" href=\"#\" data-toggle=\"modal\" data-target=\".fusion-modal.weiss-fittings-modal\"><span class=\"fusion-button-text awb-button__text awb-button__text--default\">Configure blank cap<\/span><i class=\"awb-factoryarrow-right awb-button__icon awb-button__icon--default button-icon-right\" aria-hidden=\"true\"><\/i><\/a><\/div><\/div><\/div><\/div><div class=\"fusion-builder-row fusion-builder-row-inner fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"width:104% !important;max-width:104% !important;margin-left: calc(-4% \/ 2 );margin-right: calc(-4% \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column_inner fusion-builder-nested-column-8 fusion_builder_column_inner_1_1 1_1 fusion-flex-column\" style=\"--awb-padding-top:20px;--awb-padding-bottom:20px;--awb-bg-size:cover;--awb-border-color:hsla(var(--awb-color1-h),var(--awb-color1-s),var(--awb-color1-l),calc(var(--awb-color1-a) - 85%));--awb-border-style:solid;--awb-width-large:100%;--awb-spacing-right-large:1.92%;--awb-margin-bottom-large:0px;--awb-spacing-left-large:1.92%;--awb-width-medium:100%;--awb-order-medium:0;--awb-spacing-right-medium:1.92%;--awb-spacing-left-medium:1.92%;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:1.92%;--awb-spacing-left-small:1.92%;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><\/div><\/div><\/div><div class=\"fusion-builder-row fusion-builder-row-inner fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"width:104% !important;max-width:104% !important;margin-left: calc(-4% \/ 2 );margin-right: calc(-4% \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column_inner fusion-builder-nested-column-9 fusion_builder_column_inner_1_3 1_3 fusion-flex-column fusion-flex-align-self-stretch\" style=\"--awb-bg-size:cover;--awb-border-color:hsla(var(--awb-color1-h),var(--awb-color1-s),var(--awb-color1-l),calc(var(--awb-color1-a) - 85%));--awb-border-top:0px;--awb-border-right:1px;--awb-border-bottom:0px;--awb-border-left:0px;--awb-border-style:solid;--awb-width-large:33.333333333333%;--awb-spacing-right-large:5.76%;--awb-margin-bottom-large:0px;--awb-spacing-left-large:5.76%;--awb-width-medium:33.333333333333%;--awb-order-medium:0;--awb-spacing-right-medium:5.76%;--awb-spacing-left-medium:5.76%;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:1.92%;--awb-margin-bottom-small:40px;--awb-spacing-left-small:1.92%;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-center fusion-content-layout-column\"><div class=\"fusion-image-element \" style=\"text-align:center;--awb-max-width:250px;--awb-caption-title-font-family:var(--h2_typography-font-family);--awb-caption-title-font-weight:var(--h2_typography-font-weight);--awb-caption-title-font-style:var(--h2_typography-font-style);--awb-caption-title-size:var(--h2_typography-font-size);--awb-caption-title-transform:var(--h2_typography-text-transform);--awb-caption-title-line-height:var(--h2_typography-line-height);--awb-caption-title-letter-spacing:var(--h2_typography-letter-spacing);\"><span class=\" fusion-imageframe imageframe-none imageframe-6 hover-type-none\"><img decoding=\"async\" width=\"640\" height=\"640\" title=\"weiss-triclamp-dichtung-20260913\" src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/09\/weiss-triclamp-dichtung-20260913.png\" data-orig-src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/09\/weiss-triclamp-dichtung-20260913.png\" alt class=\"lazyload img-responsive wp-image-4250\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27640%27%20height%3D%27640%27%20viewBox%3D%270%200%20640%20640%27%3E%3Crect%20width%3D%27640%27%20height%3D%27640%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-srcset=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/09\/weiss-triclamp-dichtung-20260913-200x200.png 200w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/09\/weiss-triclamp-dichtung-20260913-400x400.png 400w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/09\/weiss-triclamp-dichtung-20260913-600x600.png 600w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/09\/weiss-triclamp-dichtung-20260913.png 640w\" data-sizes=\"auto\" data-orig-sizes=\"(max-width: 800px) 100vw, 400px\" \/><\/span><\/div><\/div><\/div><div class=\"fusion-layout-column fusion_builder_column_inner fusion-builder-nested-column-10 fusion_builder_column_inner_2_3 2_3 fusion-flex-column fusion-flex-align-self-center\" style=\"--awb-padding-left:30px;--awb-padding-left-small:0px;--awb-bg-size:cover;--awb-width-large:66.666666666667%;--awb-spacing-right-large:2.88%;--awb-margin-bottom-large:0px;--awb-spacing-left-large:2.88%;--awb-width-medium:66.666666666667%;--awb-order-medium:0;--awb-spacing-right-medium:2.88%;--awb-spacing-left-medium:2.88%;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:1.92%;--awb-spacing-left-small:1.92%;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div class=\"fusion-title title fusion-title-7 fusion-sep-none fusion-title-text fusion-title-size-three\" style=\"--awb-text-color:var(--awb-color1);--awb-margin-top:20px;--awb-font-size:24px;\"><h3 class=\"fusion-title-heading title-heading-left fusion-responsive-typography-calculated\" style=\"margin:0;font-size:1em;text-transform:capitalize;--fontSize:24;line-height:1.4;\">Gaskets<\/h3><\/div><div class=\"fusion-text fusion-text-5\" style=\"--awb-text-color:hsla(var(--awb-color1-h),var(--awb-color1-s),var(--awb-color1-l),calc(var(--awb-color1-a) - 30%));\"><p>EPDM, silicone, FKM and PTFE are part of the material range. Resistance and the required certificates are matched to medium, temperature and cleaning.<\/p>\n<\/div><div style=\"text-align:left;\"><a class=\"fusion-button button-flat button-medium button-custom fusion-button-default button-5 fusion-button-span-no fusion-button-default-type weiss-config-trigger weiss-inline-cta weiss-norm-din32676 weiss-type-D\" style=\"--button_accent_color:var(--awb-color1);--button_accent_hover_color:var(--awb-color1);--button_border_hover_color:var(--awb-color1);--button_border_width-top:1px;--button_border_width-right:1px;--button_border_width-bottom:1px;--button_border_width-left:1px;--button_gradient_top_color:transparent;--button_gradient_bottom_color:transparent;--button_gradient_top_color_hover:var(--awb-custom_color_1);--button_gradient_bottom_color_hover:var(--awb-custom_color_1);\" target=\"_self\" href=\"#\" data-toggle=\"modal\" data-target=\".fusion-modal.weiss-fittings-modal\"><span class=\"fusion-button-text awb-button__text awb-button__text--default\">Configure gasket<\/span><i class=\"awb-factoryarrow-right awb-button__icon awb-button__icon--default button-icon-right\" aria-hidden=\"true\"><\/i><\/a><\/div><\/div><\/div><\/div><\/div><\/div><\/div><\/div><div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-4 fusion-flex-container has-pattern-background has-mask-background nonhundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"--link_hover_color: hsla(var(--awb-color4-h),var(--awb-color4-s),calc(var(--awb-color4-l) + 20%),var(--awb-color4-a));--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-padding-top:100px;--awb-padding-top-small:35px;--awb-background-color:hsla(var(--awb-color4-h),var(--awb-color4-s),calc(var(--awb-color4-l) - 15%),var(--awb-color4-a));--awb-flex-wrap:wrap;\" ><div class=\"awb-background-pattern\" style=\"background-image:  url(data:image\/svg+xml;utf8,%3Csvg%20width%3D%2280%22%20height%3D%22120%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20fill-rule%3D%22evenodd%22%20clip-rule%3D%22evenodd%22%20d%3D%22M40%200H0v30L40%200zM0%2060v30l40-30v30L0%20120h40V90l40%2030V90L40%2060V30l40%2030V30L40%200v30L0%2060z%22%20fill%3D%22rgba%280%2C0%2C0%2C0.3%29%22%2F%3E%3C%2Fsvg%3E);opacity: 0.2 ;background-size:100%;mix-blend-mode:normal;\"><\/div><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"max-width:1248px;margin-left: calc(-4% \/ 2 );margin-right: calc(-4% \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-5 fusion_builder_column_1_2 1_2 fusion-flex-column fusion-animated\" style=\"--awb-bg-size:cover;--awb-width-large:50%;--awb-spacing-right-large:3.84%;--awb-margin-bottom-large:0px;--awb-spacing-left-large:3.84%;--awb-width-medium:50%;--awb-order-medium:0;--awb-spacing-right-medium:3.84%;--awb-spacing-left-medium:3.84%;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:1.92%;--awb-spacing-left-small:1.92%;\" data-animationType=\"fadeInUp\" data-animationDuration=\"1.0\" data-animationDelay=\"1.0\" data-animationOffset=\"top-into-view\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div class=\"fusion-image-element \" style=\"--awb-caption-title-font-family:var(--h2_typography-font-family);--awb-caption-title-font-weight:var(--h2_typography-font-weight);--awb-caption-title-font-style:var(--h2_typography-font-style);--awb-caption-title-size:var(--h2_typography-font-size);--awb-caption-title-transform:var(--h2_typography-text-transform);--awb-caption-title-line-height:var(--h2_typography-line-height);--awb-caption-title-letter-spacing:var(--h2_typography-letter-spacing);\"><span class=\" fusion-imageframe imageframe-none imageframe-7 hover-type-none\"><img decoding=\"async\" width=\"900\" height=\"1200\" alt=\"Dough mixing vessel with drive and pipe connections\" title=\"weiss-teiganmischbeha\u0308lter-anlage\" src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/09\/weiss-teiganmischbehaelter-anlage.jpg\" data-orig-src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/09\/weiss-teiganmischbehaelter-anlage.jpg\" class=\"lazyload img-responsive wp-image-4318\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27900%27%20height%3D%271200%27%20viewBox%3D%270%200%20900%201200%27%3E%3Crect%20width%3D%27900%27%20height%3D%271200%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-srcset=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/09\/weiss-teiganmischbehaelter-anlage-200x267.jpg 200w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/09\/weiss-teiganmischbehaelter-anlage-400x533.jpg 400w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/09\/weiss-teiganmischbehaelter-anlage-600x800.jpg 600w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/09\/weiss-teiganmischbehaelter-anlage-800x1067.jpg 800w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/09\/weiss-teiganmischbehaelter-anlage.jpg 900w\" data-sizes=\"auto\" data-orig-sizes=\"(max-width: 800px) 100vw, 600px\" \/><\/span><\/div><\/div><\/div><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-6 fusion_builder_column_1_2 1_2 fusion-flex-column fusion-flex-align-self-center\" style=\"--awb-padding-top-medium:0px;--awb-padding-left-medium:40px;--awb-padding-top-small:60px;--awb-padding-left-small:0px;--awb-bg-size:cover;--awb-width-large:50%;--awb-spacing-right-large:3.84%;--awb-margin-bottom-large:0px;--awb-spacing-left-large:3.84%;--awb-width-medium:50%;--awb-order-medium:0;--awb-spacing-right-medium:3.84%;--awb-spacing-left-medium:3.84%;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:1.92%;--awb-spacing-left-small:1.92%;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><ul style=\"--awb-size:17px;--awb-margin-bottom:60px;--awb-iconcolor:var(--awb-color5);--awb-textcolor:var(--awb-color2);--awb-line-height:28.9px;--awb-icon-width:28.9px;--awb-icon-height:28.9px;--awb-icon-margin:11.9px;--awb-content-margin:40.8px;\" class=\"fusion-checklist fusion-checklist-1 fusion-checklist-default type-icons\"><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-factorycheck-bullet\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">Pharmaceuticals and sterile technology: select components to match medium, cleaning and the agreed scope of documentation.<\/div><\/li><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-factorycheck-bullet\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">Biotechnology: connection components for piping and assemblies agreed project by project.<\/div><\/li><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-factorycheck-bullet\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">Food production: match connection dimensions, gasket and surface finish to the plant.<\/div><\/li><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-factorycheck-bullet\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">Ultrapure media: state the required materials, surface finishes and certificates explicitly in your inquiry.<\/div><\/li><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-factorycheck-bullet\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">Aseptic applications: suitability and documentation are checked for the specific design.<\/div><\/li><\/ul><\/div><\/div><\/div><\/div><div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-5 fusion-flex-container has-pattern-background has-mask-background weiss-seo-details nonhundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-padding-top:100px;--awb-padding-bottom:100px;--awb-padding-top-small:28px;--awb-padding-bottom-small:28px;--awb-flex-wrap:wrap;\" ><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"max-width:1248px;margin-left: calc(-4% \/ 2 );margin-right: calc(-4% \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-7 fusion_builder_column_1_1 1_1 fusion-flex-column\" style=\"--awb-bg-size:cover;--awb-width-large:100%;--awb-spacing-right-large:1.92%;--awb-margin-bottom-large:0px;--awb-spacing-left-large:1.92%;--awb-width-medium:100%;--awb-spacing-right-medium:1.92%;--awb-spacing-left-medium:1.92%;--awb-width-small:100%;--awb-spacing-right-small:1.92%;--awb-spacing-left-small:1.92%;\"><div class=\"fusion-column-wrapper fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div class=\"fusion-title title fusion-title-8 fusion-sep-none fusion-title-text fusion-title-size-two\" style=\"--awb-margin-bottom:20px;--awb-font-size:30px;\"><h2 class=\"fusion-title-heading title-heading-left fusion-responsive-typography-calculated\" style=\"margin:0;font-size:1em;--fontSize:30;line-height:1.3;\">Tri-Clamp to DIN 32676: series and connection dimensions<\/h2><\/div><div class=\"fusion-text fusion-text-6\"><p>The clamp components in the Weiss configurator are assigned to DIN 32676. The corresponding surface finishes are described in DIN 11866.<\/p>\n<p>Compare the dimension series and the actual connection dimensions. Similar nominal sizes do not automatically mean matching ferrules, gaskets and clamps.<\/p>\n<p>Please state any additional standard required or deviating dimensions in full in your inquiry. The assignment is verified for the specific design.<\/p>\n<\/div><div class=\"accordian fusion-accordian weiss-masstabellen\" style=\"--awb-border-size:1px;--awb-icon-size:16px;--awb-content-font-size:var(--awb-typography4-font-size);--awb-icon-alignment:left;--awb-hover-color:var(--awb-color2);--awb-border-color:var(--awb-color3);--awb-background-color:var(--awb-color1);--awb-divider-color:var(--awb-color3);--awb-divider-hover-color:var(--awb-color3);--awb-icon-color:var(--awb-color1);--awb-title-color:var(--awb-color8);--awb-content-color:var(--awb-color8);--awb-icon-box-color:var(--awb-color8);--awb-toggle-hover-accent-color:var(--awb-color5);--awb-title-font-family:&quot;Plus Jakarta Sans&quot;;--awb-title-font-weight:700;--awb-title-font-style:normal;--awb-content-font-family:var(--awb-typography4-font-family);--awb-content-font-weight:var(--awb-typography4-font-weight);--awb-content-font-style:var(--awb-typography4-font-style);\"><div class=\"panel-group fusion-toggle-icon-boxed\" id=\"accordion-4343-1\"><div class=\"fusion-panel panel-default panel-4920da0c83bb56eb8 fusion-toggle-has-divider\"><div class=\"panel-heading\"><h3 class=\"panel-title toggle\" id=\"toggle_4920da0c83bb56eb8\"><a aria-expanded=\"false\" aria-controls=\"4920da0c83bb56eb8\" role=\"button\" data-toggle=\"collapse\" data-parent=\"#accordion-4343-1\" data-target=\"#4920da0c83bb56eb8\" href=\"#4920da0c83bb56eb8\"><span class=\"fusion-toggle-icon-wrapper\" aria-hidden=\"true\"><i class=\"fa-fusion-box active-icon awb-icon-minus\" aria-hidden=\"true\"><\/i><i class=\"fa-fusion-box inactive-icon awb-icon-plus\" aria-hidden=\"true\"><\/i><\/span><span class=\"fusion-toggle-heading\">DIN 32676 series A - metric (DN, DIN 11850)<\/span><\/a><\/h3><\/div><div id=\"4920da0c83bb56eb8\" class=\"panel-collapse collapse \" aria-labelledby=\"toggle_4920da0c83bb56eb8\"><div class=\"panel-body toggle-content fusion-clearfix\">\n<div class=\"weiss-tabellen-scroll\" tabindex=\"0\" role=\"region\" aria-label=\"DIN 32676 series A - metric (DN, DIN 11850)\">\n<table class=\"weiss-masstabelle\">\n<caption>Tri-Clamp components to DIN 32676, series A \u2013 metric (DN, DIN 11850)<\/caption>\n<thead>\n<tr>\n<th scope=\"col\">Size<\/th>\n<th scope=\"col\">Tube OD \u2300<\/th>\n<th scope=\"col\">Tube ID \u2300<\/th>\n<th scope=\"col\">Wall thickness<\/th>\n<th scope=\"col\">Clamp \u2300<\/th>\n<th scope=\"col\">Ferrule length l3, short (KK)<\/th>\n<th scope=\"col\">Ferrule length l3, long (KL)<\/th>\n<th scope=\"col\">Assembled length l4, KK<\/th>\n<th scope=\"col\">Assembled length l4, KL<\/th>\n<th scope=\"col\">Blank cap, dimension L<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<th scope=\"row\">DN06<\/th>\n<td>8<\/td>\n<td>6<\/td>\n<td>1<\/td>\n<td>25<\/td>\n<td>12,7<\/td>\n<td>28,6<\/td>\n<td>25,4<\/td>\n<td>57,2<\/td>\n<td>4,75<\/td>\n<\/tr>\n<tr>\n<th scope=\"row\">DN08<\/th>\n<td>10<\/td>\n<td>8<\/td>\n<td>1<\/td>\n<td>25<\/td>\n<td>12,7<\/td>\n<td>28,6<\/td>\n<td>25,4<\/td>\n<td>57,2<\/td>\n<td>4,75<\/td>\n<\/tr>\n<tr>\n<th scope=\"row\">DN10<\/th>\n<td>13<\/td>\n<td>10<\/td>\n<td>1,5<\/td>\n<td>34<\/td>\n<td>18<\/td>\n<td>28,6<\/td>\n<td>37,7<\/td>\n<td>58,9<\/td>\n<td>6,35<\/td>\n<\/tr>\n<tr>\n<th scope=\"row\">DN15<\/th>\n<td>19<\/td>\n<td>16<\/td>\n<td>1,5<\/td>\n<td>34<\/td>\n<td>18<\/td>\n<td>28,6<\/td>\n<td>37,7<\/td>\n<td>58,9<\/td>\n<td>6,35<\/td>\n<\/tr>\n<tr>\n<th scope=\"row\">DN20<\/th>\n<td>23<\/td>\n<td>20<\/td>\n<td>1,5<\/td>\n<td>34<\/td>\n<td>18<\/td>\n<td>28,6<\/td>\n<td>37,7<\/td>\n<td>58,9<\/td>\n<td>6,35<\/td>\n<\/tr>\n<tr>\n<th scope=\"row\">DN25<\/th>\n<td>29<\/td>\n<td>26<\/td>\n<td>1,5<\/td>\n<td>50,5<\/td>\n<td>21,5<\/td>\n<td>36<\/td>\n<td>44,7<\/td>\n<td>73,7<\/td>\n<td>6,35<\/td>\n<\/tr>\n<tr>\n<th scope=\"row\">DN32<\/th>\n<td>35<\/td>\n<td>32<\/td>\n<td>1,5<\/td>\n<td>50,5<\/td>\n<td>21,5<\/td>\n<td>36<\/td>\n<td>44,7<\/td>\n<td>73,7<\/td>\n<td>6,35<\/td>\n<\/tr>\n<tr>\n<th scope=\"row\">DN40<\/th>\n<td>41<\/td>\n<td>38<\/td>\n<td>1,5<\/td>\n<td>50,5<\/td>\n<td>21,5<\/td>\n<td>36<\/td>\n<td>44,7<\/td>\n<td>73,7<\/td>\n<td>6,35<\/td>\n<\/tr>\n<tr>\n<th scope=\"row\">DN50<\/th>\n<td>53<\/td>\n<td>50<\/td>\n<td>1,5<\/td>\n<td>64<\/td>\n<td>28<\/td>\n<td>36<\/td>\n<td>44,7<\/td>\n<td>73,7<\/td>\n<td>6,35<\/td>\n<\/tr>\n<tr>\n<th scope=\"row\">DN65<\/th>\n<td>70<\/td>\n<td>66<\/td>\n<td>2<\/td>\n<td>91<\/td>\n<td>28<\/td>\n<td>48<\/td>\n<td>57,7<\/td>\n<td>97,7<\/td>\n<td>6,35<\/td>\n<\/tr>\n<tr>\n<th scope=\"row\">DN80<\/th>\n<td>85<\/td>\n<td>81<\/td>\n<td>2<\/td>\n<td>106<\/td>\n<td>28<\/td>\n<td>48<\/td>\n<td>57,7<\/td>\n<td>97,7<\/td>\n<td>6,35<\/td>\n<\/tr>\n<tr>\n<th scope=\"row\">DN100<\/th>\n<td>104<\/td>\n<td>100<\/td>\n<td>2<\/td>\n<td>119<\/td>\n<td>28<\/td>\n<td>48<\/td>\n<td>57,7<\/td>\n<td>97,7<\/td>\n<td>8<\/td>\n<\/tr>\n<tr>\n<th scope=\"row\">DN125<\/th>\n<td>129<\/td>\n<td>125<\/td>\n<td>2<\/td>\n<td>155<\/td>\n<td>28<\/td>\n<td>66<\/td>\n<td>57,7<\/td>\n<td>133,7<\/td>\n<td>8<\/td>\n<\/tr>\n<tr>\n<th scope=\"row\">DN150<\/th>\n<td>154<\/td>\n<td>150<\/td>\n<td>2<\/td>\n<td>183<\/td>\n<td>28<\/td>\n<td>66<\/td>\n<td>57,7<\/td>\n<td>133,7<\/td>\n<td>14<\/td>\n<\/tr>\n<tr>\n<th scope=\"row\">DN200<\/th>\n<td>204<\/td>\n<td>200<\/td>\n<td>2<\/td>\n<td>233,5<\/td>\n<td>28<\/td>\n<td>66<\/td>\n<td>57,7<\/td>\n<td>133,7<\/td>\n<td>14<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p class=\"weiss-masshinweis\">Dimensions in mm; size designations according to the series stated. Please inquire separately about designs not listed. l3 is the length of a ferrule, l4 the assembled length. KK denotes the short design, KL the long one.<\/p>\n<\/div><\/div><\/div><div class=\"fusion-panel panel-default panel-1adecc7ffa90db8d9 fusion-toggle-has-divider\"><div class=\"panel-heading\"><h3 class=\"panel-title toggle\" id=\"toggle_1adecc7ffa90db8d9\"><a aria-expanded=\"false\" aria-controls=\"1adecc7ffa90db8d9\" role=\"button\" data-toggle=\"collapse\" data-parent=\"#accordion-4343-1\" data-target=\"#1adecc7ffa90db8d9\" href=\"#1adecc7ffa90db8d9\"><span class=\"fusion-toggle-icon-wrapper\" aria-hidden=\"true\"><i class=\"fa-fusion-box active-icon awb-icon-minus\" aria-hidden=\"true\"><\/i><i class=\"fa-fusion-box inactive-icon awb-icon-plus\" aria-hidden=\"true\"><\/i><\/span><span class=\"fusion-toggle-heading\">DIN 32676 series B - metric ISO (OD, EN ISO 1127)<\/span><\/a><\/h3><\/div><div id=\"1adecc7ffa90db8d9\" class=\"panel-collapse collapse \" aria-labelledby=\"toggle_1adecc7ffa90db8d9\"><div class=\"panel-body toggle-content fusion-clearfix\">\n<div class=\"weiss-tabellen-scroll\" tabindex=\"0\" role=\"region\" aria-label=\"DIN 32676 series B - metric ISO (OD, EN ISO 1127)\">\n<table class=\"weiss-masstabelle\">\n<caption>Tri-Clamp components to DIN 32676, series B \u2013 metric ISO (OD, EN ISO 1127)<\/caption>\n<thead>\n<tr>\n<th scope=\"col\">Size<\/th>\n<th scope=\"col\">Tube OD \u2300<\/th>\n<th scope=\"col\">Tube ID \u2300<\/th>\n<th scope=\"col\">Wall thickness<\/th>\n<th scope=\"col\">Clamp \u2300<\/th>\n<th scope=\"col\">Ferrule length l3, short (KK)<\/th>\n<th scope=\"col\">Ferrule length l3, long (KL)<\/th>\n<th scope=\"col\">Assembled length l4, KK<\/th>\n<th scope=\"col\">Assembled length l4, KL<\/th>\n<th scope=\"col\">Blank cap, dimension L<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<th scope=\"row\">NW 10,2<\/th>\n<td>10,2<\/td>\n<td>7<\/td>\n<td>1,6<\/td>\n<td>25<\/td>\n<td>12,7<\/td>\n<td>28,6<\/td>\n<td>25,4<\/td>\n<td>57,2<\/td>\n<td>4,75<\/td>\n<\/tr>\n<tr>\n<th scope=\"row\">NW 13,5<\/th>\n<td>13,5<\/td>\n<td>10,3<\/td>\n<td>1,6<\/td>\n<td>25<\/td>\n<td>12,7<\/td>\n<td>28,6<\/td>\n<td>25,4<\/td>\n<td>57,2<\/td>\n<td>4,75<\/td>\n<\/tr>\n<tr>\n<th scope=\"row\">NW 17,2<\/th>\n<td>17,2<\/td>\n<td>14<\/td>\n<td>1,6<\/td>\n<td>25<\/td>\n<td>12,7<\/td>\n<td>28,6<\/td>\n<td>25,4<\/td>\n<td>57,2<\/td>\n<td>4,75<\/td>\n<\/tr>\n<tr>\n<th scope=\"row\">NW 21,3<\/th>\n<td>21,3<\/td>\n<td>18,1<\/td>\n<td>1,6<\/td>\n<td>50,5<\/td>\n<td>21,5<\/td>\n<td>36<\/td>\n<td>44,7<\/td>\n<td>73,7<\/td>\n<td>6,35<\/td>\n<\/tr>\n<tr>\n<th scope=\"row\">NW 26,9<\/th>\n<td>26,9<\/td>\n<td>23,7<\/td>\n<td>1,6<\/td>\n<td>50,5<\/td>\n<td>21,5<\/td>\n<td>36<\/td>\n<td>44,7<\/td>\n<td>73,7<\/td>\n<td>6,35<\/td>\n<\/tr>\n<tr>\n<th scope=\"row\">NW 33,7<\/th>\n<td>33,7<\/td>\n<td>29,7<\/td>\n<td>2<\/td>\n<td>50,5<\/td>\n<td>21,5<\/td>\n<td>36<\/td>\n<td>44,7<\/td>\n<td>73,7<\/td>\n<td>6,35<\/td>\n<\/tr>\n<tr>\n<th scope=\"row\">NW 42,4<\/th>\n<td>42,4<\/td>\n<td>38,4<\/td>\n<td>2<\/td>\n<td>64<\/td>\n<td>21,5<\/td>\n<td>36<\/td>\n<td>44,7<\/td>\n<td>73,7<\/td>\n<td>6,35<\/td>\n<\/tr>\n<tr>\n<th scope=\"row\">NW 48,3<\/th>\n<td>48,3<\/td>\n<td>44,3<\/td>\n<td>2<\/td>\n<td>64<\/td>\n<td>21,5<\/td>\n<td>36<\/td>\n<td>44,7<\/td>\n<td>73,7<\/td>\n<td>6,35<\/td>\n<\/tr>\n<tr>\n<th scope=\"row\">NW 60,3<\/th>\n<td>60,3<\/td>\n<td>56,3<\/td>\n<td>2<\/td>\n<td>77,5<\/td>\n<td>28<\/td>\n<td>36<\/td>\n<td>57,7<\/td>\n<td>73,7<\/td>\n<td>6,35<\/td>\n<\/tr>\n<tr>\n<th scope=\"row\">NW 76,1<\/th>\n<td>76,1<\/td>\n<td>72,1<\/td>\n<td>2<\/td>\n<td>91<\/td>\n<td>28<\/td>\n<td>48<\/td>\n<td>57,7<\/td>\n<td>97,7<\/td>\n<td>6,35<\/td>\n<\/tr>\n<tr>\n<th scope=\"row\">NW 88,9<\/th>\n<td>88,9<\/td>\n<td>84,3<\/td>\n<td>2,3<\/td>\n<td>106<\/td>\n<td>28<\/td>\n<td>48<\/td>\n<td>57,7<\/td>\n<td>97,7<\/td>\n<td>6,35<\/td>\n<\/tr>\n<tr>\n<th scope=\"row\">NW 114,3<\/th>\n<td>114,3<\/td>\n<td>109,7<\/td>\n<td>2,3<\/td>\n<td>130<\/td>\n<td>28<\/td>\n<td>48<\/td>\n<td>57,7<\/td>\n<td>97,7<\/td>\n<td>8<\/td>\n<\/tr>\n<tr>\n<th scope=\"row\">NW 139,7<\/th>\n<td>139,7<\/td>\n<td>134,5<\/td>\n<td>2,6<\/td>\n<td>155<\/td>\n<td>28<\/td>\n<td>66<\/td>\n<td>57,7<\/td>\n<td>133,7<\/td>\n<td>8<\/td>\n<\/tr>\n<tr>\n<th scope=\"row\">NW 168,3<\/th>\n<td>168,3<\/td>\n<td>163,1<\/td>\n<td>2,6<\/td>\n<td>183<\/td>\n<td>28<\/td>\n<td>66<\/td>\n<td>57,7<\/td>\n<td>133,7<\/td>\n<td>14<\/td>\n<\/tr>\n<tr>\n<th scope=\"row\">NW 219,1<\/th>\n<td>219,1<\/td>\n<td>213,9<\/td>\n<td>2,6<\/td>\n<td>233,5<\/td>\n<td>28<\/td>\n<td>66<\/td>\n<td>57,7<\/td>\n<td>133,7<\/td>\n<td>14<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p class=\"weiss-masshinweis\">Dimensions in mm; size designations according to the series stated. Please inquire separately about designs not listed. l3 is the length of a ferrule, l4 the assembled length. KK denotes the short design, KL the long one.<\/p>\n<\/div><\/div><\/div><div class=\"fusion-panel panel-default panel-92d0b9fbc348e12b4 fusion-toggle-has-divider\"><div class=\"panel-heading\"><h3 class=\"panel-title toggle\" id=\"toggle_92d0b9fbc348e12b4\"><a aria-expanded=\"false\" aria-controls=\"92d0b9fbc348e12b4\" role=\"button\" data-toggle=\"collapse\" data-parent=\"#accordion-4343-1\" data-target=\"#92d0b9fbc348e12b4\" href=\"#92d0b9fbc348e12b4\"><span class=\"fusion-toggle-icon-wrapper\" aria-hidden=\"true\"><i class=\"fa-fusion-box active-icon awb-icon-minus\" aria-hidden=\"true\"><\/i><i class=\"fa-fusion-box inactive-icon awb-icon-plus\" aria-hidden=\"true\"><\/i><\/span><span class=\"fusion-toggle-heading\">DIN 32676 series C - inch\/OD (close to ASME BPE)<\/span><\/a><\/h3><\/div><div id=\"92d0b9fbc348e12b4\" class=\"panel-collapse collapse \" aria-labelledby=\"toggle_92d0b9fbc348e12b4\"><div class=\"panel-body toggle-content fusion-clearfix\">\n<div class=\"weiss-tabellen-scroll\" tabindex=\"0\" role=\"region\" aria-label=\"DIN 32676 series C - inch\/OD (close to ASME BPE)\">\n<table class=\"weiss-masstabelle\">\n<caption>Tri-Clamp components to DIN 32676, series C \u2013 inch\/OD (close to ASME BPE)<\/caption>\n<thead>\n<tr>\n<th scope=\"col\">Size<\/th>\n<th scope=\"col\">Tube OD \u2300<\/th>\n<th scope=\"col\">Tube ID \u2300<\/th>\n<th scope=\"col\">Wall thickness<\/th>\n<th scope=\"col\">Clamp \u2300<\/th>\n<th scope=\"col\">Ferrule length l3, short (KK)<\/th>\n<th scope=\"col\">Ferrule length l3, long (KL)<\/th>\n<th scope=\"col\">Assembled length l4, KK<\/th>\n<th scope=\"col\">Assembled length l4, KL<\/th>\n<th scope=\"col\">Blank cap, dimension L<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<th scope=\"row\">1\/4\"<\/th>\n<td>6,35<\/td>\n<td>4,57<\/td>\n<td>0,89<\/td>\n<td>25<\/td>\n<td>12,7<\/td>\n<td>28,6<\/td>\n<td>25,4<\/td>\n<td>57,2<\/td>\n<td>4,75<\/td>\n<\/tr>\n<tr>\n<th scope=\"row\">3\/8\"<\/th>\n<td>9,53<\/td>\n<td>7,75<\/td>\n<td>0,89<\/td>\n<td>25<\/td>\n<td>12,7<\/td>\n<td>28,6<\/td>\n<td>25,4<\/td>\n<td>57,2<\/td>\n<td>4,75<\/td>\n<\/tr>\n<tr>\n<th scope=\"row\">1\/2\"<\/th>\n<td>12,7<\/td>\n<td>9,4<\/td>\n<td>1,65<\/td>\n<td>25<\/td>\n<td>12,7<\/td>\n<td>28,6<\/td>\n<td>25,4<\/td>\n<td>57,2<\/td>\n<td>4,75<\/td>\n<\/tr>\n<tr>\n<th scope=\"row\">3\/4\"<\/th>\n<td>19,05<\/td>\n<td>15,75<\/td>\n<td>1,65<\/td>\n<td>25<\/td>\n<td>12,7<\/td>\n<td>28,6<\/td>\n<td>25,4<\/td>\n<td>57,2<\/td>\n<td>4,75<\/td>\n<\/tr>\n<tr>\n<th scope=\"row\">1\"<\/th>\n<td>25,4<\/td>\n<td>22,1<\/td>\n<td>1,65<\/td>\n<td>50,5<\/td>\n<td>21,5<\/td>\n<td>36<\/td>\n<td>43<\/td>\n<td>73,7<\/td>\n<td>6,35<\/td>\n<\/tr>\n<tr>\n<th scope=\"row\">1 1\/2\"<\/th>\n<td>38,1<\/td>\n<td>34,8<\/td>\n<td>1,65<\/td>\n<td>50,5<\/td>\n<td>21,5<\/td>\n<td>36<\/td>\n<td>43<\/td>\n<td>73,7<\/td>\n<td>6,35<\/td>\n<\/tr>\n<tr>\n<th scope=\"row\">2\"<\/th>\n<td>50,8<\/td>\n<td>47,5<\/td>\n<td>1,65<\/td>\n<td>64<\/td>\n<td>21,5<\/td>\n<td>36<\/td>\n<td>43<\/td>\n<td>73,7<\/td>\n<td>6,35<\/td>\n<\/tr>\n<tr>\n<th scope=\"row\">2 1\/2\"<\/th>\n<td>63,5<\/td>\n<td>60,2<\/td>\n<td>1,65<\/td>\n<td>77,5<\/td>\n<td>28<\/td>\n<td>36<\/td>\n<td>56<\/td>\n<td>73,7<\/td>\n<td>6,35<\/td>\n<\/tr>\n<tr>\n<th scope=\"row\">3\"<\/th>\n<td>76,2<\/td>\n<td>72,9<\/td>\n<td>1,65<\/td>\n<td>91<\/td>\n<td>28<\/td>\n<td>48<\/td>\n<td>56<\/td>\n<td>97,7<\/td>\n<td>6,35<\/td>\n<\/tr>\n<tr>\n<th scope=\"row\">4\"<\/th>\n<td>101,6<\/td>\n<td>97,38<\/td>\n<td>2,11<\/td>\n<td>119<\/td>\n<td>28<\/td>\n<td>48<\/td>\n<td>56<\/td>\n<td>97,7<\/td>\n<td>8<\/td>\n<\/tr>\n<tr>\n<th scope=\"row\">6\"<\/th>\n<td>152,4<\/td>\n<td>146,86<\/td>\n<td>2,77<\/td>\n<td>167<\/td>\n<td>28<\/td>\n<td>66<\/td>\n<td>56<\/td>\n<td>133,7<\/td>\n<td>14<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p class=\"weiss-masshinweis\">Dimensions in mm; size designations according to the series stated. Please inquire separately about designs not listed. l3 is the length of a ferrule, l4 the assembled length. KK denotes the short design, KL the long one.<\/p>\n<\/div><\/div><\/div><\/div><\/div><div class=\"fusion-builder-row fusion-builder-row-inner fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"width:104% !important;max-width:104% !important;margin-left: calc(-4% \/ 2 );margin-right: calc(-4% \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column_inner fusion-builder-nested-column-11 fusion_builder_column_inner_1_2 1_2 fusion-flex-column fusion-flex-align-self-flex-start\" style=\"--awb-padding-right:4%;--awb-bg-size:cover;--awb-width-large:50%;--awb-spacing-right-large:3.84%;--awb-margin-bottom-large:0px;--awb-spacing-left-large:3.84%;--awb-width-medium:50%;--awb-order-medium:0;--awb-spacing-right-medium:3.84%;--awb-spacing-left-medium:3.84%;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:1.92%;--awb-spacing-left-small:1.92%;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div class=\"fusion-title title fusion-title-9 fusion-sep-none fusion-title-text fusion-title-size-two\" style=\"--awb-margin-bottom:20px;--awb-font-size:30px;\"><h2 class=\"fusion-title-heading title-heading-left fusion-responsive-typography-calculated\" style=\"margin:0;font-size:1em;--fontSize:30;line-height:1.3;\">Selecting materials and surface finishes<\/h2><\/div><div class=\"fusion-text fusion-text-7\"><p>The stainless steel components shown are offered in 1.4404 and 1.4435. The choice depends on component and application.<\/p>\n<p>H4 denotes a mechanically polished surface, H4o an electropolished one. Required roughness values and further certificates belong in your specification.<\/p>\n<\/div><\/div><\/div><div class=\"fusion-layout-column fusion_builder_column_inner fusion-builder-nested-column-12 fusion_builder_column_inner_1_2 1_2 fusion-flex-column fusion-flex-align-self-flex-start\" style=\"--awb-padding-right:4%;--awb-bg-size:cover;--awb-width-large:50%;--awb-spacing-right-large:3.84%;--awb-margin-bottom-large:0px;--awb-spacing-left-large:3.84%;--awb-width-medium:50%;--awb-order-medium:0;--awb-spacing-right-medium:3.84%;--awb-spacing-left-medium:3.84%;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:1.92%;--awb-spacing-left-small:1.92%;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div class=\"fusion-title title fusion-title-10 fusion-sep-none fusion-title-text fusion-title-size-two\" style=\"--awb-margin-bottom:20px;--awb-font-size:30px;\"><h2 class=\"fusion-title-heading title-heading-left fusion-responsive-typography-calculated\" style=\"margin:0;font-size:1em;--fontSize:30;line-height:1.3;\">Gasket materials and application-related certificates<\/h2><\/div><div class=\"fusion-text fusion-text-8\"><p>The gasket range covers EPDM, silicone\/VMQ, FKM, PTFE and PTFE\/FKM. Medium, temperature, pressure and cleaning concept are decisive.<\/p>\n<p>Corresponding certificates such as FDA and\/or USP Class VI are available for all materials and are standard. Please ask for any further certificates in your inquiry.<\/p>\n<p>Specific suitability and the scope of documentation are agreed for the selected component.<\/p>\n<\/div><\/div><\/div><\/div><\/div><\/div><\/div><\/div><div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-6 fusion-flex-container has-pattern-background has-mask-background nonhundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"--awb-background-position:left top;--awb-background-repeat:repeat-y;--awb-border-color:var(--awb-custom_color_1);--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-padding-top:100px;--awb-padding-bottom:60px;--awb-padding-top-small:35px;--awb-padding-bottom-small:0px;--awb-flex-wrap:wrap;\" ><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"max-width:1248px;margin-left: calc(-4% \/ 2 );margin-right: calc(-4% \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-8 fusion_builder_column_1_1 1_1 fusion-flex-column\" style=\"--awb-bg-size:cover;--awb-width-large:100%;--awb-spacing-right-large:1.92%;--awb-margin-bottom-large:0px;--awb-spacing-left-large:1.92%;--awb-width-medium:100%;--awb-order-medium:0;--awb-spacing-right-medium:1.92%;--awb-spacing-left-medium:1.92%;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:1.92%;--awb-spacing-left-small:1.92%;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div class=\"fusion-title title fusion-title-11 fusion-sep-none fusion-title-text fusion-title-size-two\"><h2 class=\"fusion-title-heading title-heading-left fusion-responsive-typography-calculated\" style=\"margin:0;text-transform:var(--awb-typography1-text-transform);--fontSize:50;line-height:1.3;\">Quality and certificates for your application<\/h2><\/div><div class=\"fusion-title title fusion-title-12 fusion-sep-none fusion-title-text fusion-title-size-two\" style=\"--awb-font-size:var(--awb-custom_typography_1-font-size);\"><h2 class=\"fusion-title-heading title-heading-left fusion-responsive-typography-calculated\" style=\"font-family:var(--awb-custom_typography_1-font-family);font-weight:var(--awb-custom_typography_1-font-weight);font-style:var(--awb-custom_typography_1-font-style);margin:0;font-size:1em;letter-spacing:var(--awb-custom_typography_1-letter-spacing);text-transform:var(--awb-custom_typography_1-text-transform);--fontSize:40;line-height:var(--awb-custom_typography_1-line-height);\">Fabrication and documentation agreed project by project<\/h2><\/div><\/div><\/div><\/div><\/div><div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-7 fusion-flex-container has-pattern-background has-mask-background nonhundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-padding-top:0px;--awb-padding-bottom:100px;--awb-flex-wrap:wrap;\" ><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"max-width:1248px;margin-left: calc(-4% \/ 2 );margin-right: calc(-4% \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-9 fusion_builder_column_2_3 2_3 fusion-flex-column\" style=\"--awb-bg-size:cover;--awb-width-large:66.666666666667%;--awb-spacing-right-large:2.88%;--awb-margin-bottom-large:0px;--awb-spacing-left-large:2.88%;--awb-width-medium:66.666666666667%;--awb-order-medium:0;--awb-spacing-right-medium:2.88%;--awb-spacing-left-medium:2.88%;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:1.92%;--awb-spacing-left-small:1.92%;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div class=\"fusion-text fusion-text-9\"><p>Weiss Apparatebau holds a certificate to AD 2000 HP0 and DIN EN ISO 3834-2 for the stated scope of fabrication.<\/p>\n<p>Material documentation and testing are agreed for your component and the agreed scope of order.<\/p>\n<\/div><ul style=\"--awb-size:17px;--awb-margin-bottom:60px;--awb-iconcolor:var(--awb-color5);--awb-line-height:28.9px;--awb-icon-width:28.9px;--awb-icon-height:28.9px;--awb-icon-margin:11.9px;--awb-content-margin:40.8px;\" class=\"fusion-checklist fusion-checklist-2 fusion-checklist-default type-icons\"><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-factorycheck-bullet\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">AD 2000 HP0: manufacturer qualification within the stated scope.<\/div><\/li><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-factorycheck-bullet\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">DIN EN ISO 3834-2: requirements for welding fabrication.<\/div><\/li><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-factorycheck-bullet\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">Material and inspection certificates: matching the agreed scope of order.<\/div><\/li><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-factorycheck-bullet\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">Traceability: define the requirements before placing the order.<\/div><\/li><\/ul><div class=\"fusion-builder-row fusion-builder-row-inner fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"width:104% !important;max-width:104% !important;margin-left: calc(-4% \/ 2 );margin-right: calc(-4% \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column_inner fusion-builder-nested-column-13 fusion_builder_column_inner_1_1 1_1 fusion-flex-column fusion-no-small-visibility\" style=\"--awb-padding-top:60px;--awb-padding-bottom:60px;--awb-padding-left:60px;--awb-bg-image:linear-gradient(270deg, hsla(var(--awb-color8-h),var(--awb-color8-s),var(--awb-color8-l),calc(var(--awb-color8-a) - 100%)) 0%,var(--awb-color8) 75%);;--awb-bg-position:center top;--awb-bg-size:cover;--awb-width-large:100%;--awb-margin-top-large:0px;--awb-spacing-right-large:1.92%;--awb-margin-bottom-large:40px;--awb-spacing-left-large:1.92%;--awb-width-medium:100%;--awb-order-medium:0;--awb-spacing-right-medium:1.92%;--awb-spacing-left-medium:1.92%;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:1.92%;--awb-spacing-left-small:1.92%;\"><div class=\"fusion-column-wrapper lazyload fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column fusion-column-has-bg-image\" data-bg-url=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/09\/weiss-metallbearbeitung-blech.jpg\" data-bg=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/09\/weiss-metallbearbeitung-blech.jpg\" data-bg-gradient=\"linear-gradient(270deg, hsla(var(--awb-color8-h),var(--awb-color8-s),var(--awb-color8-l),calc(var(--awb-color8-a) - 100%)) 0%,var(--awb-color8) 75%)\"><div class=\"fusion-title title fusion-title-13 fusion-sep-none fusion-title-text fusion-title-size-three\" style=\"--awb-text-color:var(--awb-color1);--awb-margin-right:250px;--awb-margin-bottom:10px;--awb-font-size:24px;\"><h3 class=\"fusion-title-heading title-heading-left fusion-responsive-typography-calculated\" style=\"margin:0;font-size:1em;text-transform:capitalize;--fontSize:24;line-height:1.4;\">Your Tri-Clamp connection, clearly specified<\/h3><\/div><div class=\"fusion-text fusion-text-10 fusion-text-no-margin\" style=\"--awb-font-size:var(--awb-typography4-font-size);--awb-line-height:var(--awb-typography4-line-height);--awb-letter-spacing:var(--awb-typography4-letter-spacing);--awb-text-transform:var(--awb-typography4-text-transform);--awb-text-color:var(--awb-color1);--awb-margin-right:250px;--awb-margin-bottom:10px;\"><p>Select components and design. Add the material and inspection certificates you need to your inquiry.<\/p>\n<\/div><div ><a class=\"fusion-button button-flat fusion-button-default-size button-custom fusion-button-default button-6 fusion-button-default-span fusion-button-default-type weiss-config-trigger weiss-norm-din32676\" style=\"--button_accent_color:var(--awb-color5);--button_border_color:var(--awb-color5);--button_accent_hover_color:var(--awb-color1);--button_border_hover_color:var(--awb-color4);--button_gradient_angle:180deg;--button_gradient_top_color:hsla(var(--awb-color1-h),var(--awb-color1-s),var(--awb-color1-l),calc(var(--awb-color1-a) - 100%));--button_gradient_bottom_color:hsla(var(--awb-color1-h),var(--awb-color1-s),var(--awb-color1-l),calc(var(--awb-color1-a) - 100%));--button_gradient_top_color_hover:hsla(var(--awb-color4-h),var(--awb-color4-s),var(--awb-color4-l),calc(var(--awb-color4-a) - 100%));--button_gradient_bottom_color_hover:hsla(var(--awb-color4-h),var(--awb-color4-s),var(--awb-color4-l),calc(var(--awb-color4-a) - 100%));--button_padding-right:0px;--button_padding-left:0px;\" target=\"_self\" data-hover=\"underline\" href=\"#\" data-toggle=\"modal\" data-target=\".fusion-modal.weiss-fittings-modal\"><span class=\"fusion-button-text awb-button__text awb-button__text--default\">Configure Tri-Clamp<\/span><i class=\"awb-factoryarrow-right awb-button__icon awb-button__icon--default button-icon-right\" aria-hidden=\"true\"><\/i><\/a><\/div><\/div><\/div><\/div><\/div><\/div><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-10 awb-sticky awb-sticky-medium awb-sticky-large fusion_builder_column_1_3 1_3 fusion-flex-column\" style=\"--awb-padding-top:15px;--awb-padding-right:15px;--awb-padding-bottom:15px;--awb-padding-left:15px;--awb-bg-color:rgba(76,0,0,0);--awb-bg-color-hover:rgba(76,0,0,0);--awb-bg-size:cover;--awb-width-large:33.333333333333%;--awb-spacing-right-large:5.76%;--awb-margin-bottom-large:0px;--awb-spacing-left-large:5.76%;--awb-width-medium:33.333333333333%;--awb-order-medium:0;--awb-spacing-right-medium:5.76%;--awb-spacing-left-medium:5.76%;--awb-width-small:100%;--awb-order-small:0;--awb-margin-top-small:0px;--awb-spacing-right-small:1.92%;--awb-spacing-left-small:1.92%;--awb-sticky-offset:160px;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div class=\"fusion-image-element \" style=\"--awb-caption-title-font-family:var(--h2_typography-font-family);--awb-caption-title-font-weight:var(--h2_typography-font-weight);--awb-caption-title-font-style:var(--h2_typography-font-style);--awb-caption-title-size:var(--h2_typography-font-size);--awb-caption-title-transform:var(--h2_typography-text-transform);--awb-caption-title-line-height:var(--h2_typography-line-height);--awb-caption-title-letter-spacing:var(--h2_typography-letter-spacing);\"><span class=\" fusion-imageframe imageframe-dropshadow imageframe-8 hover-type-none\" style=\"-webkit-box-shadow: 8px 8px 12px var(--awb-color7);box-shadow: 8px 8px 12px var(--awb-color7);\"><img decoding=\"async\" width=\"1346\" height=\"1900\" title=\"Zertifikat-AD-2000-HP0-ISO-3834-2\" src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/07\/Zertifikat-AD-2000-HP0-ISO-3834-2.jpg\" data-orig-src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/07\/Zertifikat-AD-2000-HP0-ISO-3834-2.jpg\" alt class=\"lazyload img-responsive wp-image-3895\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%271346%27%20height%3D%271900%27%20viewBox%3D%270%200%201346%201900%27%3E%3Crect%20width%3D%271346%27%20height%3D%271900%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-srcset=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/07\/Zertifikat-AD-2000-HP0-ISO-3834-2-200x282.jpg 200w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/07\/Zertifikat-AD-2000-HP0-ISO-3834-2-400x565.jpg 400w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/07\/Zertifikat-AD-2000-HP0-ISO-3834-2-600x847.jpg 600w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/07\/Zertifikat-AD-2000-HP0-ISO-3834-2-800x1129.jpg 800w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/07\/Zertifikat-AD-2000-HP0-ISO-3834-2-1200x1694.jpg 1200w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/07\/Zertifikat-AD-2000-HP0-ISO-3834-2.jpg 1346w\" data-sizes=\"auto\" data-orig-sizes=\"(max-width: 800px) 100vw, 400px\" \/><\/span><\/div><div class=\"fusion-separator fusion-full-width-sep\" style=\"align-self: center;margin-left: auto;margin-right: auto;margin-bottom:50px;width:100%;\"><\/div><div class=\"fusion-image-element \" style=\"--awb-caption-title-font-family:var(--h2_typography-font-family);--awb-caption-title-font-weight:var(--h2_typography-font-weight);--awb-caption-title-font-style:var(--h2_typography-font-style);--awb-caption-title-size:var(--h2_typography-font-size);--awb-caption-title-transform:var(--h2_typography-text-transform);--awb-caption-title-line-height:var(--h2_typography-line-height);--awb-caption-title-letter-spacing:var(--h2_typography-letter-spacing);\"><span class=\" fusion-imageframe imageframe-dropshadow imageframe-9 hover-type-none\" style=\"-webkit-box-shadow: 8px 8px 12px var(--awb-color7);box-shadow: 8px 8px 12px var(--awb-color7);\"><img decoding=\"async\" width=\"1346\" height=\"1900\" title=\"Zertifikat-System-zur-Ubertragung-der-Werkstoffkennzeichnung-von-Werkstoffen\" src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/05\/Zertifikat-System-zur-Ubertragung-der-Werkstoffkennzeichnung-von-Werkstoffen.jpg\" data-orig-src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/05\/Zertifikat-System-zur-Ubertragung-der-Werkstoffkennzeichnung-von-Werkstoffen.jpg\" alt class=\"lazyload img-responsive wp-image-2889\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%271346%27%20height%3D%271900%27%20viewBox%3D%270%200%201346%201900%27%3E%3Crect%20width%3D%271346%27%20height%3D%271900%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-srcset=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/05\/Zertifikat-System-zur-Ubertragung-der-Werkstoffkennzeichnung-von-Werkstoffen-200x282.jpg 200w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/05\/Zertifikat-System-zur-Ubertragung-der-Werkstoffkennzeichnung-von-Werkstoffen-400x565.jpg 400w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/05\/Zertifikat-System-zur-Ubertragung-der-Werkstoffkennzeichnung-von-Werkstoffen-600x847.jpg 600w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/05\/Zertifikat-System-zur-Ubertragung-der-Werkstoffkennzeichnung-von-Werkstoffen-800x1129.jpg 800w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/05\/Zertifikat-System-zur-Ubertragung-der-Werkstoffkennzeichnung-von-Werkstoffen-1200x1694.jpg 1200w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/05\/Zertifikat-System-zur-Ubertragung-der-Werkstoffkennzeichnung-von-Werkstoffen.jpg 1346w\" data-sizes=\"auto\" data-orig-sizes=\"(max-width: 800px) 100vw, 400px\" \/><\/span><\/div><\/div><\/div><\/div><\/div><div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-8 fusion-flex-container has-pattern-background has-mask-background hundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-padding-right:0px;--awb-padding-left:0px;--awb-background-color:hsla(var(--awb-color4-h),var(--awb-color4-s),calc(var(--awb-color4-l) - 25%),var(--awb-color4-a));--awb-flex-wrap:wrap;\" ><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"width:calc( 100% + 0px ) !important;max-width:calc( 100% + 0px ) !important;margin-left: calc(-0px \/ 2 );margin-right: calc(-0px \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-11 fusion_builder_column_1_2 1_2 fusion-flex-column fusion-flex-align-self-stretch\" style=\"--awb-padding-top-small:0px;--awb-padding-bottom-small:0px;--awb-bg-position:center top;--awb-bg-size:cover;--awb-width-large:50%;--awb-spacing-right-large:0px;--awb-margin-bottom-large:0px;--awb-spacing-left-large:0px;--awb-width-medium:50%;--awb-order-medium:0;--awb-spacing-right-medium:0px;--awb-spacing-left-medium:0px;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:0px;--awb-margin-bottom-small:60px;--awb-spacing-left-small:0px;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div class=\"fusion-image-element \" style=\"text-align:center;--awb-caption-title-font-family:var(--h2_typography-font-family);--awb-caption-title-font-weight:var(--h2_typography-font-weight);--awb-caption-title-font-style:var(--h2_typography-font-style);--awb-caption-title-size:var(--h2_typography-font-size);--awb-caption-title-transform:var(--h2_typography-text-transform);--awb-caption-title-line-height:var(--h2_typography-line-height);--awb-caption-title-letter-spacing:var(--h2_typography-letter-spacing);\"><span class=\" fusion-imageframe imageframe-none imageframe-10 hover-type-none\"><img decoding=\"async\" width=\"1600\" height=\"1326\" alt=\"Three employees discussing a technical drawing at a table\" title=\"weiss-apparatebau-technische-planung\" src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/09\/weiss-apparatebau-technische-planung.jpg\" data-orig-src=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/09\/weiss-apparatebau-technische-planung.jpg\" class=\"lazyload img-responsive wp-image-4278\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%271600%27%20height%3D%271326%27%20viewBox%3D%270%200%201600%201326%27%3E%3Crect%20width%3D%271600%27%20height%3D%271326%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-srcset=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/09\/weiss-apparatebau-technische-planung-200x166.jpg 200w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/09\/weiss-apparatebau-technische-planung-400x332.jpg 400w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/09\/weiss-apparatebau-technische-planung-600x497.jpg 600w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/09\/weiss-apparatebau-technische-planung-800x663.jpg 800w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/09\/weiss-apparatebau-technische-planung-1200x995.jpg 1200w, https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2026\/09\/weiss-apparatebau-technische-planung.jpg 1600w\" data-sizes=\"auto\" data-orig-sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/span><\/div><\/div><\/div><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-12 fusion_builder_column_1_2 1_2 fusion-flex-column fusion-flex-align-self-center\" style=\"--awb-padding-top:80px;--awb-padding-right:18%;--awb-padding-bottom:50px;--awb-padding-left:18%;--awb-padding-top-small:0px;--awb-padding-right-small:25px;--awb-padding-bottom-small:0px;--awb-padding-left-small:25px;--awb-bg-size:cover;--awb-width-large:50%;--awb-spacing-right-large:0px;--awb-margin-bottom-large:0px;--awb-spacing-left-large:0px;--awb-width-medium:50%;--awb-order-medium:0;--awb-spacing-right-medium:0px;--awb-spacing-left-medium:0px;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:0px;--awb-spacing-left-small:0px;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div class=\"fusion-text fusion-text-11\" style=\"--awb-font-size:var(--awb-typography5-font-size);--awb-line-height:var(--awb-typography5-line-height);--awb-letter-spacing:var(--awb-typography5-letter-spacing);--awb-text-transform:var(--awb-typography5-text-transform);--awb-text-color:var(--awb-color5);--awb-text-font-family:var(--awb-typography5-font-family);--awb-text-font-weight:var(--awb-typography5-font-weight);--awb-text-font-style:var(--awb-typography5-font-style);\"><p>Components and certificates to suit your project.<\/p>\n<\/div><div class=\"fusion-title title fusion-title-14 fusion-sep-none fusion-title-text fusion-title-size-two\" style=\"--awb-text-color:var(--awb-color1);--awb-margin-bottom:30px;--awb-margin-bottom-small:40px;\"><h2 class=\"fusion-title-heading title-heading-left fusion-responsive-typography-calculated\" style=\"margin:0;text-transform:var(--awb-typography1-text-transform);--fontSize:50;line-height:1.3;\">Your advantages with Weiss Apparatebau<\/h2><\/div><div class=\"fusion-text fusion-text-12\" style=\"--awb-text-color:var(--awb-color1);\"><p>Weiss combines stainless steel welding and machining under one roof.<\/p>\n<p>For your connection components we agree design, material and documentation on the basis of your technical requirements.<\/p>\n<\/div><ul style=\"--awb-margin-bottom:20px;--awb-iconcolor:hsla(var(--awb-color4-h),var(--awb-color4-s),calc(var(--awb-color4-l) + 20%),var(--awb-color4-a));--awb-textcolor:#ffffff;--awb-line-height:27.2px;--awb-icon-width:27.2px;--awb-icon-height:27.2px;--awb-icon-margin:11.2px;--awb-content-margin:38.4px;\" class=\"fusion-checklist fusion-checklist-3 fusion-checklist-default type-icons\"><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-factorycheck-bullet\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">Designs after technical clarification<\/div><\/li><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-factorycheck-bullet\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">In-house welding and machining<\/div><\/li><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-factorycheck-bullet\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">Material and surface finish selected to suit<\/div><\/li><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-factorycheck-bullet\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">Documentation to the agreed scope<\/div><\/li><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-factorycheck-bullet\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">Inquire about special requirements with a drawing<\/div><\/li><\/ul><div ><a class=\"fusion-button button-flat fusion-button-default-size button-custom fusion-button-default button-7 fusion-button-default-span fusion-button-default-type weiss-config-trigger weiss-norm-din32676 fusion-has-button-gradient\" style=\"--button_accent_color:var(--awb-color1);--button_accent_hover_color:var(--awb-custom_color_1);--button_border_hover_color:var(--awb-custom_color_1);--button_border_width-top:1px;--button_border_width-right:1px;--button_border_width-bottom:1px;--button_border_width-left:1px;--button_gradient_start:92%;--button_gradient_end:92%;--button_gradient_top_color:hsla(var(--awb-color1-h),var(--awb-color1-s),var(--awb-color1-l),calc(var(--awb-color1-a) - 100%));--button_gradient_bottom_color:var(--awb-color5);--button_gradient_top_color_hover:var(--awb-color5);--button_gradient_bottom_color_hover:var(--awb-color5);--button_padding-top:20px;--button_padding-right:36px;--button_padding-bottom:22px;--button_padding-left:36px;--button_margin-bottom:10px;\" target=\"_self\" data-hover=\"bg_slide_left\" href=\"#\" data-toggle=\"modal\" data-target=\".fusion-modal.weiss-fittings-modal\"><span class=\"fusion-button-text awb-button__text awb-button__text--default\">Configure Tri-Clamp<\/span><i class=\"awb-factoryarrow-right awb-button__icon awb-button__icon--default button-icon-right\" aria-hidden=\"true\"><\/i><\/a><\/div><\/div><\/div><\/div><\/div><div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-9 fusion-flex-container has-pattern-background has-mask-background nonhundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-padding-top:100px;--awb-padding-bottom:100px;--awb-padding-top-small:35px;--awb-padding-bottom-small:35px;--awb-background-color:hsla(var(--awb-custom_color_1-h),var(--awb-custom_color_1-s),calc(var(--awb-custom_color_1-l) + 2%),var(--awb-custom_color_1-a));--awb-flex-wrap:wrap;\" ><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-center fusion-flex-content-wrap\" style=\"max-width:1248px;margin-left: calc(-4% \/ 2 );margin-right: calc(-4% \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-13 fusion_builder_column_1_1 1_1 fusion-flex-column\" style=\"--awb-padding-right:20px;--awb-padding-right-small:0px;--awb-bg-size:cover;--awb-width-large:100%;--awb-spacing-right-large:1.92%;--awb-margin-bottom-large:0px;--awb-spacing-left-large:1.92%;--awb-width-medium:100%;--awb-order-medium:0;--awb-spacing-right-medium:1.92%;--awb-spacing-left-medium:1.92%;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:1.92%;--awb-margin-bottom-small:60px;--awb-spacing-left-small:1.92%;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div class=\"fusion-title title fusion-title-15 fusion-sep-none fusion-title-text fusion-title-size-two\"><h2 class=\"fusion-title-heading title-heading-left fusion-responsive-typography-calculated\" style=\"margin:0;text-transform:var(--awb-typography1-text-transform);--fontSize:50;line-height:1.3;\">Frequently asked questions about Tri-Clamp connections<\/h2><\/div><div class=\"fusion-text fusion-text-13 fusion-text-no-margin\" style=\"--awb-margin-bottom:40px;\"><p>Components, materials and certificates for your technical selection.<\/p>\n<\/div><div class=\"accordian fusion-accordian\" style=\"--awb-border-size:1px;--awb-icon-size:16px;--awb-content-font-size:var(--awb-typography4-font-size);--awb-icon-alignment:left;--awb-hover-color:var(--awb-color2);--awb-border-color:var(--awb-custom_color_1);--awb-background-color:var(--awb-color1);--awb-divider-color:var(--awb-color3);--awb-divider-hover-color:var(--awb-color3);--awb-icon-color:var(--awb-color1);--awb-title-color:var(--awb-color8);--awb-content-color:var(--awb-color8);--awb-icon-box-color:var(--awb-color8);--awb-toggle-hover-accent-color:var(--awb-color5);--awb-title-font-family:&quot;Plus Jakarta Sans&quot;;--awb-title-font-weight:700;--awb-title-font-style:normal;--awb-content-font-family:var(--awb-typography4-font-family);--awb-content-font-weight:var(--awb-typography4-font-weight);--awb-content-font-style:var(--awb-typography4-font-style);\"><div class=\"panel-group fusion-toggle-icon-boxed\" id=\"accordion-4343-2\"><div class=\"fusion-panel panel-default panel-8795ed0b1ff122729 fusion-toggle-no-divider fusion-toggle-boxed-mode\"><div class=\"panel-heading\"><h3 class=\"panel-title toggle\" id=\"toggle_8795ed0b1ff122729\"><a aria-expanded=\"false\" aria-controls=\"8795ed0b1ff122729\" role=\"button\" data-toggle=\"collapse\" data-parent=\"#accordion-4343-2\" data-target=\"#8795ed0b1ff122729\" href=\"#8795ed0b1ff122729\"><span class=\"fusion-toggle-icon-wrapper\" aria-hidden=\"true\"><i class=\"fa-fusion-box active-icon awb-icon-minus\" aria-hidden=\"true\"><\/i><i class=\"fa-fusion-box inactive-icon awb-icon-plus\" aria-hidden=\"true\"><\/i><\/span><span class=\"fusion-toggle-heading\">Which components make up a Tri-Clamp connection?<\/span><\/a><\/h3><\/div><div id=\"8795ed0b1ff122729\" class=\"panel-collapse collapse \" aria-labelledby=\"toggle_8795ed0b1ff122729\"><div class=\"panel-body toggle-content fusion-clearfix\">\n<p>A connection consists of matching ferrules, a gasket and a clamp. In the configurator you can select complete connections or individual components. Connection dimensions and design must match.<\/p>\n<\/div><\/div><\/div><div class=\"fusion-panel panel-default panel-d118b69c265b9927b fusion-toggle-no-divider fusion-toggle-boxed-mode\"><div class=\"panel-heading\"><h3 class=\"panel-title toggle\" id=\"toggle_d118b69c265b9927b\"><a aria-expanded=\"false\" aria-controls=\"d118b69c265b9927b\" role=\"button\" data-toggle=\"collapse\" data-parent=\"#accordion-4343-2\" data-target=\"#d118b69c265b9927b\" href=\"#d118b69c265b9927b\"><span class=\"fusion-toggle-icon-wrapper\" aria-hidden=\"true\"><i class=\"fa-fusion-box active-icon awb-icon-minus\" aria-hidden=\"true\"><\/i><i class=\"fa-fusion-box inactive-icon awb-icon-plus\" aria-hidden=\"true\"><\/i><\/span><span class=\"fusion-toggle-heading\">Which standard does the configurator use?<\/span><\/a><\/h3><\/div><div id=\"d118b69c265b9927b\" class=\"panel-collapse collapse \" aria-labelledby=\"toggle_d118b69c265b9927b\"><div class=\"panel-body toggle-content fusion-clearfix\">\n<p>In the Weiss configurator the clamp components are assigned to DIN 32676. Please add the dimension series and connection dimensions. State any special standards or deviating specifications explicitly in your inquiry.<\/p>\n<\/div><\/div><\/div><div class=\"fusion-panel panel-default panel-5a4b8e498fc6a8bec fusion-toggle-no-divider fusion-toggle-boxed-mode\"><div class=\"panel-heading\"><h3 class=\"panel-title toggle\" id=\"toggle_5a4b8e498fc6a8bec\"><a aria-expanded=\"false\" aria-controls=\"5a4b8e498fc6a8bec\" role=\"button\" data-toggle=\"collapse\" data-parent=\"#accordion-4343-2\" data-target=\"#5a4b8e498fc6a8bec\" href=\"#5a4b8e498fc6a8bec\"><span class=\"fusion-toggle-icon-wrapper\" aria-hidden=\"true\"><i class=\"fa-fusion-box active-icon awb-icon-minus\" aria-hidden=\"true\"><\/i><i class=\"fa-fusion-box inactive-icon awb-icon-plus\" aria-hidden=\"true\"><\/i><\/span><span class=\"fusion-toggle-heading\">Which stainless steel materials can I select?<\/span><\/a><\/h3><\/div><div id=\"5a4b8e498fc6a8bec\" class=\"panel-collapse collapse \" aria-labelledby=\"toggle_5a4b8e498fc6a8bec\"><div class=\"panel-body toggle-content fusion-clearfix\">\n<p>The stainless steel components shown are offered in 1.4404 and 1.4435. Which combination suits your application depends among other things on medium, cleaning and the agreed scope of documentation.<\/p>\n<\/div><\/div><\/div><div class=\"fusion-panel panel-default panel-d7fcbe8675cb67095 fusion-toggle-no-divider fusion-toggle-boxed-mode\"><div class=\"panel-heading\"><h3 class=\"panel-title toggle\" id=\"toggle_d7fcbe8675cb67095\"><a aria-expanded=\"false\" aria-controls=\"d7fcbe8675cb67095\" role=\"button\" data-toggle=\"collapse\" data-parent=\"#accordion-4343-2\" data-target=\"#d7fcbe8675cb67095\" href=\"#d7fcbe8675cb67095\"><span class=\"fusion-toggle-icon-wrapper\" aria-hidden=\"true\"><i class=\"fa-fusion-box active-icon awb-icon-minus\" aria-hidden=\"true\"><\/i><i class=\"fa-fusion-box inactive-icon awb-icon-plus\" aria-hidden=\"true\"><\/i><\/span><span class=\"fusion-toggle-heading\">How do I select a suitable gasket?<\/span><\/a><\/h3><\/div><div id=\"d7fcbe8675cb67095\" class=\"panel-collapse collapse \" aria-labelledby=\"toggle_d7fcbe8675cb67095\"><div class=\"panel-body toggle-content fusion-clearfix\">\n<p>Connection size, medium, temperature and cleaning are decisive. The configurator covers EPDM, silicone, FKM and PTFE among others. Material resistance and certificates are agreed for the specific design.<\/p>\n<\/div><\/div><\/div><div class=\"fusion-panel panel-default panel-5e3ba78de091d7e47 fusion-toggle-no-divider fusion-toggle-boxed-mode\"><div class=\"panel-heading\"><h3 class=\"panel-title toggle\" id=\"toggle_5e3ba78de091d7e47\"><a aria-expanded=\"false\" aria-controls=\"5e3ba78de091d7e47\" role=\"button\" data-toggle=\"collapse\" data-parent=\"#accordion-4343-2\" data-target=\"#5e3ba78de091d7e47\" href=\"#5e3ba78de091d7e47\"><span class=\"fusion-toggle-icon-wrapper\" aria-hidden=\"true\"><i class=\"fa-fusion-box active-icon awb-icon-minus\" aria-hidden=\"true\"><\/i><i class=\"fa-fusion-box inactive-icon awb-icon-plus\" aria-hidden=\"true\"><\/i><\/span><span class=\"fusion-toggle-heading\">Which material and inspection certificates are available?<\/span><\/a><\/h3><\/div><div id=\"5e3ba78de091d7e47\" class=\"panel-collapse collapse \" aria-labelledby=\"toggle_5e3ba78de091d7e47\"><div class=\"panel-body toggle-content fusion-clearfix\">\n<p>State the certificates you require in your inquiry. Documentation and traceability are agreed according to component and agreed scope of supply. Not every design automatically includes every certificate.<\/p>\n<\/div><\/div><\/div><div class=\"fusion-panel panel-default panel-6a36bfcae4cf5b7d8 fusion-toggle-no-divider fusion-toggle-boxed-mode\"><div class=\"panel-heading\"><h3 class=\"panel-title toggle\" id=\"toggle_6a36bfcae4cf5b7d8\"><a aria-expanded=\"false\" aria-controls=\"6a36bfcae4cf5b7d8\" role=\"button\" data-toggle=\"collapse\" data-parent=\"#accordion-4343-2\" data-target=\"#6a36bfcae4cf5b7d8\" href=\"#6a36bfcae4cf5b7d8\"><span class=\"fusion-toggle-icon-wrapper\" aria-hidden=\"true\"><i class=\"fa-fusion-box active-icon awb-icon-minus\" aria-hidden=\"true\"><\/i><i class=\"fa-fusion-box inactive-icon awb-icon-plus\" aria-hidden=\"true\"><\/i><\/span><span class=\"fusion-toggle-heading\">Can I inquire about custom designs?<\/span><\/a><\/h3><\/div><div id=\"6a36bfcae4cf5b7d8\" class=\"panel-collapse collapse \" aria-labelledby=\"toggle_6a36bfcae4cf5b7d8\"><div class=\"panel-body toggle-content fusion-clearfix\">\n<p>Add drawing, dimensions, material and quantity to your technical inquiry. Custom designs are reviewed project by project for feasibility and availability.<\/p>\n<\/div><\/div><\/div><div class=\"fusion-panel panel-default panel-70f4f38d514d3d584 fusion-toggle-no-divider fusion-toggle-boxed-mode\"><div class=\"panel-heading\"><h3 class=\"panel-title toggle\" id=\"toggle_70f4f38d514d3d584\"><a aria-expanded=\"false\" aria-controls=\"70f4f38d514d3d584\" role=\"button\" data-toggle=\"collapse\" data-parent=\"#accordion-4343-2\" data-target=\"#70f4f38d514d3d584\" href=\"#70f4f38d514d3d584\"><span class=\"fusion-toggle-icon-wrapper\" aria-hidden=\"true\"><i class=\"fa-fusion-box active-icon awb-icon-minus\" aria-hidden=\"true\"><\/i><i class=\"fa-fusion-box inactive-icon awb-icon-plus\" aria-hidden=\"true\"><\/i><\/span><span class=\"fusion-toggle-heading\">How do I find the right size and dimension series?<\/span><\/a><\/h3><\/div><div id=\"70f4f38d514d3d584\" class=\"panel-collapse collapse \" aria-labelledby=\"toggle_70f4f38d514d3d584\"><div class=\"panel-body toggle-content fusion-clearfix\">\n<p>Alongside the dimension series, please state the actual connection dimensions. Similar nominal sizes are not sufficient for the assignment. For existing piping, the tube outside diameter, the wall thickness and your technical specification help.<\/p>\n<\/div><\/div><\/div><div class=\"fusion-panel panel-default panel-2530a7227d7978e3b fusion-toggle-no-divider fusion-toggle-boxed-mode\"><div class=\"panel-heading\"><h3 class=\"panel-title toggle\" id=\"toggle_2530a7227d7978e3b\"><a aria-expanded=\"false\" aria-controls=\"2530a7227d7978e3b\" role=\"button\" data-toggle=\"collapse\" data-parent=\"#accordion-4343-2\" data-target=\"#2530a7227d7978e3b\" href=\"#2530a7227d7978e3b\"><span class=\"fusion-toggle-icon-wrapper\" aria-hidden=\"true\"><i class=\"fa-fusion-box active-icon awb-icon-minus\" aria-hidden=\"true\"><\/i><i class=\"fa-fusion-box inactive-icon awb-icon-plus\" aria-hidden=\"true\"><\/i><\/span><span class=\"fusion-toggle-heading\">What is the difference between Tri-Clamp connections and weld ends?<\/span><\/a><\/h3><\/div><div id=\"2530a7227d7978e3b\" class=\"panel-collapse collapse \" aria-labelledby=\"toggle_2530a7227d7978e3b\"><div class=\"panel-body toggle-content fusion-clearfix\">\n<p>Tri-Clamp connections form a detachable joint made up of matching ferrules, gasket and clamp. Weld ends are permanently integrated into the piping. Please state the type of connection you need explicitly in your technical inquiry.<\/p>\n<\/div><\/div><\/div><\/div><\/div><div style=\"text-align:left;\"><a class=\"fusion-button button-flat button-medium button-custom fusion-button-default button-8 fusion-button-span-no fusion-button-default-type weiss-config-trigger weiss-inline-cta weiss-norm-din32676\" style=\"--button_accent_color:var(--awb-custom_color_1);--button_border_color:var(--awb-custom_color_1);--button_accent_hover_color:var(--awb-color1);--button_border_hover_color:var(--awb-color1);--button_border_width-top:1px;--button_border_width-right:1px;--button_border_width-bottom:1px;--button_border_width-left:1px;--button_gradient_top_color:transparent;--button_gradient_bottom_color:transparent;--button_gradient_top_color_hover:var(--awb-custom_color_1);--button_gradient_bottom_color_hover:var(--awb-custom_color_1);\" target=\"_self\" href=\"#\" data-toggle=\"modal\" data-target=\".fusion-modal.weiss-fittings-modal\"><span class=\"fusion-button-text awb-button__text awb-button__text--default\">Configure Tri-Clamp<\/span><i class=\"awb-factoryarrow-right awb-button__icon awb-button__icon--default button-icon-right\" aria-hidden=\"true\"><\/i><\/a><\/div><div class=\"fusion-modal modal fade modal-1 weiss-fittings-modal weiss-config-modal\" tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"modal-heading-1\" aria-hidden=\"true\" style=\"--awb-border-color:var(--awb-color3);--awb-background:var(--awb-color1);\"><div class=\"modal-dialog modal-lg\" role=\"document\"><div class=\"modal-content fusion-modal-content\"><div class=\"modal-header\"><button class=\"close\" type=\"button\" data-dismiss=\"modal\" aria-hidden=\"true\" aria-label=\"Close\">&times;<\/button><h3 class=\"modal-title\" id=\"modal-heading-1\" data-dismiss=\"modal\" aria-hidden=\"true\">Project configurator<\/h3><\/div><div class=\"modal-body fusion-clearfix\">\n<p class=\"weiss-config-status\" role=\"status\">Configurator is loading \u2026<\/p>\n<p class=\"weiss-preis-hinweis\" style=\"margin:0 0 14px;padding:12px 14px;background:#fdecec;border-left:4px solid #d60a0a;font-size:14.5px;line-height:1.5;color:#1c1c1c\">Prices are hidden in this view. <a href=\"#weiss-zugang\" data-dismiss=\"modal\" data-bs-dismiss=\"modal\" style=\"color:#4c0000;text-decoration:underline;font-weight:700\">Request access<\/a> and you will receive your password by e-mail.<\/p>\n<!--noptimize-->\n<div class=\"weiss-konfigurator-embed\" style=\"width:100%;max-width:100%;\">\n    <iframe id=\"weiss-konf-9290\"\n            title=\"Project configurator\"\n            loading=\"lazy\"\n            style=\"width:100%;border:0;display:block;min-height:680px;\"><\/iframe>\n<\/div>\n<script>\n(function () {\n    var frame = document.getElementById(\"weiss-konf-9290\");\n    if (!frame) { return; }\n    \/\/ Widget-HTML als base64 setzen (NICHT als srcdoc-Attribut): base64 enthaelt keine\n    \/\/ HTML-Entities und ueberlebt damit jede Content-Verarbeitung (wptexturize\/Optimizer),\n    \/\/ die ein srcdoc-Attribut sonst um eine Escaping-Ebene entschaerft und das Inline-JS\n    \/\/ zerstoert. srcdoc bleibt erhalten -> gleicher Origin wie bisher, kein Verhaltenswechsel.\n    \/\/ Nur EINE base64-Ausgabe. Vorher stand derselbe rund 350 KB grosse String\n    \/\/ zweimal auf der Seite (Haupt- und Fallbackpfad) und blaehte sie unnoetig\n    \/\/ auf ueber ein Megabyte auf. 28.07.2026.\n    var b64 = \"PCFkb2N0eXBlIGh0bWw+CjxodG1sIGxhbmc9ImRlIj4KPGhlYWQ+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xIj4KPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2luZGV4LCBub2ZvbGxvdyI+Cjx0aXRsZT5GaXR0aW5ncy1Lb25maWd1cmF0b3IgwrcgV2Vpc3MgQXBwYXJhdGViYXU8L3RpdGxlPgo8bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iRWRlbHN0YWhsLUh5Z2llbmUtRml0dGluZ3MgbGl2ZSBrb25maWd1cmllcmVuOiBESU4gMzI2NzYgQ2xhbXB2ZXJiaW5kdW5nZW4gdW5kIERJTiAxMTg2NSBGaXR0aW5ncywgbWl0IG1hw59zdMOkYmxpY2hlciBaZWljaG51bmcgdW5kIHRlY2huaXNjaGVyIEFuZnJhZ2UuIj4KPCEtLSBLZWluZSBleHRlcm5lbiBSZXF1ZXN0czogbG9rYWxlIFN5c3RlbS1GYWxsYmFja3Mgc3RlaGVuIGluIHN0eWxlcy5jc3MuIC0tPgo8c3R5bGU+Ci8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqIFdlaXNzIEFwcGFyYXRlYmF1IC0gRml0dGluZ3MtS29uZmlndXJhdG9yICDCtyAgc3R5bGVzLmNzcwogKiBXZWlzcy1DSSwgaGVsbC9tb2Rlcm4taW5kdXN0cmllbGwuIFRhYmxldC1oYXJ0OiBLRUlOIGJhY2tkcm9wLWZpbHRlciBhdWYKICogZml4ZWQvc3RpY2t5LCBrZWluZSBTY3JvbGwtUmV2ZWFsLCBhbGxlcyBzb2ZvcnQgc2ljaHRiYXIsIFRvdWNoID49IDQ0cHguCiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCgo6cm9vdHsKICAtLXJlZDojZDYwYTBhOyAtLXJlZC1kYXJrOiM0YzAwMDA7IC0tcmVkLXRpbnQ6I2ZkZWNlYzsKICAtLWluazojMWMxYzFjOyAtLW11dGVkOiM1NTU7IC0tbXV0ZWQyOiM4YThmOTY7IC0tZmFpbnQ6I2I4YmNjMjsKICAtLWxpbmU6I2U2ZThlYTsgLS1saW5lLXN0cm9uZzojZDdkYmUwOwogIC0tYmc6I2ZmZmZmZjsgLS1zb2Z0OiNmNmY3Zjg7IC0tc29mdDI6I2VlZjFmNDsgLS1zb2Z0MzojZjFmMWYxOwogIC0tb2s6IzFmN2EzZDsgLS1zaGFkb3c6MCAxcHggMnB4IHJnYmEoMjgsMjgsMjgsLjA0KSwwIDhweCAyNHB4IC0xMnB4IHJnYmEoMjgsMjgsMjgsLjE0KTsKICAtLXNoYWRvdy1zbTowIDFweCAycHggcmdiYSgyOCwyOCwyOCwuMDYpOwogIC0tcmFkaXVzOjE0cHg7IC0tcmFkaXVzLXNtOjEwcHg7CiAgLS1mczoxNXB4OyAtLWZmOidQbHVzIEpha2FydGEgU2FucycsJ0t1bWJoIFNhbnMnLHN5c3RlbS11aSwtYXBwbGUtc3lzdGVtLFNlZ29lIFVJLFJvYm90byxzYW5zLXNlcmlmOwogIC8qIFplaWNobnVuZ3MtVmFyaWFibGVuIChFbmdpbmUpICovCiAgLS13ei1ib3JlOiNmNGY2Zjg7IC0td3otZWRnZTojMWMxYzFjOyAtLXd6LWNlbnRlcjojZDYwYTBhOyAtLXd6LWRpbTojOGE4Zjk2OwogIC0td3otZGltdHh0OiNjMjA5MDk7IC0td3otaGF0Y2g6I2FhYjBiNjsgLS13ei1jbGFtcDojY2RkMmQ4OyAtLXd6LW5vdGU6IzhhOGY5NjsKICAtLXd6LWJhZGdlOiNlZWYxZjQ7IC0td3otaW5rOiMxYzFjMWM7CiAgLS13ei1zdGVlbC1hOiNmY2ZkZmU7IC0td3otc3RlZWwtYjojZWVmMWY0OyAtLXd6LXN0ZWVsLWM6I2RlZTNlODsKfQoKKntib3gtc2l6aW5nOmJvcmRlci1ib3h9Cmh0bWwsYm9keXttYXJnaW46MDtwYWRkaW5nOjB9CmJvZHl7CiAgZm9udC1mYW1pbHk6dmFyKC0tZmYpOyBmb250LXNpemU6dmFyKC0tZnMpOyBjb2xvcjp2YXIoLS1pbmspOwogIGJhY2tncm91bmQ6dmFyKC0tYmcpOyBsaW5lLWhlaWdodDoxLjU7CiAgLXdlYmtpdC1mb250LXNtb290aGluZzphbnRpYWxpYXNlZDsgdGV4dC1yZW5kZXJpbmc6b3B0aW1pemVMZWdpYmlsaXR5Owp9CmgxLGgyLGgzLGg0e21hcmdpbjowOyBmb250LXdlaWdodDo3MDA7IGxldHRlci1zcGFjaW5nOi0uMDFlbTsgbGluZS1oZWlnaHQ6MS4yfQpidXR0b257Zm9udC1mYW1pbHk6aW5oZXJpdDsgY3Vyc29yOnBvaW50ZXJ9Ci5tb25ve2ZvbnQtdmFyaWFudC1udW1lcmljOnRhYnVsYXItbnVtczsgZm9udC1mZWF0dXJlLXNldHRpbmdzOiJ0bnVtIiAxfQouaWN7d2lkdGg6MThweDsgaGVpZ2h0OjE4cHg7IGZsZXg6MCAwIGF1dG87IHZlcnRpY2FsLWFsaWduOm1pZGRsZX0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUmFobWVuICovCi5hcHB7bWF4LXdpZHRoOjEyODBweDsgbWFyZ2luOjAgYXV0bzsgcGFkZGluZzowIDIwcHggMjZweH0KCi50b3BiYXJ7CiAgZGlzcGxheTpmbGV4OyBhbGlnbi1pdGVtczpjZW50ZXI7IGp1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuOyBnYXA6MTJweDsKICBwYWRkaW5nOjEycHggMnB4IDEwcHg7Cn0KLmJyYW5ke2Rpc3BsYXk6ZmxleDsgYWxpZ24taXRlbXM6Y2VudGVyOyBnYXA6MTFweH0KLmJyYW5kIC5tYXJre3dpZHRoOjlweDsgaGVpZ2h0OjMwcHg7IGJhY2tncm91bmQ6dmFyKC0tcmVkKTsgYm9yZGVyLXJhZGl1czoycHh9Ci5icmFuZCAubntmb250LXdlaWdodDo4MDA7IGZvbnQtc2l6ZToxOHB4OyBsZXR0ZXItc3BhY2luZzouMDRlbX0KLmJyYW5kIC5ze2Rpc3BsYXk6YmxvY2s7IGZvbnQtc2l6ZTo5LjVweDsgZm9udC13ZWlnaHQ6NzAwOyBsZXR0ZXItc3BhY2luZzouMTRlbTsKICBjb2xvcjp2YXIoLS1tdXRlZDIpOyB0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7IG1hcmdpbi10b3A6MXB4fQovKiAyMi4wOS4yMDI2LCBXdW5zY2ggQmVybmQgTGlua2VyOiBkaWUgUHJlaXNncnVwcGUgbXVzcyBhdWYgZGVuIGVyc3RlbiBCbGljayBsZXNiYXIgc2Vpbi4KICAgVm9yaGVyIDEyIHB4IGdyYXUgaW4gZWluZXIgWmVpbGUgbWl0IGRlbSBOb3JtaGlud2VpcywgamV0enQgYWxzIEV0aWtldHQgaW4gSGF1c3JvdC4gKi8KLnRvcGJhciAuaGludHtmb250LXNpemU6MTNweDsgY29sb3I6dmFyKC0tbXV0ZWQyKTsgbGluZS1oZWlnaHQ6MS43fQoudG9wYmFyIC5oaW50IGJ7ZGlzcGxheTppbmxpbmUtYmxvY2s7IGNvbG9yOiNmZmY7IGJhY2tncm91bmQ6dmFyKC0tcmVkKTsgcGFkZGluZzozcHggOXB4OwogIGJvcmRlci1yYWRpdXM6M3B4OyBmb250LXNpemU6MTJweDsgZm9udC13ZWlnaHQ6ODAwOyBsZXR0ZXItc3BhY2luZzouMDVlbTsKICB0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7IG1hcmdpbi1yaWdodDo1cHh9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZvcnRzY2hyaXR0ICovCi5wcm9ncmVzc3tkaXNwbGF5OmZsZXg7IGdhcDo2cHg7IG92ZXJmbG93LXg6YXV0bzsgcGFkZGluZzoycHggMnB4IDEycHg7IHNjcm9sbGJhci13aWR0aDp0aGlufQoucHN0ZXB7CiAgZmxleDowIDAgYXV0bzsgZGlzcGxheTpmbGV4OyBhbGlnbi1pdGVtczpjZW50ZXI7IGdhcDo4cHg7CiAgcGFkZGluZzo4cHggMTJweDsgYm9yZGVyOjFweCBzb2xpZCB2YXIoLS1saW5lKTsgYm9yZGVyLXJhZGl1czo5OTlweDsKICBiYWNrZ3JvdW5kOnZhcigtLWJnKTsgY29sb3I6dmFyKC0tbXV0ZWQpOyBmb250LXNpemU6MTIuNXB4OyBmb250LXdlaWdodDo2MDA7CiAgbWluLWhlaWdodDo0NHB4OyB3aGl0ZS1zcGFjZTpub3dyYXA7IHRyYW5zaXRpb246Ym9yZGVyLWNvbG9yIC4xOHMsIGNvbG9yIC4xOHMsIGJhY2tncm91bmQgLjE4czsKfQoucHN0ZXAgLm51bXsKICB3aWR0aDoyMHB4OyBoZWlnaHQ6MjBweDsgYm9yZGVyLXJhZGl1czo1MCU7IGRpc3BsYXk6Z3JpZDsgcGxhY2UtaXRlbXM6Y2VudGVyOwogIGJhY2tncm91bmQ6dmFyKC0tc29mdDIpOyBjb2xvcjp2YXIoLS1tdXRlZCk7IGZvbnQtc2l6ZToxMXB4OyBmb250LXdlaWdodDo3MDA7Cn0KLnBzdGVwLmRvbmV7Y29sb3I6dmFyKC0taW5rKX0gLnBzdGVwLmRvbmUgLm51bXtiYWNrZ3JvdW5kOnZhcigtLWluayk7IGNvbG9yOiNmZmZ9Ci5wc3RlcC5hY3RpdmV7Ym9yZGVyLWNvbG9yOnZhcigtLXJlZCk7IGNvbG9yOnZhcigtLXJlZC1kYXJrKTsgYmFja2dyb3VuZDp2YXIoLS1yZWQtdGludCl9Ci5wc3RlcC5hY3RpdmUgLm51bXtiYWNrZ3JvdW5kOnZhcigtLXJlZCk7IGNvbG9yOiNmZmZ9Ci5wc3RlcFtkaXNhYmxlZF17b3BhY2l0eTouNTU7IGN1cnNvcjpub3QtYWxsb3dlZH0KLnBzdGVwOm5vdChbZGlzYWJsZWRdKXtjdXJzb3I6cG9pbnRlcn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR3JpZCAqLwoubGF5b3V0e2Rpc3BsYXk6Z3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjEuMDVmciAuOTVmcjsgZ2FwOjMwcHg7IGFsaWduLWl0ZW1zOnN0YXJ0fQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUGFuZWwgKi8KLnBhbmVse21pbi13aWR0aDowfQouc3RlcC1oZWFke21hcmdpbjoycHggMCA0cHh9Ci5zdGVwLWhlYWQtdG9we2Rpc3BsYXk6ZmxleDsgYWxpZ24taXRlbXM6Y2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjsgZ2FwOjEycHh9Ci5raWNrZXJ7Zm9udC1zaXplOjExLjVweDsgZm9udC13ZWlnaHQ6NzAwOyBsZXR0ZXItc3BhY2luZzouMTJlbTsgdGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlOyBjb2xvcjp2YXIoLS1yZWQpfQovKiBadXJ1ZWNrc2V0emVuLUJ1dHRvbiAoQTUpOiBQaWxsZSByZWNodHMgbmViZW4gZGVtIFNjaHJpdHQtS2lja2VyLCBpbiBqZWRlbSBTY2hyaXR0LgogICBTY2hhcmYgZ2VzY2hhbHRldCAoLmFybWVkKSB3aXJkIGVyIHJvdCAtIGRlciB6d2VpdGUgS2xpY2sgc2V0enQgd2lya2xpY2ggenVydWVjay4gKi8KLnJlc2V0YnRue2ZsZXg6MCAwIGF1dG87IGRpc3BsYXk6aW5saW5lLWZsZXg7IGFsaWduLWl0ZW1zOmNlbnRlcjsgZ2FwOjdweDsKICBtaW4taGVpZ2h0OjQ0cHg7IHBhZGRpbmc6MCAxNHB4OyBib3JkZXI6MXB4IHNvbGlkIHZhcigtLWxpbmUpOyBib3JkZXItcmFkaXVzOjk5OXB4OwogIGJhY2tncm91bmQ6dmFyKC0tYmcpOyBjb2xvcjp2YXIoLS1tdXRlZCk7IGZvbnQtc2l6ZToxMi41cHg7IGZvbnQtd2VpZ2h0OjcwMDsKICB3aGl0ZS1zcGFjZTpub3dyYXA7IHRyYW5zaXRpb246Ym9yZGVyLWNvbG9yIC4xOHMsIGNvbG9yIC4xOHMsIGJhY2tncm91bmQgLjE4c30KLnJlc2V0YnRuOmhvdmVyOm5vdChbZGlzYWJsZWRdKXtib3JkZXItY29sb3I6dmFyKC0tcmVkKTsgY29sb3I6dmFyKC0tcmVkKTsgYmFja2dyb3VuZDp2YXIoLS1yZWQtdGludCl9Ci5yZXNldGJ0bjphY3RpdmU6bm90KFtkaXNhYmxlZF0pe3RyYW5zZm9ybTp0cmFuc2xhdGVZKDFweCl9Ci5yZXNldGJ0bltkaXNhYmxlZF17Y29sb3I6dmFyKC0tZmFpbnQpOyBjdXJzb3I6bm90LWFsbG93ZWR9Ci5yZXNldGJ0bi5hcm1lZHtib3JkZXItY29sb3I6dmFyKC0tcmVkKTsgYmFja2dyb3VuZDp2YXIoLS1yZWQpOyBjb2xvcjojZmZmfQoucmVzZXRidG4gLmlje3dpZHRoOjE1cHg7IGhlaWdodDoxNXB4fQouc3RlcC1oZWFkIGgye2ZvbnQtc2l6ZToyM3B4OyBtYXJnaW4tdG9wOjZweH0KLnN0ZXAtaGVhZCBwe2NvbG9yOnZhcigtLW11dGVkKTsgbWFyZ2luOjdweCAwIDA7IG1heC13aWR0aDo1MmNoOyBmb250LXNpemU6MTRweH0KCi8qIEthY2hlbC1HcmlkIChBbndlbmR1bmcsIE5vcm0sIFR5cCkgKi8KLnRpbGVze2Rpc3BsYXk6Z3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjFmciAxZnI7IGdhcDoxMnB4OyBtYXJnaW4tdG9wOjE2cHh9Ci50aWxlewogIHRleHQtYWxpZ246bGVmdDsgYmFja2dyb3VuZDp2YXIoLS1iZyk7IGJvcmRlcjoxLjVweCBzb2xpZCB2YXIoLS1saW5lKTsKICBib3JkZXItcmFkaXVzOnZhcigtLXJhZGl1cyk7IHBhZGRpbmc6MTZweCAxNnB4IDE1cHg7IG1pbi1oZWlnaHQ6OTZweDsKICBkaXNwbGF5OmZsZXg7IGZsZXgtZGlyZWN0aW9uOmNvbHVtbjsgZ2FwOjZweDsgY29sb3I6dmFyKC0taW5rKTsKICB0cmFuc2l0aW9uOmJvcmRlci1jb2xvciAuMThzLCBib3gtc2hhZG93IC4xOHMsIHRyYW5zZm9ybSAuMTJzOwp9Ci50aWxlOmhvdmVye2JvcmRlci1jb2xvcjp2YXIoLS1saW5lLXN0cm9uZyk7IGJveC1zaGFkb3c6dmFyKC0tc2hhZG93LXNtKX0KLnRpbGU6YWN0aXZle3RyYW5zZm9ybTp0cmFuc2xhdGVZKDFweCl9Ci50aWxlLnNlbHtib3JkZXItY29sb3I6dmFyKC0tcmVkKTsgYm94LXNoYWRvdzowIDAgMCAzcHggdmFyKC0tcmVkLXRpbnQpfQoudGlsZSAuaWN7d2lkdGg6MzBweDsgaGVpZ2h0OjMwcHg7IGNvbG9yOnZhcigtLXJlZCl9Ci50aWxlIC50e2ZvbnQtd2VpZ2h0OjcwMDsgZm9udC1zaXplOjE1LjVweH0KLnRpbGUgLmR7Y29sb3I6dmFyKC0tbXV0ZWQpOyBmb250LXNpemU6MTIuNXB4OyBsaW5lLWhlaWdodDoxLjM1fQoudGlsZSAuYmFkZ2V7YWxpZ24tc2VsZjpmbGV4LXN0YXJ0OyBtYXJnaW4tdG9wOjJweDsgZm9udC1zaXplOjEwLjVweDsgZm9udC13ZWlnaHQ6NzAwOwogIHBhZGRpbmc6MnB4IDhweDsgYm9yZGVyLXJhZGl1czo5OTlweDsgbGV0dGVyLXNwYWNpbmc6LjAyZW19Ci50aWxlIC5iYWRnZS5saXZle2JhY2tncm91bmQ6I2U5ZjZlZTsgY29sb3I6dmFyKC0tb2spfQoudGlsZSAuYmFkZ2UuYW5mcmFnZXtiYWNrZ3JvdW5kOnZhcigtLXNvZnQzKTsgY29sb3I6dmFyKC0tbXV0ZWQpfQoKLyogT3B0aW9ucy1SZWloZSAoV2Vya3N0b2ZmL09iZXJmbGFlY2hlL0RpY2h0dW5nL05hY2h3ZWlzZSkgKi8KLm9wdHN7ZGlzcGxheTpmbGV4OyBmbGV4LXdyYXA6d3JhcDsgZ2FwOjEwcHg7IG1hcmdpbi10b3A6MTRweH0KLm9wdHsKICBmbGV4OjEgMSAxODBweDsgdGV4dC1hbGlnbjpsZWZ0OyBiYWNrZ3JvdW5kOnZhcigtLWJnKTsgYm9yZGVyOjEuNXB4IHNvbGlkIHZhcigtLWxpbmUpOwogIGJvcmRlci1yYWRpdXM6dmFyKC0tcmFkaXVzLXNtKTsgcGFkZGluZzoxMnB4IDE0cHg7IG1pbi1oZWlnaHQ6NTZweDsgY29sb3I6dmFyKC0taW5rKTsKICBkaXNwbGF5OmZsZXg7IGZsZXgtZGlyZWN0aW9uOmNvbHVtbjsgZ2FwOjJweDsgdHJhbnNpdGlvbjpib3JkZXItY29sb3IgLjE4cywgYm94LXNoYWRvdyAuMThzLCB0cmFuc2Zvcm0gLjEyczsKfQoub3B0OmhvdmVye2JvcmRlci1jb2xvcjp2YXIoLS1saW5lLXN0cm9uZyl9Ci5vcHQ6YWN0aXZle3RyYW5zZm9ybTp0cmFuc2xhdGVZKDFweCl9Ci5vcHQuc2Vse2JvcmRlci1jb2xvcjp2YXIoLS1yZWQpOyBib3gtc2hhZG93OjAgMCAwIDNweCB2YXIoLS1yZWQtdGludCl9Ci5vcHQuZGlzYWJsZWR7b3BhY2l0eTouNDI7IGN1cnNvcjpub3QtYWxsb3dlZDsgYmFja2dyb3VuZDp2YXIoLS1zb2Z0KX0KLm9wdCAudHtmb250LXdlaWdodDo3MDA7IGZvbnQtc2l6ZToxNC41cHg7IGRpc3BsYXk6ZmxleDsgYWxpZ24taXRlbXM6Y2VudGVyOyBnYXA6N3B4fQoub3B0IC5ke2NvbG9yOnZhcigtLW11dGVkKTsgZm9udC1zaXplOjEycHg7IGxpbmUtaGVpZ2h0OjEuMzV9Ci5vcHQgLmZsYWd7Zm9udC1zaXplOjEwcHg7IGZvbnQtd2VpZ2h0OjcwMDsgY29sb3I6dmFyKC0tcmVkKTsgYm9yZGVyOjFweCBzb2xpZCB2YXIoLS1yZWQpOwogIGJvcmRlci1yYWRpdXM6NXB4OyBwYWRkaW5nOjAgNXB4OyBtYXJnaW4tbGVmdDphdXRvfQoub3B0IC5sb2Nre2ZvbnQtc2l6ZToxMXB4OyBjb2xvcjp2YXIoLS1tdXRlZDIpfQoKLmZpZWxkLWxhYmVse2ZvbnQtc2l6ZToxMi41cHg7IGZvbnQtd2VpZ2h0OjcwMDsgY29sb3I6dmFyKC0tbXV0ZWQpOyBtYXJnaW46MTZweCAwIDdweDsgZGlzcGxheTpibG9ja30KCi8qIEdyb2Vzc2VuLVNlbGVjdCArIFNlZ21lbnRlZCAqLwoucm93MntkaXNwbGF5OmdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczoxZnIgMWZyOyBnYXA6MTRweH0KLyogQmVybmQgMjcuMDcuMjAyNiAoRGljaHR1bmdlbik6IFN0ZWh0IGluIGRlciBaZWlsZSBudXIgRUlOIEZlbGQgLSB6LiBCLiBkaWUKICogTmVubndlaXRlIGJlaSBEaWNodHVuZywgQmxpbmRkZWNrZWwgb2RlciBLbGFtbWVyIC0sIGJsaWViIGVzIHRyb3R6ZGVtIGF1ZiBkZXIKICogaGFsYmVuIEJyZWl0ZSBzdGVoZW4gdW5kIHNjaG5pdHQgbGFuZ2UgRWludHJhZWdlIGFiICgiRE4yMDAgwrcg4oyAIDIwNCDDlyAyIG1tIMK3CiAqIEtsZW1tLeKMgCAy4oCmIikuIEVpbiBlaW56ZWxuZXMgRmVsZCBuaW1tdCBqZXR6dCBkaWUgdm9sbGUgWmVpbGVuYnJlaXRlLiAqLwoucm93MiA+IDpvbmx5LWNoaWxke2dyaWQtY29sdW1uOjEgLyAtMX0KLnNlbGVjdC13cmFwe3Bvc2l0aW9uOnJlbGF0aXZlfQpzZWxlY3Quc3p7CiAgd2lkdGg6MTAwJTsgbWluLWhlaWdodDo0OHB4OyBwYWRkaW5nOjEycHggNDBweCAxMnB4IDE0cHg7IGZvbnQtc2l6ZToxNXB4OyBmb250LWZhbWlseTppbmhlcml0OwogIGJvcmRlcjoxLjVweCBzb2xpZCB2YXIoLS1saW5lKTsgYm9yZGVyLXJhZGl1czp2YXIoLS1yYWRpdXMtc20pOyBiYWNrZ3JvdW5kOnZhcigtLWJnKTsKICBjb2xvcjp2YXIoLS1pbmspOyBhcHBlYXJhbmNlOm5vbmU7IGN1cnNvcjpwb2ludGVyOwp9CnNlbGVjdC5zejpmb2N1c3tvdXRsaW5lOm5vbmU7IGJvcmRlci1jb2xvcjp2YXIoLS1yZWQpOyBib3gtc2hhZG93OjAgMCAwIDNweCB2YXIoLS1yZWQtdGludCl9Ci5zZWxlY3Qtd3JhcDo6YWZ0ZXJ7Y29udGVudDoiIjsgcG9zaXRpb246YWJzb2x1dGU7IHJpZ2h0OjE1cHg7IHRvcDo1MCU7IHdpZHRoOjlweDsgaGVpZ2h0OjlweDsKICBib3JkZXItcmlnaHQ6MnB4IHNvbGlkIHZhcigtLW11dGVkMik7IGJvcmRlci1ib3R0b206MnB4IHNvbGlkIHZhcigtLW11dGVkMik7CiAgdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTcwJSkgcm90YXRlKDQ1ZGVnKTsgcG9pbnRlci1ldmVudHM6bm9uZX0KCi5zZWd7ZGlzcGxheTppbmxpbmUtZmxleDsgYm9yZGVyOjEuNXB4IHNvbGlkIHZhcigtLWxpbmUpOyBib3JkZXItcmFkaXVzOnZhcigtLXJhZGl1cy1zbSk7IG92ZXJmbG93OmhpZGRlbjsgZmxleC13cmFwOndyYXB9Ci5zZWcgYnV0dG9ue2JhY2tncm91bmQ6dmFyKC0tYmcpOyBib3JkZXI6bm9uZTsgcGFkZGluZzoxMXB4IDE2cHg7IG1pbi1oZWlnaHQ6NDZweDsgZm9udC1zaXplOjEzLjVweDsKICBmb250LXdlaWdodDo2MDA7IGNvbG9yOnZhcigtLW11dGVkKTsgYm9yZGVyLXJpZ2h0OjEuNXB4IHNvbGlkIHZhcigtLWxpbmUpfQouc2VnIGJ1dHRvbjpsYXN0LWNoaWxke2JvcmRlci1yaWdodDpub25lfQouc2VnIGJ1dHRvbi5zZWx7YmFja2dyb3VuZDp2YXIoLS1yZWQpOyBjb2xvcjojZmZmfQoKLyogU3RlcHBlciAoTWVuZ2UpICovCi5zdGVwcGVye2Rpc3BsYXk6aW5saW5lLWZsZXg7IGFsaWduLWl0ZW1zOnN0cmV0Y2g7IGJvcmRlcjoxLjVweCBzb2xpZCB2YXIoLS1saW5lKTsgYm9yZGVyLXJhZGl1czp2YXIoLS1yYWRpdXMtc20pOyBvdmVyZmxvdzpoaWRkZW59Ci5zdGVwcGVyIGJ1dHRvbnt3aWR0aDo0OHB4OyBtaW4taGVpZ2h0OjQ4cHg7IGZvbnQtc2l6ZToyMHB4OyBiYWNrZ3JvdW5kOnZhcigtLXNvZnQpOyBib3JkZXI6bm9uZTsgY29sb3I6dmFyKC0taW5rKX0KLnN0ZXBwZXIgYnV0dG9uOmFjdGl2ZXtiYWNrZ3JvdW5kOnZhcigtLXNvZnQyKX0KLnN0ZXBwZXIgaW5wdXR7d2lkdGg6NzRweDsgdGV4dC1hbGlnbjpjZW50ZXI7IGJvcmRlcjpub25lOyBib3JkZXItbGVmdDoxLjVweCBzb2xpZCB2YXIoLS1saW5lKTsKICBib3JkZXItcmlnaHQ6MS41cHggc29saWQgdmFyKC0tbGluZSk7IGZvbnQtc2l6ZToxNnB4OyBmb250LWZhbWlseTppbmhlcml0OyBmb250LXZhcmlhbnQtbnVtZXJpYzp0YWJ1bGFyLW51bXN9Ci5zdGVwcGVyIGlucHV0OmZvY3Vze291dGxpbmU6bm9uZX0KLnN0YWZmZWx7ZGlzcGxheTpmbGV4OyBmbGV4LXdyYXA6d3JhcDsgZ2FwOjdweDsgbWFyZ2luLXRvcDoxMnB4fQouc3RhZmZlbCAuc3tmb250LXNpemU6MTEuNXB4OyBwYWRkaW5nOjVweCAxMHB4OyBib3JkZXI6MXB4IHNvbGlkIHZhcigtLWxpbmUpOyBib3JkZXItcmFkaXVzOjk5OXB4OyBjb2xvcjp2YXIoLS1tdXRlZCk7IGN1cnNvcjpwb2ludGVyfQouc3RhZmZlbCAucy5vbntib3JkZXItY29sb3I6dmFyKC0tcmVkKTsgY29sb3I6dmFyKC0tcmVkLWRhcmspOyBiYWNrZ3JvdW5kOnZhcigtLXJlZC10aW50KTsgZm9udC13ZWlnaHQ6NzAwfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBWb3JzY2hhdSAqLwoucHJldmlld3twb3NpdGlvbjpzdGlja3k7IHRvcDoxNHB4OyBhbGlnbi1zZWxmOnN0YXJ0fQoucHYtY2FyZHtiYWNrZ3JvdW5kOnZhcigtLWJnKTsgYm9yZGVyOjFweCBzb2xpZCB2YXIoLS1saW5lKTsgYm9yZGVyLXJhZGl1czp2YXIoLS1yYWRpdXMpOwogIGJveC1zaGFkb3c6dmFyKC0tc2hhZG93KTsgb3ZlcmZsb3c6aGlkZGVufQoucHYtaGVhZHtkaXNwbGF5OmZsZXg7IGFsaWduLWl0ZW1zOmNlbnRlcjsganVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47IGdhcDoxMHB4OwogIHBhZGRpbmc6MTBweCAxNHB4IDhweDsgYm9yZGVyLWJvdHRvbToxcHggc29saWQgdmFyKC0tbGluZSl9Ci5wdi1oZWFkIC5sYmx7Zm9udC1zaXplOjExcHg7IGZvbnQtd2VpZ2h0OjcwMDsgbGV0dGVyLXNwYWNpbmc6LjFlbTsgdGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlOyBjb2xvcjp2YXIoLS1tdXRlZDIpfQoucHYtdG9nZ2xle2Rpc3BsYXk6aW5saW5lLWZsZXg7IGJvcmRlcjoxLjVweCBzb2xpZCB2YXIoLS1saW5lKTsgYm9yZGVyLXJhZGl1czo5OTlweDsgb3ZlcmZsb3c6aGlkZGVufQoucHYtdG9nZ2xlIGJ1dHRvbntib3JkZXI6bm9uZTsgYmFja2dyb3VuZDp2YXIoLS1iZyk7IGNvbG9yOnZhcigtLW11dGVkKTsgZm9udC1zaXplOjEyLjVweDsgZm9udC13ZWlnaHQ6NzAwOwogIHBhZGRpbmc6OHB4IDE0cHg7IG1pbi1oZWlnaHQ6NDRweDsgZGlzcGxheTppbmxpbmUtZmxleDsgYWxpZ24taXRlbXM6Y2VudGVyOyBnYXA6NnB4fQoucHYtdG9nZ2xlIGJ1dHRvbiArIGJ1dHRvbntib3JkZXItbGVmdDoxLjVweCBzb2xpZCB2YXIoLS1saW5lKX0KLnB2LXRvZ2dsZSBidXR0b24uc2Vse2JhY2tncm91bmQ6dmFyKC0taW5rKTsgY29sb3I6I2ZmZn0KLnB2LXRvZ2dsZSBidXR0b246YWN0aXZle3RyYW5zZm9ybTp0cmFuc2xhdGVZKDFweCl9Ci5wdi1zdGFnZXtwb3NpdGlvbjpyZWxhdGl2ZTsgYmFja2dyb3VuZDoKICByYWRpYWwtZ3JhZGllbnQoMTIwJSAxMDAlIGF0IDUwJSAwJSwgI2ZiZmNmZCAwJSwgI2YzZjVmNyAxMDAlKTsgcGFkZGluZzo2cHh9Ci5wdi1zdGFnZSAuZHJhd3t3aWR0aDoxMDAlOyBoZWlnaHQ6YXV0bzsgbWF4LWhlaWdodDozMjBweDsgZGlzcGxheTpibG9jazsgbWFyZ2luOjAgYXV0bzsgb3BhY2l0eToxOyB0cmFuc2l0aW9uOm9wYWNpdHkgLjE4cyBlYXNlfQoucHYtc3RhZ2Uuc3dhcCAuZHJhd3tvcGFjaXR5OjB9Ci5wdi1lbXB0eXtkaXNwbGF5OmdyaWQ7IHBsYWNlLWl0ZW1zOmNlbnRlcjsgdGV4dC1hbGlnbjpjZW50ZXI7IGNvbG9yOnZhcigtLW11dGVkMik7CiAgbWluLWhlaWdodDoyMzBweDsgcGFkZGluZzoyNHB4OyBmb250LXNpemU6MTMuNXB4fQoucHYtZW1wdHkgLmlje3dpZHRoOjQ0cHg7IGhlaWdodDo0NHB4OyBtYXJnaW46MCBhdXRvIDEwcHg7IGNvbG9yOnZhcigtLWZhaW50KX0KCi5wdi10eXBlY29kZXtkaXNwbGF5OmZsZXg7IGFsaWduLWl0ZW1zOmNlbnRlcjsgZ2FwOjEwcHg7IHBhZGRpbmc6MTJweCAxNHB4OyBib3JkZXItdG9wOjFweCBzb2xpZCB2YXIoLS1saW5lKX0KLnB2LXR5cGVjb2RlIC5sYmx7Zm9udC1zaXplOjExcHg7IGZvbnQtd2VpZ2h0OjcwMDsgbGV0dGVyLXNwYWNpbmc6LjFlbTsgdGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlOyBjb2xvcjp2YXIoLS1tdXRlZDIpfQoucHYtdHlwZWNvZGUgLmNvZGV7Zm9udC1mYW1pbHk6J0t1bWJoIFNhbnMnLHVpLW1vbm9zcGFjZSxtb25vc3BhY2U7IGZvbnQtd2VpZ2h0OjcwMDsgZm9udC1zaXplOjE0cHg7CiAgbGV0dGVyLXNwYWNpbmc6LjAxZW07IGNvbG9yOnZhcigtLWluayk7IHdvcmQtYnJlYWs6bm9ybWFsOyBvdmVyZmxvdy13cmFwOmFueXdoZXJlfQoucHYtdHlwZWNvZGUgLmNvcHl7bWFyZ2luLWxlZnQ6YXV0bzsgYm9yZGVyOjFweCBzb2xpZCB2YXIoLS1saW5lKTsgYmFja2dyb3VuZDp2YXIoLS1iZyk7IGJvcmRlci1yYWRpdXM6OHB4OwogIG1pbi1oZWlnaHQ6NDRweDsgbWluLXdpZHRoOjQ0cHg7IHBhZGRpbmc6MCAxMHB4OyBmb250LXNpemU6MTJweDsgZm9udC13ZWlnaHQ6NjAwOyBjb2xvcjp2YXIoLS1tdXRlZCk7IGRpc3BsYXk6aW5saW5lLWZsZXg7IGFsaWduLWl0ZW1zOmNlbnRlcjsgZ2FwOjZweH0KLnB2LXR5cGVjb2RlIC5jb3B5OmFjdGl2ZXtiYWNrZ3JvdW5kOnZhcigtLXNvZnQpfQoucHYtdHlwZWNvZGUgLmNvcHkub2t7Y29sb3I6dmFyKC0tb2spOyBib3JkZXItY29sb3I6I2JmZTJjY30KCi5wdi1wcmljZXtkaXNwbGF5OmZsZXg7IGFsaWduLWl0ZW1zOmZsZXgtZW5kOyBqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjsgZ2FwOjEycHg7IHBhZGRpbmc6MTJweCAxNHB4OyBib3JkZXItdG9wOjFweCBzb2xpZCB2YXIoLS1saW5lKTsgYmFja2dyb3VuZDp2YXIoLS1zb2Z0KX0KLnB2LXByaWNlIC5hbXR7Zm9udC1zaXplOjMwcHg7IGZvbnQtd2VpZ2h0OjgwMDsgbGV0dGVyLXNwYWNpbmc6LS4wMmVtOyBmb250LXZhcmlhbnQtbnVtZXJpYzp0YWJ1bGFyLW51bXM7IGxpbmUtaGVpZ2h0OjF9Ci5wdi1wcmljZSAuYW10IC5jdXJ7Zm9udC1zaXplOjE4cHg7IGZvbnQtd2VpZ2h0OjcwMDsgY29sb3I6dmFyKC0tbXV0ZWQpOyBtYXJnaW4tbGVmdDozcHh9Ci5wdi1wcmljZSAuc3Vie2ZvbnQtc2l6ZToxMS41cHg7IGNvbG9yOnZhcigtLW11dGVkKTsgbWFyZ2luLXRvcDo1cHh9Ci5wdi1wcmljZSAuZmxhZ3tkaXNwbGF5OmlubGluZS1ibG9jazsgbWFyZ2luLXRvcDo2cHg7IGZvbnQtc2l6ZToxMC41cHg7IGZvbnQtd2VpZ2h0OjcwMDsgY29sb3I6dmFyKC0tcmVkKTsKICBiYWNrZ3JvdW5kOnZhcigtLXJlZC10aW50KTsgYm9yZGVyLXJhZGl1czo2cHg7IHBhZGRpbmc6MnB4IDdweH0KLnB2LXByaWNlLmFuZnJhZ2UgLmFtdHtmb250LXNpemU6MjJweDsgY29sb3I6dmFyKC0tcmVkLWRhcmspfQoucHYtcHJpY2UgLnRvdGFse3RleHQtYWxpZ246cmlnaHR9Ci5wdi1wcmljZSAudG90YWwgLnR7Zm9udC1zaXplOjExcHg7IGNvbG9yOnZhcigtLW11dGVkMik7IHRleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTsgbGV0dGVyLXNwYWNpbmc6LjA4ZW07IGZvbnQtd2VpZ2h0OjcwMH0KLnB2LXByaWNlIC50b3RhbCAudntmb250LXNpemU6MThweDsgZm9udC13ZWlnaHQ6ODAwOyBmb250LXZhcmlhbnQtbnVtZXJpYzp0YWJ1bGFyLW51bXN9CgoucHYtY2hpcHN7ZGlzcGxheTpmbGV4OyBmbGV4LXdyYXA6d3JhcDsgZ2FwOjZweDsgcGFkZGluZzoxMnB4IDE0cHg7IGJvcmRlci10b3A6MXB4IHNvbGlkIHZhcigtLWxpbmUpfQouY2hpcHtmb250LXNpemU6MTEuNXB4OyBwYWRkaW5nOjVweCAxMHB4OyBib3JkZXItcmFkaXVzOjk5OXB4OyBiYWNrZ3JvdW5kOnZhcigtLXNvZnQyKTsgY29sb3I6dmFyKC0taW5rKTsgZm9udC13ZWlnaHQ6NjAwfQouY2hpcCBie2NvbG9yOnZhcigtLW11dGVkMik7IGZvbnQtd2VpZ2h0OjcwMDsgbWFyZ2luLXJpZ2h0OjRweH0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQWN0aW9uYmFyICovCi5uYXZ7ZGlzcGxheTpmbGV4OyBhbGlnbi1pdGVtczpjZW50ZXI7IGdhcDoxMnB4OyBtYXJnaW4tdG9wOjE2cHh9Ci5idG57bWluLWhlaWdodDo1MnB4OyBwYWRkaW5nOjAgMjJweDsgYm9yZGVyLXJhZGl1czoxMnB4OyBmb250LXNpemU6MTVweDsgZm9udC13ZWlnaHQ6NzAwOwogIGJvcmRlcjoxLjVweCBzb2xpZCB2YXIoLS1saW5lKTsgYmFja2dyb3VuZDp2YXIoLS1iZyk7IGNvbG9yOnZhcigtLWluayk7CiAgZGlzcGxheTppbmxpbmUtZmxleDsgYWxpZ24taXRlbXM6Y2VudGVyOyBnYXA6OHB4OyB0cmFuc2l0aW9uOnRyYW5zZm9ybSAuMTJzLCBib3gtc2hhZG93IC4xOHMsIGJhY2tncm91bmQgLjE4c30KLmJ0bjphY3RpdmV7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMXB4KX0KLmJ0bi5wcmltYXJ5e2JhY2tncm91bmQ6dmFyKC0tcmVkKTsgYm9yZGVyLWNvbG9yOnZhcigtLXJlZCk7IGNvbG9yOiNmZmY7IGJveC1zaGFkb3c6MCA4cHggMjBweCAtMTBweCByZ2JhKDIxNCwxMCwxMCwuNil9Ci5idG4ucHJpbWFyeTpob3ZlcntiYWNrZ3JvdW5kOiNjMDA5MDl9Ci5idG4ucHJpbWFyeVtkaXNhYmxlZF17YmFja2dyb3VuZDp2YXIoLS1mYWludCk7IGJvcmRlci1jb2xvcjp2YXIoLS1mYWludCk7IGJveC1zaGFkb3c6bm9uZTsgY3Vyc29yOm5vdC1hbGxvd2VkfQouYnRuLmdob3N0e2NvbG9yOnZhcigtLW11dGVkKX0KLmJ0bi53aWRle2ZsZXg6MTsganVzdGlmeS1jb250ZW50OmNlbnRlcn0KLmJ0biAuaWN7d2lkdGg6MThweDsgaGVpZ2h0OjE4cHh9CgovKiBXYXJlbmtvcmIgLyBQb3NpdGlvbmVuICovCi5jYXJ0e2JvcmRlcjoxcHggc29saWQgdmFyKC0tbGluZSk7IGJvcmRlci1yYWRpdXM6dmFyKC0tcmFkaXVzKTsgbWFyZ2luLXRvcDoxNnB4OyBvdmVyZmxvdzpoaWRkZW59Ci5jYXJ0IC5jaXtkaXNwbGF5OmZsZXg7IGFsaWduLWl0ZW1zOmNlbnRlcjsgZ2FwOjEycHg7IHBhZGRpbmc6MTJweCAxNHB4OyBib3JkZXItYm90dG9tOjFweCBzb2xpZCB2YXIoLS1saW5lKX0KLmNhcnQgLmNpOmxhc3QtY2hpbGR7Ym9yZGVyLWJvdHRvbTpub25lfQouY2FydCAuY2kgLmNvZGV7Zm9udC1mYW1pbHk6J0t1bWJoIFNhbnMnLG1vbm9zcGFjZTsgZm9udC13ZWlnaHQ6NzAwOyBmb250LXNpemU6MTNweH0KLmNhcnQgLmNpIC5tZXRhe2ZvbnQtc2l6ZToxMnB4OyBjb2xvcjp2YXIoLS1tdXRlZCl9Ci5jYXJ0IC5jaSAucHJ7bWFyZ2luLWxlZnQ6YXV0bzsgZm9udC13ZWlnaHQ6NzAwOyBmb250LXZhcmlhbnQtbnVtZXJpYzp0YWJ1bGFyLW51bXN9Ci5jYXJ0IC5jaSAuZGVse2JvcmRlcjpub25lOyBiYWNrZ3JvdW5kOm5vbmU7IGNvbG9yOnZhcigtLW11dGVkMik7IGZvbnQtc2l6ZToxOHB4OyBwYWRkaW5nOjZweDsgbWluLWhlaWdodDo0MHB4OyBtaW4td2lkdGg6NDBweH0KLmNhcnQgLmNpIC5kZWw6aG92ZXJ7Y29sb3I6dmFyKC0tcmVkKX0KLmNhcnQgLnN1bXtiYWNrZ3JvdW5kOnZhcigtLXNvZnQpOyBib3JkZXItdG9wOjFweCBzb2xpZCB2YXIoLS1saW5lLXN0cm9uZyl9Ci5jYXJ0IC5zcntkaXNwbGF5OmZsZXg7IGFsaWduLWl0ZW1zOmNlbnRlcjsgZ2FwOjEycHg7IHBhZGRpbmc6MTFweCAxNHB4fQouY2FydCAuc3Iub3Blbntmb250LXNpemU6MTIuNXB4OyBjb2xvcjp2YXIoLS1tdXRlZCk7IGJvcmRlci1ib3R0b206MXB4IHNvbGlkIHZhcigtLWxpbmUpfQouY2FydCAuc3Iub3BlbiAuaWN7d2lkdGg6MTZweDsgaGVpZ2h0OjE2cHg7IGZsZXg6MCAwIGF1dG99Ci5jYXJ0IC5zci50b3QgLnR7Zm9udC13ZWlnaHQ6ODAwOyBmb250LXNpemU6MTVweH0KLmNhcnQgLnNyLnRvdCAuc3tmb250LXNpemU6MTJweDsgY29sb3I6dmFyKC0tbXV0ZWQpfQouY2FydCAuc3IudG90IC52e21hcmdpbi1sZWZ0OmF1dG87IGZvbnQtd2VpZ2h0OjgwMDsgZm9udC1zaXplOjE4cHg7IGZvbnQtdmFyaWFudC1udW1lcmljOnRhYnVsYXItbnVtczsgd2hpdGUtc3BhY2U6bm93cmFwfQoubGlua2J0bntiYWNrZ3JvdW5kOm5vbmU7IGJvcmRlcjpub25lOyBjb2xvcjp2YXIoLS1yZWQpOyBmb250LXdlaWdodDo3MDA7IGZvbnQtc2l6ZToxMy41cHg7IHBhZGRpbmc6MTBweCAycHg7IG1pbi1oZWlnaHQ6NDRweH0KCi8qIEZvcm11bGFyIChSRlEpICovCi5mb3Jte2Rpc3BsYXk6Z3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjFmciAxZnI7IGdhcDoxNHB4OyBtYXJnaW4tdG9wOjE4cHh9Ci5mb3JtIC5mbGR7ZGlzcGxheTpmbGV4OyBmbGV4LWRpcmVjdGlvbjpjb2x1bW47IGdhcDo2cHh9Ci5mb3JtIC5mbGQuZnVsbHtncmlkLWNvbHVtbjoxIC8gLTF9Ci5mb3JtIGxhYmVse2ZvbnQtc2l6ZToxMi41cHg7IGZvbnQtd2VpZ2h0OjcwMDsgY29sb3I6dmFyKC0tbXV0ZWQpfQouZm9ybSBsYWJlbCAucmVxe2NvbG9yOnZhcigtLXJlZCl9Ci5mb3JtIGlucHV0LC5mb3JtIHRleHRhcmVhe2ZvbnQtZmFtaWx5OmluaGVyaXQ7IGZvbnQtc2l6ZToxNXB4OyBwYWRkaW5nOjEycHggMTRweDsgbWluLWhlaWdodDo0OHB4OwogIGJvcmRlcjoxLjVweCBzb2xpZCB2YXIoLS1saW5lKTsgYm9yZGVyLXJhZGl1czp2YXIoLS1yYWRpdXMtc20pOyBiYWNrZ3JvdW5kOnZhcigtLWJnKTsgY29sb3I6dmFyKC0taW5rKX0KLmZvcm0gdGV4dGFyZWF7bWluLWhlaWdodDo4NHB4OyByZXNpemU6dmVydGljYWx9Ci5mb3JtIGlucHV0OmZvY3VzLC5mb3JtIHRleHRhcmVhOmZvY3Vze291dGxpbmU6bm9uZTsgYm9yZGVyLWNvbG9yOnZhcigtLXJlZCk7IGJveC1zaGFkb3c6MCAwIDAgM3B4IHZhcigtLXJlZC10aW50KX0KLmZvcm0gLmVycntib3JkZXItY29sb3I6dmFyKC0tcmVkKSFpbXBvcnRhbnR9Ci5mb3JtIC5lcnJtc2d7Zm9udC1zaXplOjEycHg7IGNvbG9yOnZhcigtLXJlZCl9Ci5oZWxwZXJ7Zm9udC1zaXplOjEyLjVweDsgY29sb3I6dmFyKC0tbXV0ZWQpOyBtYXJnaW4tdG9wOjEycHg7IGxpbmUtaGVpZ2h0OjEuNX0KCi5ub3RlLXBsaHtkaXNwbGF5OmZsZXg7IGdhcDo5cHg7IGFsaWduLWl0ZW1zOmZsZXgtc3RhcnQ7IG1hcmdpbi10b3A6MThweDsgcGFkZGluZzoxMnB4IDE0cHg7CiAgYmFja2dyb3VuZDp2YXIoLS1yZWQtdGludCk7IGJvcmRlcjoxcHggc29saWQgI2YzYzljOTsgYm9yZGVyLXJhZGl1czp2YXIoLS1yYWRpdXMtc20pOyBmb250LXNpemU6MTIuNXB4OyBjb2xvcjp2YXIoLS1yZWQtZGFyayl9Ci5ub3RlLXBsaCAuaWN7d2lkdGg6MThweDsgaGVpZ2h0OjE4cHg7IGZsZXg6MCAwIGF1dG87IG1hcmdpbi10b3A6MXB4fQoubm90ZS1va3tkaXNwbGF5OmZsZXg7IGdhcDo5cHg7IGFsaWduLWl0ZW1zOmZsZXgtc3RhcnQ7IG1hcmdpbi10b3A6MTZweDsgcGFkZGluZzoxMnB4IDE0cHg7CiAgYmFja2dyb3VuZDojZjFmNmYyOyBib3JkZXI6MXB4IHNvbGlkICNjZmU2ZDY7IGJvcmRlci1yYWRpdXM6dmFyKC0tcmFkaXVzLXNtKTsgZm9udC1zaXplOjEyLjVweDsgY29sb3I6IzI0NWMzN30KLm5vdGUtb2sgLmlje3dpZHRoOjE4cHg7IGhlaWdodDoxOHB4OyBmbGV4OjAgMCBhdXRvOyBtYXJnaW4tdG9wOjFweDsgY29sb3I6IzJmOGE0ZX0KCi8qIFZvcnNjaGF1LUtvcGY6IFRvZ2dsZSArIFZvbGxiaWxkICovCi5wdi1hY3Rpb25ze2Rpc3BsYXk6ZmxleDsgYWxpZ24taXRlbXM6Y2VudGVyOyBnYXA6OHB4fQoucHYtZnNidG57Ym9yZGVyOjEuNXB4IHNvbGlkIHZhcigtLWxpbmUpOyBiYWNrZ3JvdW5kOnZhcigtLWJnKTsgYm9yZGVyLXJhZGl1czo5OTlweDsKICBtaW4taGVpZ2h0OjQ0cHg7IG1pbi13aWR0aDo0NHB4OyBkaXNwbGF5OmlubGluZS1mbGV4OyBhbGlnbi1pdGVtczpjZW50ZXI7IGp1c3RpZnktY29udGVudDpjZW50ZXI7IGNvbG9yOnZhcigtLW11dGVkKX0KLnB2LWZzYnRuOmhvdmVye2JvcmRlci1jb2xvcjp2YXIoLS1saW5lLXN0cm9uZyk7IGNvbG9yOnZhcigtLWluayl9Ci5wdi1mc2J0bjphY3RpdmV7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMXB4KX0KCi8qIEJlaXNwaWVsLVZvcnNjaGF1IChTY2hyaXR0IDEtMikgKi8KLnB2LXNhbXBsZXtwb3NpdGlvbjpyZWxhdGl2ZX0KLnB2LXNhbXBsZT5zdmd7b3BhY2l0eTouNDJ9Ci5wdi1zYW1wbGUtaGludHtwb3NpdGlvbjphYnNvbHV0ZTsgbGVmdDoxMnB4OyByaWdodDoxMnB4OyBib3R0b206MTJweDsgYmFja2dyb3VuZDp2YXIoLS1iZyk7CiAgYm9yZGVyOjFweCBzb2xpZCB2YXIoLS1saW5lKTsgYm9yZGVyLXJhZGl1czoxMHB4OyBwYWRkaW5nOjEwcHggMTJweDsgZm9udC1zaXplOjEyLjVweDsKICBjb2xvcjp2YXIoLS1tdXRlZCk7IGRpc3BsYXk6ZmxleDsgZ2FwOjlweDsgYWxpZ24taXRlbXM6ZmxleC1zdGFydDsgYm94LXNoYWRvdzp2YXIoLS1zaGFkb3ctc20pfQoucHYtc2FtcGxlLWhpbnQgLmlje21hcmdpbi10b3A6MXB4OyBjb2xvcjp2YXIoLS1yZWQpfQoucHYtc2FtcGxlLWhpbnQgYntjb2xvcjp2YXIoLS1pbmspfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFZvbGxiaWxkICsgWm9vbSAqLwoud3otZnN7cG9zaXRpb246Zml4ZWQ7IGluc2V0OjA7IHotaW5kZXg6MTAwMDsgYmFja2dyb3VuZDojZjRmNmY4OyBkaXNwbGF5OmZsZXg7IGZsZXgtZGlyZWN0aW9uOmNvbHVtbn0KLnd6LWZzW2hpZGRlbl17ZGlzcGxheTpub25lfSAgIC8qIG11c3MgZGFzIGRpc3BsYXk6ZmxleCBvYmVuIHNjaGxhZ2VuLCBzb25zdCBzY2hsaWVzc3QgRVNDL1ggbmljaHQgKi8KLmZzLWJhcntkaXNwbGF5OmZsZXg7IGFsaWduLWl0ZW1zOmNlbnRlcjsgZ2FwOjEycHg7IHBhZGRpbmc6MTBweCAxNHB4OyBiYWNrZ3JvdW5kOnZhcigtLWJnKTsKICBib3JkZXItYm90dG9tOjFweCBzb2xpZCB2YXIoLS1saW5lKTsgZmxleC13cmFwOndyYXB9Ci5mcy1jb2Rle2ZvbnQtZmFtaWx5OidLdW1iaCBTYW5zJyx1aS1tb25vc3BhY2UsbW9ub3NwYWNlOyBmb250LXdlaWdodDo3MDA7IGZvbnQtc2l6ZToxNHB4OyBvdmVyZmxvdy13cmFwOmFueXdoZXJlfQouZnMtaGludHtmb250LXNpemU6MTEuNXB4OyBjb2xvcjp2YXIoLS1tdXRlZDIpOyBtYXJnaW4tbGVmdDphdXRvfQpAbWVkaWEgKG1heC13aWR0aDo5ODBweCl7IC5mcy1oaW50e2Rpc3BsYXk6bm9uZX0gfQouZnMtem9vbXtkaXNwbGF5OmlubGluZS1mbGV4OyBhbGlnbi1pdGVtczpjZW50ZXI7IGdhcDo1cHg7IG1hcmdpbi1sZWZ0OmF1dG99Ci5mcy1oaW50ICsgLmZzLXpvb217bWFyZ2luLWxlZnQ6MTRweH0KLmZzLXpvb20gYnV0dG9ue21pbi13aWR0aDo0MnB4OyBtaW4taGVpZ2h0OjQycHg7IGJvcmRlcjoxLjVweCBzb2xpZCB2YXIoLS1saW5lKTsgYmFja2dyb3VuZDp2YXIoLS1iZyk7CiAgYm9yZGVyLXJhZGl1czoxMHB4OyBmb250LXNpemU6MTVweDsgZm9udC13ZWlnaHQ6NzAwOyBjb2xvcjp2YXIoLS1pbmspfQouZnMtem9vbSBidXR0b246YWN0aXZle3RyYW5zZm9ybTp0cmFuc2xhdGVZKDFweCl9Ci5mcy16b29tIHNwYW57bWluLXdpZHRoOjU0cHg7IHRleHQtYWxpZ246Y2VudGVyOyBmb250LXNpemU6MTIuNXB4OyBjb2xvcjp2YXIoLS1tdXRlZCk7IGZvbnQtdmFyaWFudC1udW1lcmljOnRhYnVsYXItbnVtc30KLmZzLWNsb3Nle21pbi13aWR0aDo0NHB4OyBtaW4taGVpZ2h0OjQ0cHg7IGJvcmRlcjoxLjVweCBzb2xpZCB2YXIoLS1saW5lKTsgYmFja2dyb3VuZDp2YXIoLS1iZyk7CiAgYm9yZGVyLXJhZGl1czoxMnB4OyBjb2xvcjp2YXIoLS1pbmspOyBkaXNwbGF5OmlubGluZS1mbGV4OyBhbGlnbi1pdGVtczpjZW50ZXI7IGp1c3RpZnktY29udGVudDpjZW50ZXJ9Ci5mcy1zdGFnZXtmbGV4OjE7IG92ZXJmbG93OmhpZGRlbjsgdG91Y2gtYWN0aW9uOm5vbmU7IGN1cnNvcjpncmFiOyBkaXNwbGF5OmdyaWQ7IHBsYWNlLWl0ZW1zOmNlbnRlcn0KLmZzLXN0YWdlOmFjdGl2ZXtjdXJzb3I6Z3JhYmJpbmd9Ci5mcy1jYW52YXN7d2lkdGg6bWluKDkydncsMTIwMHB4KTsgd2lsbC1jaGFuZ2U6dHJhbnNmb3JtfQouZnMtY2FudmFzIHN2Z3t3aWR0aDoxMDAlOyBoZWlnaHQ6YXV0bzsgZGlzcGxheTpibG9ja30KCi8qIFNpY2h0YmFyZXIgVGVpbGVuLUZhbGxiYWNrLCBmYWxscyBXZWIgU2hhcmUgQVBJIHVuZCBad2lzY2hlbmFibGFnZSBibG9ja2llcnQgc2luZC4gKi8KLnNoYXJlLWZhbGxiYWNre3Bvc2l0aW9uOmZpeGVkOyBpbnNldDowOyB6LWluZGV4OjEwMDIwOyBkaXNwbGF5OmdyaWQ7IHBsYWNlLWl0ZW1zOmNlbnRlcjsKICBwYWRkaW5nOjE2cHg7IGJhY2tncm91bmQ6cmdiYSgyMCwyNCwyOCwuNTgpfQouc2hhcmUtZmFsbGJhY2tbaGlkZGVuXXtkaXNwbGF5Om5vbmV9Ci5zaGFyZS1mYWxsYmFjay1jYXJke3Bvc2l0aW9uOnJlbGF0aXZlOyB3aWR0aDptaW4oNTYwcHgsMTAwJSk7IHBhZGRpbmc6MjRweDsgYm9yZGVyLXJhZGl1czoxNnB4OwogIGJhY2tncm91bmQ6dmFyKC0tYmcpOyBib3gtc2hhZG93OjAgMjRweCA3MHB4IHJnYmEoMCwwLDAsLjI4KX0KLnNoYXJlLWZhbGxiYWNrLWNhcmQgYntkaXNwbGF5OmJsb2NrOyBmb250LXNpemU6MThweDsgbWFyZ2luLWJvdHRvbTo2cHh9Ci5zaGFyZS1mYWxsYmFjay1jYXJkIHB7bWFyZ2luOjAgMzZweCAxMnB4IDA7IGNvbG9yOnZhcigtLW11dGVkKTsgbGluZS1oZWlnaHQ6MS40NX0KLnNoYXJlLWZhbGxiYWNrLWNhcmQgdGV4dGFyZWF7d2lkdGg6MTAwJTsgbWluLWhlaWdodDoxMzBweDsgcmVzaXplOnZlcnRpY2FsOyBwYWRkaW5nOjEycHg7CiAgYm9yZGVyOjFweCBzb2xpZCB2YXIoLS1saW5lKTsgYm9yZGVyLXJhZGl1czoxMHB4OyBmb250OjEzcHgvMS40NSB2YXIoLS1tb25vKTsgb3ZlcmZsb3ctd3JhcDphbnl3aGVyZX0KLnNoYXJlLWZhbGxiYWNrLWNsb3Nle3Bvc2l0aW9uOmFic29sdXRlOyB0b3A6MTBweDsgcmlnaHQ6MTBweDsgd2lkdGg6NDRweDsgaGVpZ2h0OjQ0cHg7CiAgYm9yZGVyOjFweCBzb2xpZCB2YXIoLS1saW5lKTsgYm9yZGVyLXJhZGl1czoxMHB4OyBiYWNrZ3JvdW5kOnZhcigtLWJnKTsgZm9udC1zaXplOjI0cHh9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUGxhbnNraXp6ZSAvIERhdGVuYmxhdHQgKERydWNrKSAqLwojd3otZHN7ZGlzcGxheTpub25lOyBmb250LWZhbWlseTp2YXIoLS1mZik7IGNvbG9yOnZhcigtLWluayk7IGJhY2tncm91bmQ6I2ZmZn0KYm9keS53ei1wcmludGluZyAjd3otZHN7ZGlzcGxheTpibG9jazsgbWF4LXdpZHRoOjgyMHB4OyBtYXJnaW46MCBhdXRvOyBwYWRkaW5nOjE2cHh9Ci5kcy1oZWFke2Rpc3BsYXk6ZmxleDsganVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47IGFsaWduLWl0ZW1zOmZsZXgtc3RhcnQ7CiAgYm9yZGVyLWJvdHRvbToycHggc29saWQgdmFyKC0tcmVkKTsgcGFkZGluZy1ib3R0b206OHB4OyBtYXJnaW4tYm90dG9tOjEwcHh9Ci5kcy1icmFuZHtkaXNwbGF5OmZsZXg7IGdhcDo5cHg7IGFsaWduLWl0ZW1zOmNlbnRlcn0KLmRzLWJyYW5kIC5tYXJre3dpZHRoOjhweDsgaGVpZ2h0OjI2cHg7IGJhY2tncm91bmQ6dmFyKC0tcmVkKTsgYm9yZGVyLXJhZGl1czoycHg7IGRpc3BsYXk6aW5saW5lLWJsb2NrfQouZHMtYnJhbmQgYntmb250LXNpemU6MTdweDsgbGV0dGVyLXNwYWNpbmc6LjA0ZW19Ci5kcy1icmFuZCBpe2Rpc3BsYXk6YmxvY2s7IGZvbnQtc3R5bGU6bm9ybWFsOyBmb250LXNpemU6OC41cHg7IGZvbnQtd2VpZ2h0OjcwMDsgbGV0dGVyLXNwYWNpbmc6LjE0ZW07CiAgY29sb3I6dmFyKC0tbXV0ZWQyKTsgdGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlfQouZHMtbWV0YXt0ZXh0LWFsaWduOnJpZ2h0OyBmb250LXNpemU6MTFweDsgY29sb3I6dmFyKC0tbXV0ZWQpfQouZHMtbWV0YSBie2Rpc3BsYXk6YmxvY2s7IGNvbG9yOnZhcigtLWluayk7IGZvbnQtc2l6ZToxM3B4fQouZHMtbWV0YSBzcGFue2Rpc3BsYXk6YmxvY2t9Ci5kcy1kcmF3e2JvcmRlcjoxcHggc29saWQgdmFyKC0tbGluZSk7IGJvcmRlci1yYWRpdXM6OHB4OyBtYXJnaW4tYm90dG9tOjhweDsgb3ZlcmZsb3c6aGlkZGVufQouZHMtZHJhdyBzdmcsLmRzLXJlbmRlciBzdmd7d2lkdGg6MTAwJTsgaGVpZ2h0OmF1dG87IGRpc3BsYXk6YmxvY2t9Ci5kcy1ncmlke2Rpc3BsYXk6Z3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjFmciAxLjE1ZnI7IGdhcDo4cHg7IG1hcmdpbi1ib3R0b206OHB4fQouZHMtcmVuZGVye2JvcmRlcjoxcHggc29saWQgdmFyKC0tbGluZSk7IGJvcmRlci1yYWRpdXM6OHB4OyBvdmVyZmxvdzpoaWRkZW47IGFsaWduLXNlbGY6c3RhcnR9Ci5kcy10YWJsZXt3aWR0aDoxMDAlOyBib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7IGZvbnQtc2l6ZToxMC41cHh9Ci5kcy10YWJsZSB0ZHtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWxpbmUpOyBwYWRkaW5nOjRweCA4cHg7IHZlcnRpY2FsLWFsaWduOnRvcH0KLmRzLXRhYmxlIHRkOmZpcnN0LWNoaWxke2NvbG9yOnZhcigtLW11dGVkKTsgd2lkdGg6NDAlfQouZHMtdGl0bGVibG9ja3t3aWR0aDoxMDAlOyBib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7IG1hcmdpbi10b3A6MnB4fQouZHMtdGl0bGVibG9jayB0ZHtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWluayk7IHBhZGRpbmc6NXB4IDhweDsgZm9udC1zaXplOjEwcHh9Ci5kcy10aXRsZWJsb2NrIGl7ZGlzcGxheTpibG9jazsgZm9udC1zdHlsZTpub3JtYWw7IGZvbnQtc2l6ZTo3LjVweDsgY29sb3I6dmFyKC0tbXV0ZWQpOwogIHRleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTsgbGV0dGVyLXNwYWNpbmc6LjA2ZW07IG1hcmdpbi1ib3R0b206MXB4fQouZHMtbm90ZXtmb250LXNpemU6OXB4OyBjb2xvcjp2YXIoLS1tdXRlZCk7IG1hcmdpbi10b3A6NnB4OyBsaW5lLWhlaWdodDoxLjV9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFJlc3BvbnNpdmUgKi8KQG1lZGlhIChtYXgtd2lkdGg6OTYwcHgpewogIC5sYXlvdXR7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjFmcjsgZ2FwOjE4cHh9CiAgLnByZXZpZXd7cG9zaXRpb246c3RhdGljOyBvcmRlcjotMX0KICAuYXBwe3BhZGRpbmctYm90dG9tOjk2cHh9CiAgLm5hdntwb3NpdGlvbjpmaXhlZDsgbGVmdDowOyByaWdodDowOyBib3R0b206MDsgbWFyZ2luOjA7IHBhZGRpbmc6MTBweCAxNnB4IGNhbGMoMTBweCArIGVudihzYWZlLWFyZWEtaW5zZXQtYm90dG9tKSk7CiAgICBiYWNrZ3JvdW5kOnZhcigtLWJnKTsgYm9yZGVyLXRvcDoxcHggc29saWQgdmFyKC0tbGluZSk7IHotaW5kZXg6NTA7IGJveC1zaGFkb3c6MCAtNnB4IDIwcHggLTE0cHggcmdiYSgyOCwyOCwyOCwuMyl9CiAgLm5hdiAubWluaXByaWNle2Rpc3BsYXk6ZmxleDsgZmxleC1kaXJlY3Rpb246Y29sdW1uOyBsaW5lLWhlaWdodDoxLjE1OyBtYXJnaW46MCBhdXRvIDAgNHB4fQogIC5uYXYgLm1pbmlwcmljZSAuYXtmb250LXdlaWdodDo4MDA7IGZvbnQtc2l6ZToxNnB4OyBmb250LXZhcmlhbnQtbnVtZXJpYzp0YWJ1bGFyLW51bXN9CiAgLm5hdiAubWluaXByaWNlIC5ie2ZvbnQtc2l6ZToxMC41cHg7IGNvbG9yOnZhcigtLW11dGVkMil9CiAgLyogRGFzIFdvcmRQcmVzcy1QbHVnaW4gcGFzc3QgZGllIHNyY2RvYy1pRnJhbWUtSMO2aGUgYW4gZGVuIEluaGFsdCBhbi4gRWluZSBpbQogICAgIGlGcmFtZSBmaXhpZXJ0ZSBMZWlzdGUgbMOkZ2UgcmVsYXRpdiB6dW0gZ2VzYW10ZW4gKHNlaHIgaG9oZW4pIERva3VtZW50IHVuZAogICAgIHfDpHJlIGltIHNpY2h0YmFyZW4gV29yZFByZXNzLUF1c3NjaG5pdHQgbmljaHQgenV2ZXJsw6Rzc2lnIGVycmVpY2hiYXIuICovCiAgaHRtbC53ei1lbWJlZGRlZCAuYXBwe3BhZGRpbmctYm90dG9tOjI2cHh9CiAgaHRtbC53ei1lbWJlZGRlZCAjd3otbmF2e3Bvc2l0aW9uOnN0YXRpYzsgbWFyZ2luLXRvcDoxOHB4OyBwYWRkaW5nOjEwcHggMCAwOwogICAgYmFja2dyb3VuZDp0cmFuc3BhcmVudDsgYm9yZGVyLXRvcDoxcHggc29saWQgdmFyKC0tbGluZSk7IGJveC1zaGFkb3c6bm9uZX0KfQpAbWVkaWEgKG1pbi13aWR0aDo5NjFweCl7IC5uYXYgLm1pbmlwcmljZXtkaXNwbGF5Om5vbmV9IH0KQG1lZGlhIChtYXgtd2lkdGg6NTIwcHgpewogIC5hcHB7cGFkZGluZy1sZWZ0OjEycHg7IHBhZGRpbmctcmlnaHQ6MTJweH0KICAudG9wYmFye2FsaWduLWl0ZW1zOmZsZXgtc3RhcnR9CiAgLnRvcGJhciAuaGludHttYXgtd2lkdGg6MTY4cHg7IHRleHQtYWxpZ246cmlnaHQ7IGxpbmUtaGVpZ2h0OjEuNX0KICAudGlsZXN7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjFmcn0gLnJvdzJ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjFmcn0gLmZvcm17Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjFmcn0KICAuc2Vne2Rpc3BsYXk6ZmxleDsgd2lkdGg6MTAwJTsgbWF4LXdpZHRoOjEwMCV9CiAgLnNlZyBidXR0b257ZmxleDoxIDEgMTMycHg7IG1pbi13aWR0aDowOyB3aGl0ZS1zcGFjZTpub3JtYWw7IG92ZXJmbG93LXdyYXA6YW55d2hlcmV9CiAgLnB2LWhlYWR7cGFkZGluZy1sZWZ0OjEwcHg7IHBhZGRpbmctcmlnaHQ6MTBweH0KICAucHYtaGVhZCAubGJse2Rpc3BsYXk6bm9uZX0KICAucHYtYWN0aW9uc3t3aWR0aDoxMDAlOyBqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2Vlbn0KICAucHYtdG9nZ2xle2ZsZXg6MX0KICAucHYtdG9nZ2xlIGJ1dHRvbntmbGV4OjE7IGp1c3RpZnktY29udGVudDpjZW50ZXI7IHBhZGRpbmctbGVmdDoxMHB4OyBwYWRkaW5nLXJpZ2h0OjEwcHh9CiAgLnB2LXR5cGVjb2Rle2FsaWduLWl0ZW1zOmZsZXgtc3RhcnQ7IGZsZXgtd3JhcDp3cmFwfQogIC5wdi10eXBlY29kZSAuY29weXttYXJnaW4tbGVmdDowfQogIC5wYW5lbCAubmF2e2ZsZXgtd3JhcDp3cmFwfQogIC5wYW5lbCAubmF2IC5idG57ZmxleDoxIDEgMTQwcHg7IG1pbi13aWR0aDowOyBqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyOyBwYWRkaW5nLWxlZnQ6MTJweDsgcGFkZGluZy1yaWdodDoxMnB4OwogICAgd2hpdGUtc3BhY2U6bm9ybWFsOyB0ZXh0LWFsaWduOmNlbnRlcn0KICAjd3otbmF2e2dhcDo4cHg7IHBhZGRpbmctbGVmdDoxMnB4OyBwYWRkaW5nLXJpZ2h0OjEycHh9CiAgI3d6LW5hdiAuYnRue21pbi13aWR0aDowOyBwYWRkaW5nLWxlZnQ6MTJweDsgcGFkZGluZy1yaWdodDoxMnB4OyBmb250LXNpemU6MTNweDsgbGluZS1oZWlnaHQ6MS4xNTsKICAgIHRleHQtYWxpZ246Y2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyOyBvdmVyZmxvdy13cmFwOmFueXdoZXJlfQogICN3ei1uYXYgLm1pbmlwcmljZXttaW4td2lkdGg6MDsgZmxleDowIDEgYXV0b30KICAuY2FydCAuY2l7YWxpZ24taXRlbXM6ZmxleC1zdGFydDsgZmxleC13cmFwOndyYXB9CiAgLmNhcnQgLmNpPmRpdjpmaXJzdC1jaGlsZHttaW4td2lkdGg6MDsgZmxleDoxIDEgMTcwcHh9CiAgLmNhcnQgLmNpIC5jb2Rle292ZXJmbG93LXdyYXA6YW55d2hlcmV9CiAgLnN0ZXAtaGVhZCBoMntmb250LXNpemU6MjBweH0KfQpAbWVkaWEgKG1heC13aWR0aDozNTlweCl7CiAgLnBhbmVsIC5uYXYgLmJ0bntmbGV4LWJhc2lzOjEwMCV9CiAgI3d6LW5hdiAuYnRuLmdob3N0e3dpZHRoOjQ4cHg7IGZsZXg6MCAwIDQ4cHg7IHBhZGRpbmc6MDsgZm9udC1zaXplOjB9CiAgI3d6LW5hdiAuYnRuLmdob3N0IC5pY3t3aWR0aDoyMHB4OyBoZWlnaHQ6MjBweH0KfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBEcnVjay9QREYgKi8KQG1lZGlhIHByaW50ewogIC50b3BiYXIgLmhpbnQsLnByb2dyZXNzLC5uYXYsLnB2LXR5cGVjb2RlIC5jb3B5LC5saW5rYnRuLC5yZXNldGJ0biwubm90ZS1wbGgsLnB2LWhlYWQsLnd6LWZze2Rpc3BsYXk6bm9uZSFpbXBvcnRhbnR9CiAgLmFwcHtwYWRkaW5nOjB9IC5sYXlvdXR7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjFmciAxZnI7IGdhcDoyMHB4fQogIC5wcmV2aWV3e3Bvc2l0aW9uOnN0YXRpY30gLnB2LWNhcmR7Ym94LXNoYWRvdzpub25lOyBib3JkZXI6MXB4IHNvbGlkICNjY2N9CiAgYm9keXtmb250LXNpemU6MTJweH0KICAvKiBQbGFuc2tpenplLU1vZHVzOiBudXIgZGFzIERhdGVuYmxhdHQgZHJ1Y2tlbiAqLwogIGJvZHkud3otcHJpbnRpbmcgLmFwcHtkaXNwbGF5Om5vbmUhaW1wb3J0YW50fQogIGJvZHkud3otcHJpbnRpbmcgI3d6LWRze2Rpc3BsYXk6YmxvY2s7IG1heC13aWR0aDpub25lOyBwYWRkaW5nOjB9CiAgQHBhZ2V7c2l6ZTpBNCBwb3J0cmFpdDsgbWFyZ2luOjEybW19Cn0KCi8qIHByZWZlcnMtcmVkdWNlZC1tb3Rpb24gKi8KQG1lZGlhIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOnJlZHVjZSl7ICp7dHJhbnNpdGlvbjpub25lIWltcG9ydGFudDsgYW5pbWF0aW9uOm5vbmUhaW1wb3J0YW50fSB9Cgo8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgogIDxtYWluIGNsYXNzPSJhcHAiIGlkPSJ3ei1hcHAiPgogICAgPGRpdiBjbGFzcz0idG9wYmFyIj4KICAgICAgPGRpdiBjbGFzcz0iYnJhbmQiPgogICAgICAgIDxzcGFuIGNsYXNzPSJtYXJrIj48L3NwYW4+CiAgICAgICAgPHNwYW4+PHNwYW4gY2xhc3M9Im4iPldFSVNTPC9zcGFuPjxzcGFuIGNsYXNzPSJzIj5GaXR0aW5ncy1Lb25maWd1cmF0b3I8L3NwYW4+PC9zcGFuPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iaGludCIgaWQ9Ind6LXByaWNlLWhpbnQiPkRJTiAzMjY3NiA8Yj5hdWYgQW5mcmFnZTwvYj4gwrcgRElOIDExODY1IGF1ZiBBbmZyYWdlPC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8bmF2IGNsYXNzPSJwcm9ncmVzcyIgaWQ9Ind6LXByb2dyZXNzIiBhcmlhLWxhYmVsPSJGb3J0c2Nocml0dCI+PC9uYXY+CgogICAgPGRpdiBjbGFzcz0ibGF5b3V0Ij4KICAgICAgPHNlY3Rpb24gY2xhc3M9InBhbmVsIiBpZD0id3otcGFuZWwiIGFyaWEtbGl2ZT0icG9saXRlIj48L3NlY3Rpb24+CiAgICAgIDxhc2lkZSBjbGFzcz0icHJldmlldyIgaWQ9Ind6LXByZXZpZXciIGFyaWEtbGFiZWw9IlZvcnNjaGF1Ij48L2FzaWRlPgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0ibmF2IiBpZD0id3otbmF2Ij48L2Rpdj4KICA8L21haW4+CgogIDxzY3JpcHQ+d2luZG93LldFSVNTX0RBVEE9eyJkaWNodHVuZ1dlaWNoIjpbIkVQRE0iLCJWTVEiLCJGS00iXSwibWV0YSI6eyJ2ZXJzaW9uIjoiMS4xIiwic3RhbmQiOiIyMDI2LTA3LTIyIiwiZWluaGVpdCI6Im1tIiwid2FlaHJ1bmciOiJFVVIiLCJzY29wZSI6IkRJTiAzMjY3NiArIERJTiAxMTg2NSAoUHJlaXNlIGF1ZiBBbmZyYWdlKSIsInZlcnRyaWViRW1haWwiOiJzdGVyaWx0ZWNobmlrQHdlaXNzLWFubGFnZW5iYXUuZGUiLCJoaW53ZWlzTWFzc2UiOiJNYXNzZSBhdXMgS3VuZGVudW50ZXJsYWdlbiB1bmQgenVnZW9yZG5ldGVuIEhlcnN0ZWxsZXJkYXRlbmJsYWV0dGVybjsgd2lkZXJzcHJ1ZWNobGljaGUgb2RlciBmZWhsZW5kZSBXZXJ0ZSBibGVpYmVuIGdlc3BlcnJ0LiJ9LCJhbndlbmR1bmdlbiI6W3siaWQiOiJwaGFybWEiLCJsYWJlbCI6IlBoYXJtYSIsInN1YiI6IldGSSwgRGFtcGYtU0lQLCBob2NocmVpbiIsImRlZmF1bHRzIjp7IndlcmtzdG9mZiI6IjEuNDQzNSIsIm9iZXJmbGFlY2hlIjoiSDQiLCJkaWNodHVuZyI6IkVQRE0ifX0seyJpZCI6InN0ZXJpbHRlY2huaWsiLCJsYWJlbCI6IlN0ZXJpbHRlY2huaWsiLCJzdWIiOiJBc2VwdGlrLCBDSVBcL1NJUCIsImRlZmF1bHRzIjp7IndlcmtzdG9mZiI6IjEuNDQwNCIsIm9iZXJmbGFlY2hlIjoiU3RlcmlsIiwiZGljaHR1bmciOiJFUERNIn19LHsiaWQiOiJsZWJlbnNtaXR0ZWwiLCJsYWJlbCI6IkxlYmVuc21pdHRlbCIsInN1YiI6IkdldHJcdTAwZTRua2UsIE1vbGtlcmVpLCBGb29kIiwiZGVmYXVsdHMiOnsid2Vya3N0b2ZmIjoiMS40NDA0Iiwib2JlcmZsYWVjaGUiOiJIMyIsImRpY2h0dW5nIjoiVk1RIn19LHsiaWQiOiJjaGVtaWUiLCJsYWJlbCI6IkNoZW1pZSIsInN1YiI6IkxcdTAwZjZzZW1pdHRlbCwgU1x1MDBlNHVyZW4sIFx1MDBkNmxlIiwiZGVmYXVsdHMiOnsid2Vya3N0b2ZmIjoiMS40NDA0Iiwib2JlcmZsYWVjaGUiOiJIMSIsImRpY2h0dW5nIjoiRktNIn19XSwibm9ybWVuIjpbeyJpZCI6ImRpbjMyNjc2IiwibGFiZWwiOiJESU4gMzI2NzYiLCJzdWIiOiJDbGFtcHZlcmJpbmR1bmciLCJwcmVpc01vZHVzIjoiYW5mcmFnZSIsImhpbndlaXMiOiJDbGFtcHN0dXR6ZW4sIEJsaW5kZGVja2VsLCBLbGFtbWVybiBcdTIwMTMgUHJlaXMgYXVmIEFuZnJhZ2UuIn0seyJpZCI6ImRpbjExODY1IiwibGFiZWwiOiJESU4gMTE4NjUiLCJzdWIiOiJHZXNjaHdlaVx1MDBkZnRlIEZpdHRpbmdzIiwicHJlaXNNb2R1cyI6ImFuZnJhZ2UiLCJoaW53ZWlzIjoiQlx1MDBmNmdlbiwgVC1TdFx1MDBmY2NrZSwgUmVkdXppZXJ1bmdlbiAtIGF1ZiBBbmZyYWdlLCBqZSBuYWNoIFZlcmZcdTAwZmNnYmFya2VpdC4ifV0sInR5cGVuIjpbeyJpZCI6IlRDIiwibm9ybSI6ImRpbjMyNjc2IiwibGFiZWwiOiJLb21wbGV0dGUgVHJpQ2xhbXAgVmVyYmluZHVuZyIsInN1YiI6IkFuc2Nod2Vpc3NzdHV0emVuIG1pdCBDbGFtcGFuc2NobHVzcyIsInN2Z1R5cGUiOiJjbGFtcHN0dXR6ZW4iLCJkaWNodHVuZyI6dHJ1ZSwibGFlbmdlVmFyaWFudGUiOnRydWUsImtvbXBsZXR0ZVZlcmJpbmR1bmciOnRydWUsImFrdGl2Ijp0cnVlfSx7ImlkIjoiVENEIiwibm9ybSI6ImRpbjMyNjc2IiwibGFiZWwiOiJUYW5rc3R1dHplbiBkaWNrd2FuZGlnIiwic3ViIjoiQW5zY2h3ZWlzc3N0dXR6ZW4gbWl0IENsYW1wYW5zY2hsdXNzIiwic3ZnVHlwZSI6ImNsYW1wc3R1dHplbiIsImRpY2h0dW5nIjpmYWxzZSwiZWluemVsU3R1dHplbiI6dHJ1ZSwibWFzc2VRdWVsbGUiOiJ0Y2QiLCJha3RpdiI6dHJ1ZX0seyJpZCI6IlRDUyIsIm5vcm0iOiJkaW4zMjY3NiIsImxhYmVsIjoiVEMtU3R1dHplbiIsInN1YiI6IkVpbnplbG5lciBUcmlDbGFtcC1TdHV0emVuIiwic3ZnVHlwZSI6ImNsYW1wc3R1dHplbiIsImRpY2h0dW5nIjpmYWxzZSwibGFlbmdlVmFyaWFudGUiOnRydWUsImVpbnplbFN0dXR6ZW4iOnRydWUsImFrdGl2Ijp0cnVlfSx7ImlkIjoiQkQiLCJub3JtIjoiZGluMzI2NzYiLCJsYWJlbCI6IkJsaW5kZGVja2VsIiwic3ViIjoiVmVyc2NobGllc3N0IGVpbmVuIENsYW1wYW5zY2hsdXNzIiwic3ZnVHlwZSI6ImJsaW5kZGVja2VsIiwiZGljaHR1bmciOmZhbHNlLCJudXJGbGFuc2NoIjp0cnVlLCJha3RpdiI6dHJ1ZX0seyJpZCI6IkQiLCJub3JtIjoiZGluMzI2NzYiLCJsYWJlbCI6IkRpY2h0dW5nIiwic3ViIjoiRWluemVsbmUgRGljaHR1bmciLCJzdmdUeXBlIjoiZGljaHR1bmciLCJkaWNodHVuZyI6dHJ1ZSwiYWt0aXYiOnRydWV9LHsiaWQiOiJLTCIsIm5vcm0iOiJkaW4zMjY3NiIsImxhYmVsIjoiS2xhbW1lciBcLyBTcGFubnJpbmciLCJzdWIiOiJHclx1MDBmNlx1MDBkZmUgbmFjaCBGbGFuc2NoLVx1MDBkOCIsInN2Z1R5cGUiOiJrbGFtbWVyIiwiZGljaHR1bmciOmZhbHNlLCJudXJGbGFuc2NoIjp0cnVlLCJrbGFtbWVyVHlwZW4iOnRydWUsImFrdGl2Ijp0cnVlfSx7ImlkIjoiQ0YiLCJub3JtIjoiZGluMzI2NzYiLCJsYWJlbCI6IkNvbm5lY3QtRmxhbnNjaCIsInN1YiI6IldhbmRiXHUwMGZjbmRpZ2VyIEJlaFx1MDBlNGx0ZXJhbnNjaGx1c3MiLCJzdmdUeXBlIjoiY29ubmVjdGZsYW5zY2giLCJkaWNodHVuZyI6ZmFsc2UsIm1hc3NlUXVlbGxlIjoiY2YiLCJjb25uZWN0Ijp0cnVlLCJha3RpdiI6dHJ1ZX0seyJpZCI6IkNGSSIsIm5vcm0iOiJkaW4zMjY3NiIsImxhYmVsIjoiQ29ubmVjdC1GbGFuc2NoIElubGluZSIsInN1YiI6IklubGluZS1BdXNmXHUwMGZjaHJ1bmciLCJzdmdUeXBlIjoiY29ubmVjdGlubGluZSIsImRpY2h0dW5nIjpmYWxzZSwibWFzc2VRdWVsbGUiOiJjZmkiLCJjb25uZWN0Ijp0cnVlLCJha3RpdiI6dHJ1ZX0seyJpZCI6IkI5MCIsIm5vcm0iOiJkaW4xMTg2NSIsImxhYmVsIjoiQm9nZW4gOTBcdTAwYjAiLCJzdWIiOiJGb3JtIEJMLTkwIiwic3ZnVHlwZSI6ImJvZ2VuOTAiLCJib2dlbiI6OTAsImRpY2h0dW5nIjpmYWxzZSwiYWt0aXYiOnRydWUsIm1hc3NlUXVlbGxlIjoiZGluMTE4NjUuYm9lZ2VuIn0seyJpZCI6IkI0NSIsIm5vcm0iOiJkaW4xMTg2NSIsImxhYmVsIjoiQm9nZW4gNDVcdTAwYjAiLCJzdWIiOiJGb3JtIEJMLTQ1Iiwic3ZnVHlwZSI6ImJvZ2VuNDUiLCJib2dlbiI6NDUsImRpY2h0dW5nIjpmYWxzZSwiYWt0aXYiOnRydWUsIm1hc3NlUXVlbGxlIjoiZGluMTE4NjUuYm9lZ2VuIn0seyJpZCI6IlRTIiwibm9ybSI6ImRpbjExODY1IiwibGFiZWwiOiJULVN0XHUwMGZjY2siLCJzdWIiOiJnbGVpY2ggXHUwMGI3IG1ldHJpc2NoXC9JU09cL1pvbGwgXHUwMGI3IEZvcm0gVCBcLyBGb3JtIFRLIiwic3ZnVHlwZSI6InRzdHVlY2siLCJmb3JtV2FobCI6dHJ1ZSwiZGljaHR1bmciOmZhbHNlLCJha3RpdiI6dHJ1ZSwibWFzc2VRdWVsbGUiOiJkaW4xMTg2NS50U3R1ZWNrR2xlaWNoIn0seyJpZCI6IlRTUiIsIm5vcm0iOiJkaW4xMTg2NSIsImxhYmVsIjoiVC1TdFx1MDBmY2NrIHJlZHV6aWVydCIsInN1YiI6ImtsZWluZXJlciBBYmdhbmcgXHUwMGI3IEZvcm0gVCBcLyBGb3JtIFRLIiwic3ZnVHlwZSI6InRzdHVlY2siLCJyZWR1emllcnQiOnRydWUsInp3ZWl0ZUdyb2Vzc2UiOnRydWUsImZvcm1XYWhsIjp0cnVlLCJkaWNodHVuZyI6ZmFsc2UsImFrdGl2Ijp0cnVlLCJtYXNzZVF1ZWxsZSI6ImRpbjExODY1LnRTdHVlY2tSZWR1emllcnQifSx7ImlkIjoiUiIsIm5vcm0iOiJkaW4xMTg2NSIsImxhYmVsIjoiUmVkdXppZXJ1bmciLCJzdWIiOiJrb256ZW50cmlzY2ggKEZvcm0gUkspIFwvIGV4emVudHJpc2NoIChGb3JtIFJFKSIsInN2Z1R5cGUiOiJyZWR1emllcnVuZyIsInp3ZWl0ZUdyb2Vzc2UiOnRydWUsImV4emVudHJpc2NoV2FobCI6dHJ1ZSwiZGljaHR1bmciOmZhbHNlLCJha3RpdiI6dHJ1ZSwibWFzc2VRdWVsbGUiOiJkaW4xMTg2NS5yZWR1emllcnVuZyJ9XSwibWFzc2UiOnsiZGluMzI2NzYiOnsicmVpaGVuIjp7IkEiOnsibGFiZWwiOiJSZWloZSBBIC0gbWV0cmlzY2ggKEROLCBESU4gMTE4NTApIiwiZ3JvZXNzZSI6IkROIiwicm93cyI6W3siaWQiOiJETjA2IiwibGFiZWwiOiJETjA2IiwidHViZU9EIjo4LCJ0dWJlSUQiOjYsIndhbGwiOjEsImZsYW5nZU9EIjoyNSwiYmxpbmRUaGsiOjQuNzUsImtrIjoxMi43LCJrbCI6MjguNiwiZ2Fza2V0T0QiOjIyLCJnYXNrZXRJRCI6OS43LCJnYXNrZXRUeXBlIjoiSSJ9LHsiaWQiOiJETjA4IiwibGFiZWwiOiJETjA4IiwidHViZU9EIjoxMCwidHViZUlEIjo4LCJ3YWxsIjoxLCJmbGFuZ2VPRCI6MjUsImJsaW5kVGhrIjo0Ljc1LCJrayI6MTIuNywia2wiOjI4LjYsImdhc2tldE9EIjoyMiwiZ2Fza2V0SUQiOjguMiwiZ2Fza2V0SURwdGZlIjo4LCJnYXNrZXRUeXBlIjoiSSJ9LHsiaWQiOiJETjEwIiwibGFiZWwiOiJETjEwIiwidHViZU9EIjoxMywidHViZUlEIjoxMCwid2FsbCI6MS41LCJmbGFuZ2VPRCI6MzQsImJsaW5kVGhrIjo2LjM1LCJrayI6MTgsImtsIjoyOC42LCJnYXNrZXRPRCI6MzQsImdhc2tldElEIjoxMi43LCJnYXNrZXRUeXBlIjoiSUkifSx7ImlkIjoiRE4xNSIsImxhYmVsIjoiRE4xNSIsInR1YmVPRCI6MTksInR1YmVJRCI6MTYsIndhbGwiOjEuNSwiZmxhbmdlT0QiOjM0LCJibGluZFRoayI6Ni4zNSwia2siOjE4LCJrbCI6MjguNiwiZ2Fza2V0T0QiOjM0LCJnYXNrZXRJRCI6MTguMiwiZ2Fza2V0VHlwZSI6IklJIn0seyJpZCI6IkROMjAiLCJsYWJlbCI6IkROMjAiLCJ0dWJlT0QiOjIzLCJ0dWJlSUQiOjIwLCJ3YWxsIjoxLjUsImZsYW5nZU9EIjozNCwiYmxpbmRUaGsiOjYuMzUsImtrIjoxOCwia2wiOjI4LjYsImdhc2tldE9EIjozNCwiZ2Fza2V0SUQiOjIyLjIsImdhc2tldFR5cGUiOiJJSSJ9LHsiaWQiOiJETjI1IiwibGFiZWwiOiJETjI1IiwidHViZU9EIjoyOSwidHViZUlEIjoyNiwid2FsbCI6MS41LCJmbGFuZ2VPRCI6NTAuNSwiYmxpbmRUaGsiOjYuMzUsImtrIjoyMS41LCJrbCI6MzYsImdhc2tldE9EIjo1MC41LCJnYXNrZXRJRCI6MjcuNywiZ2Fza2V0VHlwZSI6IklJIn0seyJpZCI6IkROMzIiLCJsYWJlbCI6IkROMzIiLCJ0dWJlT0QiOjM1LCJ0dWJlSUQiOjMyLCJ3YWxsIjoxLjUsImZsYW5nZU9EIjo1MC41LCJibGluZFRoayI6Ni4zNSwia2siOjIxLjUsImtsIjozNiwiZ2Fza2V0T0QiOjUwLjUsImdhc2tldElEIjozMi43LCJnYXNrZXRUeXBlIjoiSUkifSx7ImlkIjoiRE40MCIsImxhYmVsIjoiRE40MCIsInR1YmVPRCI6NDEsInR1YmVJRCI6MzgsIndhbGwiOjEuNSwiZmxhbmdlT0QiOjUwLjUsImJsaW5kVGhrIjo2LjM1LCJrayI6MjEuNSwia2wiOjM2LCJnYXNrZXRPRCI6NTAuNSwiZ2Fza2V0SUQiOjM4LjcsImdhc2tldFR5cGUiOiJJSSJ9LHsiaWQiOiJETjUwIiwibGFiZWwiOiJETjUwIiwidHViZU9EIjo1MywidHViZUlEIjo1MCwid2FsbCI6MS41LCJmbGFuZ2VPRCI6NjQsImJsaW5kVGhrIjo2LjM1LCJrayI6MjgsImtsIjozNiwiZ2Fza2V0T0QiOjY0LCJnYXNrZXRJRCI6NTAuNywiZ2Fza2V0VHlwZSI6IklJIn0seyJpZCI6IkRONjUiLCJsYWJlbCI6IkRONjUiLCJ0dWJlT0QiOjcwLCJ0dWJlSUQiOjY2LCJ3YWxsIjoyLCJmbGFuZ2VPRCI6OTEsImJsaW5kVGhrIjo2LjM1LCJrayI6MjgsImtsIjo0OCwiZ2Fza2V0T0QiOjkxLCJnYXNrZXRJRCI6NjYuMiwiZ2Fza2V0VHlwZSI6IklJIn0seyJpZCI6IkROODAiLCJsYWJlbCI6IkROODAiLCJ0dWJlT0QiOjg1LCJ0dWJlSUQiOjgxLCJ3YWxsIjoyLCJmbGFuZ2VPRCI6MTA2LCJibGluZFRoayI6Ni4zNSwia2siOjI4LCJrbCI6NDgsImdhc2tldE9EIjoxMDYsImdhc2tldElEIjo4MS4yLCJnYXNrZXRUeXBlIjoiSUkifSx7ImlkIjoiRE4xMDAiLCJsYWJlbCI6IkROMTAwIiwidHViZU9EIjoxMDQsInR1YmVJRCI6MTAwLCJ3YWxsIjoyLCJmbGFuZ2VPRCI6MTE5LCJibGluZFRoayI6OCwia2siOjI4LCJrbCI6NDgsImdhc2tldE9EIjoxMTksImdhc2tldElEIjoxMDAuMiwiZ2Fza2V0VHlwZSI6IklJIn0seyJpZCI6IkROMTI1IiwibGFiZWwiOiJETjEyNSIsInR1YmVPRCI6MTI5LCJ0dWJlSUQiOjEyNSwid2FsbCI6MiwiZmxhbmdlT0QiOjE1NSwiYmxpbmRUaGsiOjgsImtrIjoyOCwia2wiOjY2LCJnYXNrZXRPRCI6MTU1LCJnYXNrZXRJRCI6MTI1LjJ9LHsiaWQiOiJETjE1MCIsImxhYmVsIjoiRE4xNTAiLCJ0dWJlT0QiOjE1NCwidHViZUlEIjoxNTAsIndhbGwiOjIsImZsYW5nZU9EIjoxODMsImJsaW5kVGhrIjoxNCwia2siOjI4LCJrbCI6NjYsImdhc2tldE9EIjoxODMsImdhc2tldElEIjoxNTAuMn0seyJpZCI6IkROMjAwIiwibGFiZWwiOiJETjIwMCIsInR1YmVPRCI6MjA0LCJ0dWJlSUQiOjIwMCwid2FsbCI6MiwiZmxhbmdlT0QiOjIzMy41LCJibGluZFRoayI6MTQsImtrIjoyOCwia2wiOjY2LCJnYXNrZXRPRCI6MjMzLjUsImdhc2tldElEIjoyMDAuMn1dfSwiQiI6eyJsYWJlbCI6IlJlaWhlIEIgLSBtZXRyaXNjaCBJU08gKE9ELCBFTiBJU08gMTEyNykiLCJncm9lc3NlIjoiT0QiLCJyb3dzIjpbeyJpZCI6Ik5XMTAuMiIsImxhYmVsIjoiTlcgMTAsMiIsInR1YmVPRCI6MTAuMiwidHViZUlEIjo3LCJ3YWxsIjoxLjYsImZsYW5nZU9EIjoyNSwiYmxpbmRUaGsiOjQuNzUsImtrIjoxMi43LCJrbCI6MjguNiwiZ2Fza2V0T0QiOjIyLCJnYXNrZXRJRCI6MTIsImdhc2tldElEcHRmZSI6Ny4yLCJnYXNrZXRUeXBlIjoiSSJ9LHsiaWQiOiJOVzEzLjUiLCJsYWJlbCI6Ik5XIDEzLDUiLCJ0dWJlT0QiOjEzLjUsInR1YmVJRCI6MTAuMywid2FsbCI6MS42LCJmbGFuZ2VPRCI6MjUsImJsaW5kVGhrIjo0Ljc1LCJrayI6MTIuNywia2wiOjI4LjYsImdhc2tldE9EIjoyMiwiZ2Fza2V0SUQiOjE1LjcsImdhc2tldElEcHRmZSI6MTAuNSwiZ2Fza2V0VHlwZSI6IkkifSx7ImlkIjoiTlcxNy4yIiwibGFiZWwiOiJOVyAxNywyIiwidHViZU9EIjoxNy4yLCJ0dWJlSUQiOjE0LCJ3YWxsIjoxLjYsImZsYW5nZU9EIjoyNSwiYmxpbmRUaGsiOjQuNzUsImtrIjoxMi43LCJrbCI6MjguNiwiZ2Fza2V0T0QiOjIyLCJnYXNrZXRJRCI6MTQuMiwiZ2Fza2V0VHlwZSI6IkkifSx7ImlkIjoiTlcyMS4zIiwibGFiZWwiOiJOVyAyMSwzIiwidHViZU9EIjoyMS4zLCJ0dWJlSUQiOjE4LjEsIndhbGwiOjEuNiwiZmxhbmdlT0QiOjUwLjUsImJsaW5kVGhrIjo2LjM1LCJrayI6MjEuNSwia2wiOjM2LCJnYXNrZXRPRCI6NTAuNSwiZ2Fza2V0SUQiOjI0LjksImdhc2tldFR5cGUiOiJJSSJ9LHsiaWQiOiJOVzI2LjkiLCJsYWJlbCI6Ik5XIDI2LDkiLCJ0dWJlT0QiOjI2LjksInR1YmVJRCI6MjMuNywid2FsbCI6MS42LCJmbGFuZ2VPRCI6NTAuNSwiYmxpbmRUaGsiOjYuMzUsImtrIjoyMS41LCJrbCI6MzYsImdhc2tldE9EIjo1MC41LCJnYXNrZXRJRCI6MjMuOX0seyJpZCI6Ik5XMzMuNyIsImxhYmVsIjoiTlcgMzMsNyIsInR1YmVPRCI6MzMuNywidHViZUlEIjoyOS43LCJ3YWxsIjoyLCJmbGFuZ2VPRCI6NTAuNSwiYmxpbmRUaGsiOjYuMzUsImtrIjoyMS41LCJrbCI6MzYsImdhc2tldE9EIjo1MC41LCJnYXNrZXRJRCI6MzAuOSwiZ2Fza2V0VHlwZSI6IklJIn0seyJpZCI6Ik5XNDIuNCIsImxhYmVsIjoiTlcgNDIsNCIsInR1YmVPRCI6NDIuNCwidHViZUlEIjozOC40LCJ3YWxsIjoyLCJmbGFuZ2VPRCI6NjQsImJsaW5kVGhrIjo2LjM1LCJrayI6MjEuNSwia2wiOjM2LCJnYXNrZXRPRCI6NjQsImdhc2tldElEIjozOS4xLCJnYXNrZXRUeXBlIjoiSUkifSx7ImlkIjoiTlc0OC4zIiwibGFiZWwiOiJOVyA0OCwzIiwidHViZU9EIjo0OC4zLCJ0dWJlSUQiOjQ0LjMsIndhbGwiOjIsImZsYW5nZU9EIjo2NCwiYmxpbmRUaGsiOjYuMzUsImtrIjoyMS41LCJrbCI6MzYsImdhc2tldE9EIjo2NCwiZ2Fza2V0SUQiOjQ1LCJnYXNrZXRUeXBlIjoiSUkifSx7ImlkIjoiTlc2MC4zIiwibGFiZWwiOiJOVyA2MCwzIiwidHViZU9EIjo2MC4zLCJ0dWJlSUQiOjU2LjMsIndhbGwiOjIsImZsYW5nZU9EIjo3Ny41LCJibGluZFRoayI6Ni4zNSwia2siOjI4LCJrbCI6MzYsImdhc2tldE9EIjo3Ny41LCJnYXNrZXRJRCI6NTcsImdhc2tldFR5cGUiOiJJSSJ9LHsiaWQiOiJOVzc2LjEiLCJsYWJlbCI6Ik5XIDc2LDEiLCJ0dWJlT0QiOjc2LjEsInR1YmVJRCI6NzIuMSwid2FsbCI6MiwiZmxhbmdlT0QiOjkxLCJibGluZFRoayI6Ni4zNSwia2siOjI4LCJrbCI6NDgsImdhc2tldE9EIjo5MSwiZ2Fza2V0SUQiOjcyLjN9LHsiaWQiOiJOVzg4LjkiLCJsYWJlbCI6Ik5XIDg4LDkiLCJ0dWJlT0QiOjg4LjksInR1YmVJRCI6ODQuMywid2FsbCI6Mi4zLCJmbGFuZ2VPRCI6MTA2LCJibGluZFRoayI6Ni4zNSwia2siOjI4LCJrbCI6NDgsImdhc2tldE9EIjoxMDYsImdhc2tldElEIjo4NC41fSx7ImlkIjoiTlcxMTQuMyIsImxhYmVsIjoiTlcgMTE0LDMiLCJ0dWJlT0QiOjExNC4zLCJ0dWJlSUQiOjEwOS43LCJ3YWxsIjoyLjMsImZsYW5nZU9EIjoxMzAsImJsaW5kVGhrIjo4LCJrayI6MjgsImtsIjo0OCwiZ2Fza2V0T0QiOjEzMCwiZ2Fza2V0SUQiOjEwOS45fSx7ImlkIjoiTlcxMzkuNyIsImxhYmVsIjoiTlcgMTM5LDciLCJ0dWJlT0QiOjEzOS43LCJ0dWJlSUQiOjEzNC41LCJ3YWxsIjoyLjYsImZsYW5nZU9EIjoxNTUsImJsaW5kVGhrIjo4LCJrayI6MjgsImtsIjo2NiwiZ2Fza2V0T0QiOjE1NSwiZ2Fza2V0SUQiOjEzNC43fSx7ImlkIjoiTlcxNjguMyIsImxhYmVsIjoiTlcgMTY4LDMiLCJ0dWJlT0QiOjE2OC4zLCJ0dWJlSUQiOjE2My4xLCJ3YWxsIjoyLjYsImZsYW5nZU9EIjoxODMsImJsaW5kVGhrIjoxNCwia2siOjI4LCJrbCI6NjYsImdhc2tldE9EIjoxODMsImdhc2tldElEIjoxNjMuM30seyJpZCI6Ik5XMjE5LjEiLCJsYWJlbCI6Ik5XIDIxOSwxIiwidHViZU9EIjoyMTkuMSwidHViZUlEIjoyMTMuOSwid2FsbCI6Mi42LCJmbGFuZ2VPRCI6MjMzLjUsImJsaW5kVGhrIjoxNCwia2siOjI4LCJrbCI6NjYsImdhc2tldE9EIjoyMzMuNSwiZ2Fza2V0SUQiOjIxNC4xfV19LCJDIjp7ImxhYmVsIjoiUmVpaGUgQyAtIFpvbGxcL09EIChBU01FLUJQRS1uYWgpIiwiZ3JvZXNzZSI6IlpvbGwiLCJyb3dzIjpbeyJpZCI6IjAuMjUiLCJsYWJlbCI6IjFcLzRcIiIsInR1YmVPRCI6Ni4zNSwidHViZUlEIjo0LjU3LCJ3YWxsIjowLjg5LCJmbGFuZ2VPRCI6MjUsImJsaW5kVGhrIjo0Ljc1LCJrayI6MTIuNywia2wiOjI4LjYsImdhc2tldE9EIjoyMiwiZ2Fza2V0SUQiOjQuOH0seyJpZCI6IjAuMzc1IiwibGFiZWwiOiIzXC84XCIiLCJ0dWJlT0QiOjkuNTMsInR1YmVJRCI6Ny43NSwid2FsbCI6MC44OSwiZmxhbmdlT0QiOjI1LCJibGluZFRoayI6NC43NSwia2siOjEyLjcsImtsIjoyOC42LCJnYXNrZXRPRCI6MjIsImdhc2tldElEIjo4fSx7ImlkIjoiMC41IiwibGFiZWwiOiIxXC8yXCIiLCJ0dWJlT0QiOjEyLjcsInR1YmVJRCI6OS40LCJ3YWxsIjoxLjY1LCJmbGFuZ2VPRCI6MjUsImJsaW5kVGhrIjo0Ljc1LCJrayI6MTIuNywia2wiOjI4LjYsImdhc2tldE9EIjoyMiwiZ2Fza2V0SUQiOjkuNn0seyJpZCI6IjAuNzUiLCJsYWJlbCI6IjNcLzRcIiIsInR1YmVPRCI6MTkuMDUsInR1YmVJRCI6MTUuNzUsIndhbGwiOjEuNjUsImZsYW5nZU9EIjoyNSwiYmxpbmRUaGsiOjQuNzUsImtrIjoxMi43LCJrbCI6MjguNiwiZ2Fza2V0T0QiOjIyLCJnYXNrZXRJRCI6MTZ9LHsiaWQiOiIxIiwibGFiZWwiOiIxXCIiLCJ0dWJlT0QiOjI1LjQsInR1YmVJRCI6MjIuMSwid2FsbCI6MS42NSwiZmxhbmdlT0QiOjUwLjUsImJsaW5kVGhrIjo2LjM1LCJrayI6MjEuNSwia2wiOjM2LCJnYXNrZXRPRCI6NTAuNSwiZ2Fza2V0SUQiOjIyLjN9LHsiaWQiOiIxLjUiLCJsYWJlbCI6IjEgMVwvMlwiIiwidHViZU9EIjozOC4xLCJ0dWJlSUQiOjM0LjgsIndhbGwiOjEuNjUsImZsYW5nZU9EIjo1MC41LCJibGluZFRoayI6Ni4zNSwia2siOjIxLjUsImtsIjozNiwiZ2Fza2V0T0QiOjUwLjUsImdhc2tldElEIjozNX0seyJpZCI6IjIiLCJsYWJlbCI6IjJcIiIsInR1YmVPRCI6NTAuOCwidHViZUlEIjo0Ny41LCJ3YWxsIjoxLjY1LCJmbGFuZ2VPRCI6NjQsImJsaW5kVGhrIjo2LjM1LCJrayI6MjEuNSwia2wiOjM2LCJnYXNrZXRPRCI6NjQsImdhc2tldElEIjo0Ny43fSx7ImlkIjoiMi41IiwibGFiZWwiOiIyIDFcLzJcIiIsInR1YmVPRCI6NjMuNSwidHViZUlEIjo2MC4yLCJ3YWxsIjoxLjY1LCJmbGFuZ2VPRCI6NzcuNSwiYmxpbmRUaGsiOjYuMzUsImtrIjoyOCwia2wiOjM2LCJnYXNrZXRPRCI6NzcuNSwiZ2Fza2V0SUQiOjYwLjR9LHsiaWQiOiIzIiwibGFiZWwiOiIzXCIiLCJ0dWJlT0QiOjc2LjIsInR1YmVJRCI6NzIuOSwid2FsbCI6MS42NSwiZmxhbmdlT0QiOjkxLCJibGluZFRoayI6Ni4zNSwia2siOjI4LCJrbCI6NDgsImdhc2tldE9EIjo5MSwiZ2Fza2V0SUQiOjczLjF9LHsiaWQiOiI0IiwibGFiZWwiOiI0XCIiLCJ0dWJlT0QiOjEwMS42LCJ0dWJlSUQiOjk3LjM4LCJ3YWxsIjoyLjExLCJmbGFuZ2VPRCI6MTE5LCJibGluZFRoayI6OCwia2siOjI4LCJrbCI6NDgsImdhc2tldE9EIjoxMTksImdhc2tldElEIjo5Ny42fSx7ImlkIjoiNiIsImxhYmVsIjoiNlwiIiwidHViZU9EIjoxNTIuNCwidHViZUlEIjoxNDYuODYsIndhbGwiOjIuNzcsImZsYW5nZU9EIjoxNjcsImJsaW5kVGhrIjoxNCwia2siOjI4LCJrbCI6NjYsImdhc2tldE9EIjoxNjcsImdhc2tldElEIjoxNDcuMX1dfX0sImw0Ijp7IkEiOnsiRE4wNiI6eyJLSyI6MjUuNCwiS0wiOjU3LjJ9LCJETjA4Ijp7IktLIjoyNS40LCJLTCI6NTcuMn0sIkROMTAiOnsiS0siOjM3LjcsIktMIjo1OC45fSwiRE4xNSI6eyJLSyI6MzcuNywiS0wiOjU4Ljl9LCJETjIwIjp7IktLIjozNy43LCJLTCI6NTguOX0sIkROMjUiOnsiS0siOjQ0LjcsIktMIjo3My43fSwiRE4zMiI6eyJLSyI6NDQuNywiS0wiOjczLjd9LCJETjQwIjp7IktLIjo0NC43LCJLTCI6NzMuN30sIkRONTAiOnsiS0siOjQ0LjcsIktMIjo3My43fSwiRE42NSI6eyJLSyI6NTcuNywiS0wiOjk3Ljd9LCJETjgwIjp7IktLIjo1Ny43LCJLTCI6OTcuN30sIkROMTAwIjp7IktLIjo1Ny43LCJLTCI6OTcuN30sIkROMTI1Ijp7IktLIjo1Ny43LCJLTCI6MTMzLjd9LCJETjE1MCI6eyJLSyI6NTcuNywiS0wiOjEzMy43fSwiRE4yMDAiOnsiS0siOjU3LjcsIktMIjoxMzMuN319LCJCIjp7Ik5XMTAuMiI6eyJLSyI6MjUuNCwiS0wiOjU3LjJ9LCJOVzEzLjUiOnsiS0siOjI1LjQsIktMIjo1Ny4yfSwiTlcxNy4yIjp7IktLIjoyNS40LCJLTCI6NTcuMn0sIk5XMjEuMyI6eyJLSyI6NDQuNywiS0wiOjczLjd9LCJOVzI2LjkiOnsiS0siOjQ0LjcsIktMIjo3My43fSwiTlczMy43Ijp7IktLIjo0NC43LCJLTCI6NzMuN30sIk5XNDIuNCI6eyJLSyI6NDQuNywiS0wiOjczLjd9LCJOVzQ4LjMiOnsiS0siOjQ0LjcsIktMIjo3My43fSwiTlc2MC4zIjp7IktLIjo1Ny43LCJLTCI6NzMuN30sIk5XNzYuMSI6eyJLSyI6NTcuNywiS0wiOjk3Ljd9LCJOVzg4LjkiOnsiS0siOjU3LjcsIktMIjo5Ny43fSwiTlcxMTQuMyI6eyJLSyI6NTcuNywiS0wiOjk3Ljd9LCJOVzEzOS43Ijp7IktLIjo1Ny43LCJLTCI6MTMzLjd9LCJOVzE2OC4zIjp7IktLIjo1Ny43LCJLTCI6MTMzLjd9LCJOVzIxOS4xIjp7IktLIjo1Ny43LCJLTCI6MTMzLjd9fSwiQyI6eyIxIjp7IktLIjo0MywiS0wiOjczLjd9LCIyIjp7IktLIjo0MywiS0wiOjczLjd9LCIzIjp7IktLIjo1NiwiS0wiOjk3Ljd9LCI0Ijp7IktLIjo1NiwiS0wiOjk3Ljd9LCI2Ijp7IktLIjo1NiwiS0wiOjEzMy43fSwiMC4yNSI6eyJLSyI6MjUuNCwiS0wiOjU3LjJ9LCIwLjM3NSI6eyJLSyI6MjUuNCwiS0wiOjU3LjJ9LCIwLjUiOnsiS0siOjI1LjQsIktMIjo1Ny4yfSwiMC43NSI6eyJLSyI6MjUuNCwiS0wiOjU3LjJ9LCIxLjUiOnsiS0siOjQzLCJLTCI6NzMuN30sIjIuNSI6eyJLSyI6NTYsIktMIjo3My43fX19fSwiYm9nZW45MCI6eyJBIjpbeyJpZCI6IkROMDYiLCJ0dWJlT0QiOjgsIndhbGwiOjEsIlIiOjIwLCJMMSI6NDUsIkwyIjozMy4zLCJMM180NSI6MjUsIkwzXzkwIjoyNSwiQyI6NDUsIkMxIjoyNSwic3RhdHVzIjoidmVyaWZpemllcnQiLCJibG9ja2VkRmllbGRzIjpbXSwiYmxvY2tlciI6bnVsbH0seyJpZCI6IkROMDgiLCJ0dWJlT0QiOjEwLCJ3YWxsIjoxLCJSIjoyNSwiTDEiOjUwLCJMMiI6MzUuNCwiTDNfNDUiOjI1LCJMM185MCI6MjUsIkMiOjUwLCJDMSI6MjUsInN0YXR1cyI6InZlcmlmaXppZXJ0IiwiYmxvY2tlZEZpZWxkcyI6W10sImJsb2NrZXIiOm51bGx9LHsiaWQiOiJETjEwIiwidHViZU9EIjoxMywid2FsbCI6MS41LCJSIjoyNiwiTDEiOjUxLCJMMiI6MzUuOCwiTDNfNDUiOjI1LCJMM185MCI6MjUsIkMiOjUxLCJDMSI6MjUsInN0YXR1cyI6InZlcmlmaXppZXJ0IiwiYmxvY2tlZEZpZWxkcyI6W10sImJsb2NrZXIiOm51bGx9LHsiaWQiOiJETjE1IiwidHViZU9EIjoxOSwid2FsbCI6MS41LCJSIjozNSwiTDEiOjYwLCJMMiI6MzkuNSwiTDNfNDUiOjI1LCJMM185MCI6MjUsIkMiOjYwLCJDMSI6MjUsInN0YXR1cyI6InZlcmlmaXppZXJ0IiwiYmxvY2tlZEZpZWxkcyI6W10sImJsb2NrZXIiOm51bGx9LHsiaWQiOiJETjIwIiwidHViZU9EIjoyMywid2FsbCI6MS41LCJSIjo0MCwiTDEiOjY1LCJMMiI6NDEuNiwiTDNfNDUiOjI1LCJMM185MCI6MjUsIkMiOjY1LCJDMSI6MjUsInN0YXR1cyI6InZlcmlmaXppZXJ0IiwiYmxvY2tlZEZpZWxkcyI6W10sImJsb2NrZXIiOm51bGx9LHsiaWQiOiJETjI1IiwidHViZU9EIjoyOSwid2FsbCI6MS41LCJSIjo1MCwiTDEiOjkwLCJMMiI6NjAuNywiTDNfNDUiOjQwLCJMM185MCI6NDAsIkMiOjkwLCJDMSI6NDAsInN0YXR1cyI6InZlcmlmaXppZXJ0IiwiYmxvY2tlZEZpZWxkcyI6W10sImJsb2NrZXIiOm51bGx9LHsiaWQiOiJETjMyIiwidHViZU9EIjozNSwid2FsbCI6MS41LCJSIjo1NSwiTDEiOjk1LCJMMiI6NjIuOCwiTDNfNDUiOjQwLCJMM185MCI6NDAsIkMiOjk1LCJDMSI6NDAsInN0YXR1cyI6InZlcmlmaXppZXJ0IiwiYmxvY2tlZEZpZWxkcyI6W10sImJsb2NrZXIiOm51bGx9LHsiaWQiOiJETjQwIiwidHViZU9EIjo0MSwid2FsbCI6MS41LCJSIjo2MCwiTDEiOjEwMCwiTDIiOjY0LjksIkwzXzQ1Ijo0MCwiTDNfOTAiOjQwLCJDIjoxMDAsIkMxIjo0MCwic3RhdHVzIjoidmVyaWZpemllcnQiLCJibG9ja2VkRmllbGRzIjpbXSwiYmxvY2tlciI6bnVsbH0seyJpZCI6IkRONTAiLCJ0dWJlT0QiOjUzLCJ3YWxsIjoxLjUsIlIiOjcwLCJMMSI6MTEwLCJMMiI6NjksIkwzXzQ1Ijo0MCwiTDNfOTAiOjQwLCJDIjoxMTAsIkMxIjo0MCwic3RhdHVzIjoidmVyaWZpemllcnQiLCJibG9ja2VkRmllbGRzIjpbXSwiYmxvY2tlciI6bnVsbH0seyJpZCI6IkRONjUiLCJ0dWJlT0QiOjcwLCJ3YWxsIjoyLCJSIjo4MCwiTDEiOjEyMCwiTDIiOjczLjEsIkwzXzQ1Ijo0MCwiTDNfOTAiOjQwLCJDIjoxMjAsIkMxIjo0MCwic3RhdHVzIjoidmVyaWZpemllcnQiLCJibG9ja2VkRmllbGRzIjpbXSwiYmxvY2tlciI6bnVsbH0seyJpZCI6IkROODAiLCJ0dWJlT0QiOjg1LCJ3YWxsIjoyLCJSIjo5MCwiTDEiOjE0NSwiTDIiOjkyLjMsIkwzXzQ1Ijo1NSwiTDNfOTAiOjU1LCJDIjoxNDUsIkMxIjo1NSwic3RhdHVzIjoidmVyaWZpemllcnQiLCJibG9ja2VkRmllbGRzIjpbXSwiYmxvY2tlciI6bnVsbH0seyJpZCI6IkROMTAwIiwidHViZU9EIjoxMDQsIndhbGwiOjIsIlIiOjEwMCwiTDEiOjE1NSwiTDIiOjk2LjQsIkwzXzQ1Ijo1NSwiTDNfOTAiOjU1LCJDIjoxNTUsIkMxIjo1NSwic3RhdHVzIjoidmVyaWZpemllcnQiLCJibG9ja2VkRmllbGRzIjpbXSwiYmxvY2tlciI6bnVsbH0seyJpZCI6IkROMTI1IiwidHViZU9EIjoxMjksIndhbGwiOjIsIlIiOjE4Ny41LCJMMSI6MjcwLCJMMiI6MTYwLjIsIkwzXzQ1Ijo4Mi41LCJMM185MCI6ODIuNSwiQyI6MjcwLCJDMSI6ODIuNSwic3RhdHVzIjoidmVyaWZpemllcnQiLCJibG9ja2VkRmllbGRzIjpbXSwiYmxvY2tlciI6bnVsbH0seyJpZCI6IkROMTUwIiwidHViZU9EIjoxNTQsIndhbGwiOjIsIlIiOjIyNSwiTDEiOjMyNSwiTDIiOjE5My4yLCJMM180NSI6MTAwLCJMM185MCI6MTAwLCJDIjozMjUsIkMxIjoxMDAsInN0YXR1cyI6InZlcmlmaXppZXJ0IiwiYmxvY2tlZEZpZWxkcyI6W10sImJsb2NrZXIiOm51bGx9LHsiaWQiOiJETjIwMCIsInR1YmVPRCI6MjA0LCJ3YWxsIjoyLCJSIjozMDAsIkwxIjo0MDAsIkwyIjoyMjQuMywiTDNfNDUiOjEwMCwiTDNfOTAiOjEwMCwiQyI6NDAwLCJDMSI6MTAwLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCIsImJsb2NrZWRGaWVsZHMiOltdLCJibG9ja2VyIjpudWxsfV0sIkIiOlt7ImlkIjoiTlcxMC4yIiwidHViZU9EIjoxMC4yLCJ3YWxsIjoxLjYsIlIiOjIwLCJMMSI6NDUsIkwyIjozMy4zLCJMM180NSI6MjUsIkwzXzkwIjoyNSwiQyI6NDUsIkMxIjoyNSwic3RhdHVzIjoidmVyaWZpemllcnQiLCJibG9ja2VkRmllbGRzIjpbXSwiYmxvY2tlciI6bnVsbH0seyJpZCI6Ik5XMTMuNSIsInR1YmVPRCI6MTMuNSwid2FsbCI6MS42LCJSIjoyMCwiTDEiOjQ1LCJMMiI6MzMuMywiTDNfNDUiOjI1LCJMM185MCI6MjUsIkMiOjQ1LCJDMSI6MjUsInN0YXR1cyI6InZlcmlmaXppZXJ0IiwiYmxvY2tlZEZpZWxkcyI6W10sImJsb2NrZXIiOm51bGx9LHsiaWQiOiJOVzE3LjIiLCJ0dWJlT0QiOjE3LjIsIndhbGwiOjEuNiwiUiI6MjgsIkwxIjo1MywiTDIiOjM2LjYsIkwzXzQ1IjoyNSwiTDNfOTAiOjI1LCJDIjo1MywiQzEiOjI1LCJzdGF0dXMiOiJ2ZXJpZml6aWVydCIsImJsb2NrZWRGaWVsZHMiOltdLCJibG9ja2VyIjpudWxsfSx7ImlkIjoiTlcyMS4zIiwidHViZU9EIjoyMS4zLCJ3YWxsIjoxLjYsIlIiOjMwLCJMMSI6NTUsIkwyIjozNy40LCJMM180NSI6MjUsIkwzXzkwIjoyNSwiQyI6NTUsIkMxIjoyNSwic3RhdHVzIjoidmVyaWZpemllcnQiLCJibG9ja2VkRmllbGRzIjpbXSwiYmxvY2tlciI6bnVsbH0seyJpZCI6Ik5XMjYuOSIsInR1YmVPRCI6MjYuOSwid2FsbCI6MS42LCJSIjoyOC41LCJMMSI6NjguNSwiTDIiOjUxLjgsIkwzXzQ1Ijo0MCwiTDNfOTAiOjQwLCJDIjo2OC41LCJDMSI6NDAsInN0YXR1cyI6InZlcmlmaXppZXJ0IiwiYmxvY2tlZEZpZWxkcyI6W10sImJsb2NrZXIiOm51bGx9LHsiaWQiOiJOVzMzLjciLCJ0dWJlT0QiOjMzLjcsIndhbGwiOjIsIlIiOjM4LCJMMSI6NzgsIkwyIjo1NS43LCJMM180NSI6NDAsIkwzXzkwIjo0MCwiQyI6NzgsIkMxIjo0MCwic3RhdHVzIjoidmVyaWZpemllcnQiLCJibG9ja2VkRmllbGRzIjpbXSwiYmxvY2tlciI6bnVsbH0seyJpZCI6Ik5XNDIuNCIsInR1YmVPRCI6NDIuNCwid2FsbCI6MiwiUiI6NDcuNSwiTDEiOjg3LjUsIkwyIjo1OS43LCJMM180NSI6NDAsIkwzXzkwIjo0MCwiQyI6ODcuNSwiQzEiOjQwLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCIsImJsb2NrZWRGaWVsZHMiOltdLCJibG9ja2VyIjpudWxsfSx7ImlkIjoiTlc0OC4zIiwidHViZU9EIjo0OC4zLCJ3YWxsIjoyLCJSIjo1NywiTDEiOjk3LCJMMiI6NjMuNiwiTDNfNDUiOjQwLCJMM185MCI6NDAsIkMiOjk3LCJDMSI6NDAsInN0YXR1cyI6InZlcmlmaXppZXJ0IiwiYmxvY2tlZEZpZWxkcyI6W10sImJsb2NrZXIiOm51bGx9LHsiaWQiOiJOVzYwLjMiLCJ0dWJlT0QiOjYwLjMsIndhbGwiOjIsIlIiOjc2LCJMMSI6MTE2LCJMMiI6NzEuNSwiTDNfNDUiOjQwLCJMM185MCI6NDAsIkMiOjExNiwiQzEiOjQwLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCIsImJsb2NrZWRGaWVsZHMiOltdLCJibG9ja2VyIjpudWxsfSx7ImlkIjoiTlc3Ni4xIiwidHViZU9EIjo3Ni4xLCJ3YWxsIjoyLCJSIjo5NSwiTDEiOjE1MCwiTDIiOjk0LjQsIkwzXzQ1Ijo1NSwiTDNfOTAiOjU1LCJDIjoxNTAsIkMxIjo1NSwic3RhdHVzIjoidmVyaWZpemllcnQiLCJibG9ja2VkRmllbGRzIjpbXSwiYmxvY2tlciI6bnVsbH0seyJpZCI6Ik5XODguOSIsInR1YmVPRCI6ODguOSwid2FsbCI6Mi4zLCJSIjoxMTQuNSwiTDEiOjE2OS41LCJMMiI6MTAyLjQsIkwzXzQ1Ijo1NSwiTDNfOTAiOjU1LCJDIjoxNjkuNSwiQzEiOjU1LCJzdGF0dXMiOiJ2ZXJpZml6aWVydCIsImJsb2NrZWRGaWVsZHMiOltdLCJibG9ja2VyIjpudWxsfSx7ImlkIjoiTlcxMTQuMyIsInR1YmVPRCI6MTE0LjMsIndhbGwiOjIuMywiUiI6MTUyLjUsIkwxIjoyMDcuNSwiTDIiOjExOC4yLCJMM180NSI6NTUsIkwzXzkwIjo1NSwiQyI6MjA3LjUsIkMxIjo1NSwic3RhdHVzIjoidmVyaWZpemllcnQiLCJibG9ja2VkRmllbGRzIjpbXSwiYmxvY2tlciI6bnVsbH0seyJpZCI6Ik5XMTM5LjciLCJ0dWJlT0QiOjEzOS43LCJ3YWxsIjoyLjYsIlIiOjE5MC41LCJMMSI6MjQ1LjUsIkwyIjoxMzMuOSwiTDNfNDUiOjU1LCJMM185MCI6NTUsIkMiOjI0NS41LCJDMSI6NTUsInN0YXR1cyI6InZlcmlmaXppZXJ0IiwiYmxvY2tlZEZpZWxkcyI6W10sImJsb2NrZXIiOm51bGx9LHsiaWQiOiJOVzE2OC4zIiwidHViZU9EIjoxNjguMywid2FsbCI6Mi42LCJSIjoyMjguNSwiTDEiOjI4My41LCJMMiI6MTQ5LjcsIkwzXzQ1Ijo1NSwiTDNfOTAiOjU1LCJDIjoyODMuNSwiQzEiOjU1LCJzdGF0dXMiOiJ2ZXJpZml6aWVydCIsImJsb2NrZWRGaWVsZHMiOltdLCJibG9ja2VyIjpudWxsfSx7ImlkIjoiTlcyMTkuMSIsInR1YmVPRCI6MjE5LjEsIndhbGwiOjIuNiwiUiI6MzA1LCJMMSI6Mzg1LCJMMiI6MjA2LjMsIkwzXzQ1Ijo4MCwiTDNfOTAiOjgwLCJDIjozODUsIkMxIjo4MCwic3RhdHVzIjoidmVyaWZpemllcnQiLCJibG9ja2VkRmllbGRzIjpbXSwiYmxvY2tlciI6bnVsbH1dLCJDIjpbeyJpZCI6IjAuMjUiLCJ0dWJlT0QiOjYuMzUsIndhbGwiOjAuODksIlIiOjE0LjMsIkwxIjo2Ni43LCJMMiI6NTAuOCwiTDNfNDUiOjQ0LjksIkwzXzkwIjo1Mi40LCJDIjo2Ni43LCJDMSI6NTIuNCwic3RhdHVzIjoidmVyaWZpemllcnQiLCJibG9ja2VkRmllbGRzIjpbXSwiYmxvY2tlciI6bnVsbH0seyJpZCI6IjAuMzc1IiwidHViZU9EIjo5LjUzLCJ3YWxsIjowLjg5LCJSIjoyOC42LCJMMSI6NjYuNywiTDIiOjUwLjgsIkwzXzQ1IjozOSwiTDNfOTAiOjM4LjEsIkMiOjY2LjcsIkMxIjozOC4xLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCIsImJsb2NrZWRGaWVsZHMiOltdLCJibG9ja2VyIjpudWxsfSx7ImlkIjoiMC41IiwidHViZU9EIjoxMi43LCJ3YWxsIjoxLjY1LCJSIjoyOC42LCJMMSI6NzYuMiwiTDIiOjU3LjIsIkwzXzQ1Ijo0NS40LCJMM185MCI6NDcuNiwiQyI6NzYuMiwiQzEiOjQ3LjYsInN0YXR1cyI6InZlcmlmaXppZXJ0IiwiYmxvY2tlZEZpZWxkcyI6W10sImJsb2NrZXIiOm51bGx9LHsiaWQiOiIwLjc1IiwidHViZU9EIjoxOS4wNSwid2FsbCI6MS42NSwiUiI6MjguNiwiTDEiOjc2LjIsIkwyIjo1Ny4yLCJMM180NSI6NDUuNCwiTDNfOTAiOjQ3LjYsIkMiOjc2LjIsIkMxIjo0Ny42LCJzdGF0dXMiOiJ2ZXJpZml6aWVydCIsImJsb2NrZWRGaWVsZHMiOltdLCJibG9ja2VyIjpudWxsfSx7ImlkIjoiMSIsInR1YmVPRCI6MjUuNCwid2FsbCI6MS42NSwiUiI6MzguMSwiTDEiOjc2LjIsIkwyIjo1Ny4yLCJMM180NSI6NDEuNCwiTDNfOTAiOjM4LjEsIkMiOjc2LjIsIkMxIjozOC4xLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCIsImJsb2NrZWRGaWVsZHMiOltdLCJibG9ja2VyIjpudWxsfSx7ImlkIjoiMS41IiwidHViZU9EIjozOC4xLCJ3YWxsIjoxLjY1LCJSIjo1Ny4yLCJMMSI6OTUuMywiTDIiOjYzLjUsIkwzXzQ1IjozOS44LCJMM185MCI6MzguMSwiQyI6OTUuMywiQzEiOjM4LjEsInN0YXR1cyI6InZlcmlmaXppZXJ0IiwiYmxvY2tlZEZpZWxkcyI6W10sImJsb2NrZXIiOm51bGx9LHsiaWQiOiIyIiwidHViZU9EIjo1MC44LCJ3YWxsIjoxLjY1LCJSIjo3Ni4yLCJMMSI6MTIwLjcsIkwyIjo3Ni4yLCJMM180NSI6NDQuNiwiTDNfOTAiOjQ0LjUsIkMiOjEyMC43LCJDMSI6NDQuNSwic3RhdHVzIjoidmVyaWZpemllcnQiLCJibG9ja2VkRmllbGRzIjpbXSwiYmxvY2tlciI6bnVsbH0seyJpZCI6IjIuNSIsInR1YmVPRCI6NjMuNSwid2FsbCI6MS42NSwiUiI6OTUuMywiTDEiOjEzOS43LCJMMiI6ODUuNywiTDNfNDUiOjQ2LjIsIkwzXzkwIjo0NC40LCJDIjoxMzkuNywiQzEiOjQ0LjQsInN0YXR1cyI6InZlcmlmaXppZXJ0IiwiYmxvY2tlZEZpZWxkcyI6W10sImJsb2NrZXIiOm51bGx9LHsiaWQiOiIzIiwidHViZU9EIjo3Ni4yLCJ3YWxsIjoxLjY1LCJSIjoxMTQuMywiTDEiOjE1OC44LCJMMiI6OTIuMSwiTDNfNDUiOjQ0LjgsIkwzXzkwIjo0NC41LCJDIjoxNTguOCwiQzEiOjQ0LjUsInN0YXR1cyI6InZlcmlmaXppZXJ0IiwiYmxvY2tlZEZpZWxkcyI6W10sImJsb2NrZXIiOm51bGx9LHsiaWQiOiI0IiwidHViZU9EIjoxMDEuNiwid2FsbCI6Mi4xMSwiUiI6MTUyLjQsIkwxIjoyMDMuMiwiTDIiOjExNC4zLCJMM180NSI6NTEuMiwiTDNfOTAiOjUwLjgsIkMiOjIwMy4yLCJDMSI6NTAuOCwic3RhdHVzIjoidmVyaWZpemllcnQiLCJibG9ja2VkRmllbGRzIjpbXSwiYmxvY2tlciI6bnVsbH0seyJpZCI6IjYiLCJ0dWJlT0QiOjE1Mi40LCJ3YWxsIjoyLjc3LCJSIjoyMjguNiwiTDEiOjI5Mi4xLCJMMiI6MTU4LjgsIkwzXzQ1Ijo2NC4xLCJMM185MCI6NjMuNSwiQyI6MjkyLjEsIkMxIjo2My41LCJzdGF0dXMiOiJ2ZXJpZml6aWVydCIsImJsb2NrZWRGaWVsZHMiOltdLCJibG9ja2VyIjpudWxsfV19LCJkaW4xMTg2NSI6eyJib2VnZW4iOnsiQSI6W3siaWQiOiJETjA2IiwidHViZU9EIjo4LCJ3YWxsIjoxLCJSIjoyMCwiTDEiOjQ1LCJMMiI6MzMuMywiTDNfNDUiOjI1LCJMM185MCI6MjUsIkMiOjQ1LCJDMSI6MjUsInN0YXR1cyI6InZlcmlmaXppZXJ0IiwiYmxvY2tlZEZpZWxkcyI6W10sImJsb2NrZXIiOm51bGx9LHsiaWQiOiJETjA4IiwidHViZU9EIjoxMCwid2FsbCI6MSwiUiI6MjUsIkwxIjo1MCwiTDIiOjM1LjQsIkwzXzQ1IjoyNSwiTDNfOTAiOjI1LCJDIjo1MCwiQzEiOjI1LCJzdGF0dXMiOiJ2ZXJpZml6aWVydCIsImJsb2NrZWRGaWVsZHMiOltdLCJibG9ja2VyIjpudWxsfSx7ImlkIjoiRE4xMCIsInR1YmVPRCI6MTMsIndhbGwiOjEuNSwiUiI6MjYsIkwxIjo1MSwiTDIiOjM1LjgsIkwzXzQ1IjoyNSwiTDNfOTAiOjI1LCJDIjo1MSwiQzEiOjI1LCJzdGF0dXMiOiJ2ZXJpZml6aWVydCIsImJsb2NrZWRGaWVsZHMiOltdLCJibG9ja2VyIjpudWxsfSx7ImlkIjoiRE4xNSIsInR1YmVPRCI6MTksIndhbGwiOjEuNSwiUiI6MzUsIkwxIjo2MCwiTDIiOjM5LjUsIkwzXzQ1IjoyNSwiTDNfOTAiOjI1LCJDIjo2MCwiQzEiOjI1LCJzdGF0dXMiOiJ2ZXJpZml6aWVydCIsImJsb2NrZWRGaWVsZHMiOltdLCJibG9ja2VyIjpudWxsfSx7ImlkIjoiRE4yMCIsInR1YmVPRCI6MjMsIndhbGwiOjEuNSwiUiI6NDAsIkwxIjo2NSwiTDIiOjQxLjYsIkwzXzQ1IjoyNSwiTDNfOTAiOjI1LCJDIjo2NSwiQzEiOjI1LCJzdGF0dXMiOiJ2ZXJpZml6aWVydCIsImJsb2NrZWRGaWVsZHMiOltdLCJibG9ja2VyIjpudWxsfSx7ImlkIjoiRE4yNSIsInR1YmVPRCI6MjksIndhbGwiOjEuNSwiUiI6NTAsIkwxIjo5MCwiTDIiOjYwLjcsIkwzXzQ1Ijo0MCwiTDNfOTAiOjQwLCJDIjo5MCwiQzEiOjQwLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCIsImJsb2NrZWRGaWVsZHMiOltdLCJibG9ja2VyIjpudWxsfSx7ImlkIjoiRE4zMiIsInR1YmVPRCI6MzUsIndhbGwiOjEuNSwiUiI6NTUsIkwxIjo5NSwiTDIiOjYyLjgsIkwzXzQ1Ijo0MCwiTDNfOTAiOjQwLCJDIjo5NSwiQzEiOjQwLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCIsImJsb2NrZWRGaWVsZHMiOltdLCJibG9ja2VyIjpudWxsfSx7ImlkIjoiRE40MCIsInR1YmVPRCI6NDEsIndhbGwiOjEuNSwiUiI6NjAsIkwxIjoxMDAsIkwyIjo2NC45LCJMM180NSI6NDAsIkwzXzkwIjo0MCwiQyI6MTAwLCJDMSI6NDAsInN0YXR1cyI6InZlcmlmaXppZXJ0IiwiYmxvY2tlZEZpZWxkcyI6W10sImJsb2NrZXIiOm51bGx9LHsiaWQiOiJETjUwIiwidHViZU9EIjo1Mywid2FsbCI6MS41LCJSIjo3MCwiTDEiOjExMCwiTDIiOjY5LCJMM180NSI6NDAsIkwzXzkwIjo0MCwiQyI6MTEwLCJDMSI6NDAsInN0YXR1cyI6InZlcmlmaXppZXJ0IiwiYmxvY2tlZEZpZWxkcyI6W10sImJsb2NrZXIiOm51bGx9LHsiaWQiOiJETjY1IiwidHViZU9EIjo3MCwid2FsbCI6MiwiUiI6ODAsIkwxIjoxMjAsIkwyIjo3My4xLCJMM180NSI6NDAsIkwzXzkwIjo0MCwiQyI6MTIwLCJDMSI6NDAsInN0YXR1cyI6InZlcmlmaXppZXJ0IiwiYmxvY2tlZEZpZWxkcyI6W10sImJsb2NrZXIiOm51bGx9LHsiaWQiOiJETjgwIiwidHViZU9EIjo4NSwid2FsbCI6MiwiUiI6OTAsIkwxIjoxNDUsIkwyIjo5Mi4zLCJMM180NSI6NTUsIkwzXzkwIjo1NSwiQyI6MTQ1LCJDMSI6NTUsInN0YXR1cyI6InZlcmlmaXppZXJ0IiwiYmxvY2tlZEZpZWxkcyI6W10sImJsb2NrZXIiOm51bGx9LHsiaWQiOiJETjEwMCIsInR1YmVPRCI6MTA0LCJ3YWxsIjoyLCJSIjoxMDAsIkwxIjoxNTUsIkwyIjo5Ni40LCJMM180NSI6NTUsIkwzXzkwIjo1NSwiQyI6MTU1LCJDMSI6NTUsInN0YXR1cyI6InZlcmlmaXppZXJ0IiwiYmxvY2tlZEZpZWxkcyI6W10sImJsb2NrZXIiOm51bGx9LHsiaWQiOiJETjEyNSIsInR1YmVPRCI6MTI5LCJ3YWxsIjoyLCJSIjoxODcuNSwiTDEiOjI3MCwiTDIiOjE2MC4yLCJMM180NSI6ODIuNSwiTDNfOTAiOjgyLjUsIkMiOjI3MCwiQzEiOjgyLjUsInN0YXR1cyI6InZlcmlmaXppZXJ0IiwiYmxvY2tlZEZpZWxkcyI6W10sImJsb2NrZXIiOm51bGx9LHsiaWQiOiJETjE1MCIsInR1YmVPRCI6MTU0LCJ3YWxsIjoyLCJSIjoyMjUsIkwxIjozMjUsIkwyIjoxOTMuMiwiTDNfNDUiOjEwMCwiTDNfOTAiOjEwMCwiQyI6MzI1LCJDMSI6MTAwLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCIsImJsb2NrZWRGaWVsZHMiOltdLCJibG9ja2VyIjpudWxsfSx7ImlkIjoiRE4yMDAiLCJ0dWJlT0QiOjIwNCwid2FsbCI6MiwiUiI6MzAwLCJMMSI6NDAwLCJMMiI6MjI0LjMsIkwzXzQ1IjoxMDAsIkwzXzkwIjoxMDAsIkMiOjQwMCwiQzEiOjEwMCwic3RhdHVzIjoidmVyaWZpemllcnQiLCJibG9ja2VkRmllbGRzIjpbXSwiYmxvY2tlciI6bnVsbH1dLCJCIjpbeyJpZCI6Ik5XMTAuMiIsInR1YmVPRCI6MTAuMiwid2FsbCI6MS42LCJSIjoyMCwiTDEiOjQ1LCJMMiI6MzMuMywiTDNfNDUiOjI1LCJMM185MCI6MjUsIkMiOjQ1LCJDMSI6MjUsInN0YXR1cyI6InZlcmlmaXppZXJ0IiwiYmxvY2tlZEZpZWxkcyI6W10sImJsb2NrZXIiOm51bGx9LHsiaWQiOiJOVzEzLjUiLCJ0dWJlT0QiOjEzLjUsIndhbGwiOjEuNiwiUiI6MjAsIkwxIjo0NSwiTDIiOjMzLjMsIkwzXzQ1IjoyNSwiTDNfOTAiOjI1LCJDIjo0NSwiQzEiOjI1LCJzdGF0dXMiOiJ2ZXJpZml6aWVydCIsImJsb2NrZWRGaWVsZHMiOltdLCJibG9ja2VyIjpudWxsfSx7ImlkIjoiTlcxNy4yIiwidHViZU9EIjoxNy4yLCJ3YWxsIjoxLjYsIlIiOjI4LCJMMSI6NTMsIkwyIjozNi42LCJMM180NSI6MjUsIkwzXzkwIjoyNSwiQyI6NTMsIkMxIjoyNSwic3RhdHVzIjoidmVyaWZpemllcnQiLCJibG9ja2VkRmllbGRzIjpbXSwiYmxvY2tlciI6bnVsbH0seyJpZCI6Ik5XMjEuMyIsInR1YmVPRCI6MjEuMywid2FsbCI6MS42LCJSIjozMCwiTDEiOjU1LCJMMiI6MzcuNCwiTDNfNDUiOjI1LCJMM185MCI6MjUsIkMiOjU1LCJDMSI6MjUsInN0YXR1cyI6InZlcmlmaXppZXJ0IiwiYmxvY2tlZEZpZWxkcyI6W10sImJsb2NrZXIiOm51bGx9LHsiaWQiOiJOVzI2LjkiLCJ0dWJlT0QiOjI2LjksIndhbGwiOjEuNiwiUiI6MjguNSwiTDEiOjY4LjUsIkwyIjo1MS44LCJMM180NSI6NDAsIkwzXzkwIjo0MCwiQyI6NjguNSwiQzEiOjQwLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCIsImJsb2NrZWRGaWVsZHMiOltdLCJibG9ja2VyIjpudWxsfSx7ImlkIjoiTlczMy43IiwidHViZU9EIjozMy43LCJ3YWxsIjoyLCJSIjozOCwiTDEiOjc4LCJMMiI6NTUuNywiTDNfNDUiOjQwLCJMM185MCI6NDAsIkMiOjc4LCJDMSI6NDAsInN0YXR1cyI6InZlcmlmaXppZXJ0IiwiYmxvY2tlZEZpZWxkcyI6W10sImJsb2NrZXIiOm51bGx9LHsiaWQiOiJOVzQyLjQiLCJ0dWJlT0QiOjQyLjQsIndhbGwiOjIsIlIiOjQ3LjUsIkwxIjo4Ny41LCJMMiI6NTkuNywiTDNfNDUiOjQwLCJMM185MCI6NDAsIkMiOjg3LjUsIkMxIjo0MCwic3RhdHVzIjoidmVyaWZpemllcnQiLCJibG9ja2VkRmllbGRzIjpbXSwiYmxvY2tlciI6bnVsbH0seyJpZCI6Ik5XNDguMyIsInR1YmVPRCI6NDguMywid2FsbCI6MiwiUiI6NTcsIkwxIjo5NywiTDIiOjYzLjYsIkwzXzQ1Ijo0MCwiTDNfOTAiOjQwLCJDIjo5NywiQzEiOjQwLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCIsImJsb2NrZWRGaWVsZHMiOltdLCJibG9ja2VyIjpudWxsfSx7ImlkIjoiTlc2MC4zIiwidHViZU9EIjo2MC4zLCJ3YWxsIjoyLCJSIjo3NiwiTDEiOjExNiwiTDIiOjcxLjUsIkwzXzQ1Ijo0MCwiTDNfOTAiOjQwLCJDIjoxMTYsIkMxIjo0MCwic3RhdHVzIjoidmVyaWZpemllcnQiLCJibG9ja2VkRmllbGRzIjpbXSwiYmxvY2tlciI6bnVsbH0seyJpZCI6Ik5XNzYuMSIsInR1YmVPRCI6NzYuMSwid2FsbCI6MiwiUiI6OTUsIkwxIjoxNTAsIkwyIjo5NC40LCJMM180NSI6NTUsIkwzXzkwIjo1NSwiQyI6MTUwLCJDMSI6NTUsInN0YXR1cyI6InZlcmlmaXppZXJ0IiwiYmxvY2tlZEZpZWxkcyI6W10sImJsb2NrZXIiOm51bGx9LHsiaWQiOiJOVzg4LjkiLCJ0dWJlT0QiOjg4LjksIndhbGwiOjIuMywiUiI6MTE0LjUsIkwxIjoxNjkuNSwiTDIiOjEwMi40LCJMM180NSI6NTUsIkwzXzkwIjo1NSwiQyI6MTY5LjUsIkMxIjo1NSwic3RhdHVzIjoidmVyaWZpemllcnQiLCJibG9ja2VkRmllbGRzIjpbXSwiYmxvY2tlciI6bnVsbH0seyJpZCI6Ik5XMTE0LjMiLCJ0dWJlT0QiOjExNC4zLCJ3YWxsIjoyLjMsIlIiOjE1Mi41LCJMMSI6MjA3LjUsIkwyIjoxMTguMiwiTDNfNDUiOjU1LCJMM185MCI6NTUsIkMiOjIwNy41LCJDMSI6NTUsInN0YXR1cyI6InZlcmlmaXppZXJ0IiwiYmxvY2tlZEZpZWxkcyI6W10sImJsb2NrZXIiOm51bGx9LHsiaWQiOiJOVzEzOS43IiwidHViZU9EIjoxMzkuNywid2FsbCI6Mi42LCJSIjoxOTAuNSwiTDEiOjI0NS41LCJMMiI6MTMzLjksIkwzXzQ1Ijo1NSwiTDNfOTAiOjU1LCJDIjoyNDUuNSwiQzEiOjU1LCJzdGF0dXMiOiJ2ZXJpZml6aWVydCIsImJsb2NrZWRGaWVsZHMiOltdLCJibG9ja2VyIjpudWxsfSx7ImlkIjoiTlcxNjguMyIsInR1YmVPRCI6MTY4LjMsIndhbGwiOjIuNiwiUiI6MjI4LjUsIkwxIjoyODMuNSwiTDIiOjE0OS43LCJMM180NSI6NTUsIkwzXzkwIjo1NSwiQyI6MjgzLjUsIkMxIjo1NSwic3RhdHVzIjoidmVyaWZpemllcnQiLCJibG9ja2VkRmllbGRzIjpbXSwiYmxvY2tlciI6bnVsbH0seyJpZCI6Ik5XMjE5LjEiLCJ0dWJlT0QiOjIxOS4xLCJ3YWxsIjoyLjYsIlIiOjMwNSwiTDEiOjM4NSwiTDIiOjIwNi4zLCJMM180NSI6ODAsIkwzXzkwIjo4MCwiQyI6Mzg1LCJDMSI6ODAsInN0YXR1cyI6InZlcmlmaXppZXJ0IiwiYmxvY2tlZEZpZWxkcyI6W10sImJsb2NrZXIiOm51bGx9XSwiQyI6W3siaWQiOiIwLjI1IiwidHViZU9EIjo2LjM1LCJ3YWxsIjowLjg5LCJSIjoxNC4zLCJMMSI6NjYuNywiTDIiOjUwLjgsIkwzXzQ1Ijo0NC45LCJMM185MCI6NTIuNCwiQyI6NjYuNywiQzEiOjUyLjQsInN0YXR1cyI6InZlcmlmaXppZXJ0IiwiYmxvY2tlZEZpZWxkcyI6W10sImJsb2NrZXIiOm51bGx9LHsiaWQiOiIwLjM3NSIsInR1YmVPRCI6OS41Mywid2FsbCI6MC44OSwiUiI6MjguNiwiTDEiOjY2LjcsIkwyIjo1MC44LCJMM180NSI6MzksIkwzXzkwIjozOC4xLCJDIjo2Ni43LCJDMSI6MzguMSwic3RhdHVzIjoidmVyaWZpemllcnQiLCJibG9ja2VkRmllbGRzIjpbXSwiYmxvY2tlciI6bnVsbH0seyJpZCI6IjAuNSIsInR1YmVPRCI6MTIuNywid2FsbCI6MS42NSwiUiI6MjguNiwiTDEiOjc2LjIsIkwyIjo1Ny4yLCJMM180NSI6NDUuNCwiTDNfOTAiOjQ3LjYsIkMiOjc2LjIsIkMxIjo0Ny42LCJzdGF0dXMiOiJ2ZXJpZml6aWVydCIsImJsb2NrZWRGaWVsZHMiOltdLCJibG9ja2VyIjpudWxsfSx7ImlkIjoiMC43NSIsInR1YmVPRCI6MTkuMDUsIndhbGwiOjEuNjUsIlIiOjI4LjYsIkwxIjo3Ni4yLCJMMiI6NTcuMiwiTDNfNDUiOjQ1LjQsIkwzXzkwIjo0Ny42LCJDIjo3Ni4yLCJDMSI6NDcuNiwic3RhdHVzIjoidmVyaWZpemllcnQiLCJibG9ja2VkRmllbGRzIjpbXSwiYmxvY2tlciI6bnVsbH0seyJpZCI6IjEiLCJ0dWJlT0QiOjI1LjQsIndhbGwiOjEuNjUsIlIiOjM4LjEsIkwxIjo3Ni4yLCJMMiI6NTcuMiwiTDNfNDUiOjQxLjQsIkwzXzkwIjozOC4xLCJDIjo3Ni4yLCJDMSI6MzguMSwic3RhdHVzIjoidmVyaWZpemllcnQiLCJibG9ja2VkRmllbGRzIjpbXSwiYmxvY2tlciI6bnVsbH0seyJpZCI6IjEuNSIsInR1YmVPRCI6MzguMSwid2FsbCI6MS42NSwiUiI6NTcuMiwiTDEiOjk1LjMsIkwyIjo2My41LCJMM180NSI6MzkuOCwiTDNfOTAiOjM4LjEsIkMiOjk1LjMsIkMxIjozOC4xLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCIsImJsb2NrZWRGaWVsZHMiOltdLCJibG9ja2VyIjpudWxsfSx7ImlkIjoiMiIsInR1YmVPRCI6NTAuOCwid2FsbCI6MS42NSwiUiI6NzYuMiwiTDEiOjEyMC43LCJMMiI6NzYuMiwiTDNfNDUiOjQ0LjYsIkwzXzkwIjo0NC41LCJDIjoxMjAuNywiQzEiOjQ0LjUsInN0YXR1cyI6InZlcmlmaXppZXJ0IiwiYmxvY2tlZEZpZWxkcyI6W10sImJsb2NrZXIiOm51bGx9LHsiaWQiOiIyLjUiLCJ0dWJlT0QiOjYzLjUsIndhbGwiOjEuNjUsIlIiOjk1LjMsIkwxIjoxMzkuNywiTDIiOjg1LjcsIkwzXzQ1Ijo0Ni4yLCJMM185MCI6NDQuNCwiQyI6MTM5LjcsIkMxIjo0NC40LCJzdGF0dXMiOiJ2ZXJpZml6aWVydCIsImJsb2NrZWRGaWVsZHMiOltdLCJibG9ja2VyIjpudWxsfSx7ImlkIjoiMyIsInR1YmVPRCI6NzYuMiwid2FsbCI6MS42NSwiUiI6MTE0LjMsIkwxIjoxNTguOCwiTDIiOjkyLjEsIkwzXzQ1Ijo0NC44LCJMM185MCI6NDQuNSwiQyI6MTU4LjgsIkMxIjo0NC41LCJzdGF0dXMiOiJ2ZXJpZml6aWVydCIsImJsb2NrZWRGaWVsZHMiOltdLCJibG9ja2VyIjpudWxsfSx7ImlkIjoiNCIsInR1YmVPRCI6MTAxLjYsIndhbGwiOjIuMTEsIlIiOjE1Mi40LCJMMSI6MjAzLjIsIkwyIjoxMTQuMywiTDNfNDUiOjUxLjIsIkwzXzkwIjo1MC44LCJDIjoyMDMuMiwiQzEiOjUwLjgsInN0YXR1cyI6InZlcmlmaXppZXJ0IiwiYmxvY2tlZEZpZWxkcyI6W10sImJsb2NrZXIiOm51bGx9LHsiaWQiOiI2IiwidHViZU9EIjoxNTIuNCwid2FsbCI6Mi43NywiUiI6MjI4LjYsIkwxIjoyOTIuMSwiTDIiOjE1OC44LCJMM180NSI6NjQuMSwiTDNfOTAiOjYzLjUsIkMiOjI5Mi4xLCJDMSI6NjMuNSwic3RhdHVzIjoidmVyaWZpemllcnQiLCJibG9ja2VkRmllbGRzIjpbXSwiYmxvY2tlciI6bnVsbH1dfSwicmVkdXppZXJ1bmciOnsic3RhdHVzIjoidmVyaWZpemllcnQiLCJxdWVsbGUiOiJFeGNlbCBSZWR1emllcnVuZ2VuLCBaZWlsZW4gNS04MyIsInJlaWhlbiI6eyJBIjp7ImxhYmVsIjoibWV0cmlzY2ggRE4iLCJyb3dzIjpbeyJ2b25JZCI6IkROMDgiLCJuYWNoSWQiOiJETjA2IiwiTCI6MzgsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6IkROMTAiLCJuYWNoSWQiOiJETjA2IiwiTCI6MzgsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6IkROMTAiLCJuYWNoSWQiOiJETjA4IiwiTCI6MzgsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6IkROMTUiLCJuYWNoSWQiOiJETjA4IiwiTCI6NjAsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6IkROMTUiLCJuYWNoSWQiOiJETjEwIiwiTCI6NjAsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6IkROMjAiLCJuYWNoSWQiOiJETjEwIiwiTCI6NjAsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6IkROMjAiLCJuYWNoSWQiOiJETjE1IiwiTCI6NjAsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6IkROMjUiLCJuYWNoSWQiOiJETjE1IiwiTCI6NzAsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6IkROMjUiLCJuYWNoSWQiOiJETjIwIiwiTCI6NzAsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6IkROMzIiLCJuYWNoSWQiOiJETjIwIiwiTCI6ODAsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6IkROMzIiLCJuYWNoSWQiOiJETjI1IiwiTCI6ODAsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6IkRONDAiLCJuYWNoSWQiOiJETjIwIiwiTCI6OTAsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6IkRONDAiLCJuYWNoSWQiOiJETjI1IiwiTCI6OTAsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6IkRONDAiLCJuYWNoSWQiOiJETjMyIiwiTCI6OTAsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6IkRONTAiLCJuYWNoSWQiOiJETjI1IiwiTCI6OTAsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6IkRONTAiLCJuYWNoSWQiOiJETjMyIiwiTCI6OTAsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6IkRONTAiLCJuYWNoSWQiOiJETjQwIiwiTCI6OTAsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6IkRONjUiLCJuYWNoSWQiOiJETjQwIiwiTCI6MTEwLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsidm9uSWQiOiJETjY1IiwibmFjaElkIjoiRE41MCIsIkwiOjExMCwic3RhdHVzIjoidmVyaWZpemllcnQifSx7InZvbklkIjoiRE44MCIsIm5hY2hJZCI6IkRONTAiLCJMIjoxMTAsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6IkROODAiLCJuYWNoSWQiOiJETjY1IiwiTCI6MTEwLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsidm9uSWQiOiJETjEwMCIsIm5hY2hJZCI6IkRONjUiLCJMIjoxMzUsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6IkROMTAwIiwibmFjaElkIjoiRE44MCIsIkwiOjEzNSwic3RhdHVzIjoidmVyaWZpemllcnQifSx7InZvbklkIjoiRE4xMjUiLCJuYWNoSWQiOiJETjgwIiwiTCI6MTUwLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsidm9uSWQiOiJETjEyNSIsIm5hY2hJZCI6IkROMTAwIiwiTCI6MTUwLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsidm9uSWQiOiJETjE1MCIsIm5hY2hJZCI6IkROMTAwIiwiTCI6MTcwLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsidm9uSWQiOiJETjE1MCIsIm5hY2hJZCI6IkROMTI1IiwiTCI6MTcwLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsidm9uSWQiOiJETjIwMCIsIm5hY2hJZCI6IkROMTI1IiwiTCI6MjMwLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsidm9uSWQiOiJETjIwMCIsIm5hY2hJZCI6IkROMTUwIiwiTCI6MjMwLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9XX0sIkIiOnsibGFiZWwiOiJJU09cL09EIE5XIiwicm93cyI6W3sidm9uSWQiOiJOVzEzLjUiLCJuYWNoSWQiOiJOVzEwLjIiLCJMIjozOCwic3RhdHVzIjoidmVyaWZpemllcnQifSx7InZvbklkIjoiTlcxNy4yIiwibmFjaElkIjoiTlcxMC4yIiwiTCI6NjAsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6Ik5XMTcuMiIsIm5hY2hJZCI6Ik5XMTMuNSIsIkwiOjYwLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsidm9uSWQiOiJOVzIxLjMiLCJuYWNoSWQiOiJOVzEzLjUiLCJMIjo2MCwic3RhdHVzIjoidmVyaWZpemllcnQifSx7InZvbklkIjoiTlcyMS4zIiwibmFjaElkIjoiTlcxNy4yIiwiTCI6NjAsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6Ik5XMjYuOSIsIm5hY2hJZCI6Ik5XMTcuMiIsIkwiOjYwLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsidm9uSWQiOiJOVzI2LjkiLCJuYWNoSWQiOiJOVzIxLjMiLCJMIjo2MCwic3RhdHVzIjoidmVyaWZpemllcnQifSx7InZvbklkIjoiTlczMy43IiwibmFjaElkIjoiTlcyMS4zIiwiTCI6NzAsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6Ik5XMzMuNyIsIm5hY2hJZCI6Ik5XMjYuOSIsIkwiOjcwLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsidm9uSWQiOiJOVzQyLjQiLCJuYWNoSWQiOiJOVzI2LjkiLCJMIjo4MCwic3RhdHVzIjoidmVyaWZpemllcnQifSx7InZvbklkIjoiTlc0Mi40IiwibmFjaElkIjoiTlczMy43IiwiTCI6ODAsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6Ik5XNDguMyIsIm5hY2hJZCI6Ik5XMjYuOSIsIkwiOjkwLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsidm9uSWQiOiJOVzQ4LjMiLCJuYWNoSWQiOiJOVzMzLjciLCJMIjo5MCwic3RhdHVzIjoidmVyaWZpemllcnQifSx7InZvbklkIjoiTlc0OC4zIiwibmFjaElkIjoiTlc0Mi40IiwiTCI6OTAsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6Ik5XNjAuMyIsIm5hY2hJZCI6Ik5XMzMuNyIsIkwiOjEwMCwic3RhdHVzIjoidmVyaWZpemllcnQifSx7InZvbklkIjoiTlc2MC4zIiwibmFjaElkIjoiTlc0Mi40IiwiTCI6MTAwLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsidm9uSWQiOiJOVzYwLjMiLCJuYWNoSWQiOiJOVzQ4LjMiLCJMIjoxMDAsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6Ik5XNzYuMSIsIm5hY2hJZCI6Ik5XNDguMyIsIkwiOjExMCwic3RhdHVzIjoidmVyaWZpemllcnQifSx7InZvbklkIjoiTlc3Ni4xIiwibmFjaElkIjoiTlc2MC4zIiwiTCI6MTEwLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsidm9uSWQiOiJOVzg4LjkiLCJuYWNoSWQiOiJOVzYwLjMiLCJMIjoxMTAsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6Ik5XODguOSIsIm5hY2hJZCI6Ik5XNzYuMSIsIkwiOjExMCwic3RhdHVzIjoidmVyaWZpemllcnQifSx7InZvbklkIjoiTlcxMTQuMyIsIm5hY2hJZCI6Ik5XNzYuMSIsIkwiOjEzNSwic3RhdHVzIjoidmVyaWZpemllcnQifSx7InZvbklkIjoiTlcxMTQuMyIsIm5hY2hJZCI6Ik5XODguOSIsIkwiOjEzNSwic3RhdHVzIjoidmVyaWZpemllcnQifSx7InZvbklkIjoiTlcxMzkuNyIsIm5hY2hJZCI6Ik5XODguOSIsIkwiOjE1MCwic3RhdHVzIjoidmVyaWZpemllcnQifSx7InZvbklkIjoiTlcxMzkuNyIsIm5hY2hJZCI6Ik5XMTE0LjMiLCJMIjoxNTAsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6Ik5XMTY4LjMiLCJuYWNoSWQiOiJOVzExNC4zIiwiTCI6MTcwLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsidm9uSWQiOiJOVzE2OC4zIiwibmFjaElkIjoiTlcxMzkuNyIsIkwiOjE3MCwic3RhdHVzIjoidmVyaWZpemllcnQifSx7InZvbklkIjoiTlcyMTkuMSIsIm5hY2hJZCI6Ik5XMTM5LjciLCJMIjoyMzAsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6Ik5XMjE5LjEiLCJuYWNoSWQiOiJOVzE2OC4zIiwiTCI6MjMwLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9XX0sIkMiOnsibGFiZWwiOiJab2xsIiwicm93cyI6W3sidm9uSWQiOiIwLjM3NSIsIm5hY2hJZCI6IjAuMjUiLCJMIjo0MS4yOCwic3RhdHVzIjoidmVyaWZpemllcnQifSx7InZvbklkIjoiMC41IiwibmFjaElkIjoiMC4yNSIsIkwiOjQ3LjYzLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsidm9uSWQiOiIwLjUiLCJuYWNoSWQiOiIwLjM3NSIsIkwiOjQ3LjYzLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsidm9uSWQiOiIwLjc1IiwibmFjaElkIjoiMC4zNzUiLCJMIjo1MC44LCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsidm9uSWQiOiIwLjc1IiwibmFjaElkIjoiMC41IiwiTCI6NTMuOTgsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6IjEiLCJuYWNoSWQiOiIwLjUiLCJMIjo2My41LCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsidm9uSWQiOiIxIiwibmFjaElkIjoiMC43NSIsIkwiOjUzLjk4LCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsidm9uSWQiOiIxLjUiLCJuYWNoSWQiOiIwLjc1IiwiTCI6NzYuMiwic3RhdHVzIjoidmVyaWZpemllcnQifSx7InZvbklkIjoiMS41IiwibmFjaElkIjoiMSIsIkwiOjYzLjUsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6IjIiLCJuYWNoSWQiOiIxIiwiTCI6ODUuNzMsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6IjIiLCJuYWNoSWQiOiIxLjUiLCJMIjo2My41LCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsidm9uSWQiOiIyLjUiLCJuYWNoSWQiOiIxLjUiLCJMIjo4NS43Mywic3RhdHVzIjoidmVyaWZpemllcnQifSx7InZvbklkIjoiMi41IiwibmFjaElkIjoiMiIsIkwiOjYzLjUsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6IjMiLCJuYWNoSWQiOiIxLjUiLCJMIjoxMDcuOTUsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6IjMiLCJuYWNoSWQiOiIyIiwiTCI6ODUuNzMsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6IjMiLCJuYWNoSWQiOiIyLjUiLCJMIjo2Ni42OCwic3RhdHVzIjoidmVyaWZpemllcnQifSx7InZvbklkIjoiNCIsIm5hY2hJZCI6IjIiLCJMIjoxMzAuMTgsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6IjQiLCJuYWNoSWQiOiIyLjUiLCJMIjoxMDcuOTUsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6IjQiLCJuYWNoSWQiOiIzIiwiTCI6OTguNDMsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6IjYiLCJuYWNoSWQiOiIzIiwiTCI6MTg0LjE1LCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsidm9uSWQiOiI2IiwibmFjaElkIjoiNCIsIkwiOjE0Mi44OCwic3RhdHVzIjoidmVyaWZpemllcnQifV19fX0sInRTdHVlY2tHbGVpY2giOnsic3RhdHVzIjoidmVyaWZpemllcnQiLCJxdWVsbGUiOiJULVN0dWVja2UueGxzeCAoQmVybmQsIDIzLjA3LjIwMjYpLCBCbGF0dCBUYWJsZSAxIC0gZG9wcGVsdCBleHRyYWhpZXJ0IChvcGVucHl4bCArIFJvaC1YTUwsIDAgQWJ3ZWljaHVuZ2VuKSB1bmQgZ2VnZW4gZGllIHZlcmlmaXppZXJ0ZW4gUnVuZGUtNC1XZXJ0ZSBnZXBydWVmdC4gRE4yMDA6IGw9MzAwIHdhciBlaW4gVWViZXJ0cmFndW5nc2ZlaGxlciBpbiBkZXIgVGFiZWxsZSwgQmVybmQgaGF0IGFtIDI3LjA3LjIwMjYgbD02MDAgYmVzdGFldGlndC4iLCJyZWloZW4iOnsiQSI6eyJzdGF0dXMiOiJ2ZXJpZml6aWVydCIsImxhYmVsIjoibWV0cmlzY2ggRE4iLCJyb3dzIjpbeyJpZCI6IkROMDYiLCJMMCI6MzAsIkwiOjYwLCJMMiI6MzAsIkwxIjoiMTEifSx7ImlkIjoiRE4wOCIsIkwwIjozMCwiTCI6NjAsIkwyIjozMCwiTDEiOiIxMSJ9LHsiaWQiOiJETjEwIiwiTDAiOjM1LCJMIjo3MCwiTDIiOjM1LCJMMSI6IjExIn0seyJpZCI6IkROMTUiLCJMMCI6MzUsIkwiOjcwLCJMMiI6MzUsIkwxIjoiMTEgXHUwMGIxIDAsNTAifSx7ImlkIjoiRE4yMCIsIkwwIjo0MCwiTCI6ODAsIkwyIjo0MCwiTDEiOiIxMyBcdTAwYjEgMCw1MCJ9LHsiaWQiOiJETjI1IiwiTDAiOjUwLCJMIjoxMDAsIkwyIjo1MCwiTDEiOiIxNiBcdTAwYjEgMCw3NSJ9LHsiaWQiOiJETjMyIiwiTDAiOjU1LCJMIjoxMTAsIkwyIjo1NSwiTDEiOiIxOSw1IFx1MDBiMSAwLDc1In0seyJpZCI6IkRONDAiLCJMMCI6NjAsIkwiOjEyMCwiTDIiOjYwLCJMMSI6IjIzIFx1MDBiMSAxIn0seyJpZCI6IkRONTAiLCJMMCI6ODAsIkwiOjE2MCwiTDIiOjgwLCJMMSI6IjMwIFx1MDBiMSAxIn0seyJpZCI6IkRONjUiLCJMMCI6MTA1LCJMIjoyMTAsIkwyIjoxMDUsIkwxIjoiNDAgXHUwMGIxIDEsNTAifSx7ImlkIjoiRE44MCIsIkwwIjoxMzAsIkwiOjI2MCwiTDIiOjEzMCwiTDEiOiI0Nyw1IFx1MDBiMSAxLDUwIn0seyJpZCI6IkROMTAwIiwiTDAiOjE1NSwiTCI6MzEwLCJMMiI6MTU1LCJMMSI6IjU4IFx1MDBiMSAxLDUwIn0seyJpZCI6IkROMTI1IiwiTDAiOjE4Ny41LCJMIjozNzUsIkwyIjoxODcuNSwiTDEiOiI3NCBcdTAwYjEgMyJ9LHsiaWQiOiJETjE1MCIsIkwwIjoyMjUsIkwiOjQ1MCwiTDIiOjIyNSwiTDEiOiI5MCBcdTAwYjEgMyJ9LHsiaWQiOiJETjIwMCIsIkwwIjozMDAsIkwiOjYwMCwiTDIiOjMwMCwiTDEiOiIxMTUgXHUwMGIxIDMifV19LCJCIjp7InN0YXR1cyI6InZlcmlmaXppZXJ0IiwibGFiZWwiOiJJU09cL09EIE5XIiwicm93cyI6W3siaWQiOiJOVzEwLjIiLCJMMCI6MzAsIkwiOjYwLCJMMiI6MzAsIkwxIjoiMTEifSx7ImlkIjoiTlcxMy41IiwiTDAiOjMyLCJMIjo2NCwiTDIiOjMyLCJMMSI6IjExIn0seyJpZCI6Ik5XMTcuMiIsIkwwIjozNCwiTCI6NjgsIkwyIjozNCwiTDEiOiIxMCwxIFx1MDBiMSAwLDUifSx7ImlkIjoiTlcyMS4zIiwiTDAiOjM2LCJMIjo3MiwiTDIiOjM2LCJMMSI6IjEyLDIgXHUwMGIxIDAsNSJ9LHsiaWQiOiJOVzI2LjkiLCJMMCI6NTUsIkwiOjExMCwiTDIiOjU1LCJMMSI6IjE1IFx1MDBiMSAwLDUifSx7ImlkIjoiTlczMy43IiwiTDAiOjYwLCJMIjoxMjAsIkwyIjo2MCwiTDEiOiIxOCw0IFx1MDBiMSAwLDc1In0seyJpZCI6Ik5XNDIuNCIsIkwwIjo2NSwiTCI6MTMwLCJMMiI6NjUsIkwxIjoiMjMsMiBcdTAwYjEgMCw3NSJ9LHsiaWQiOiJOVzQ4LjMiLCJMMCI6NjUsIkwiOjEzMCwiTDIiOjY1LCJMMSI6IjI2LDcgXHUwMGIxIDEifSx7ImlkIjoiTlc2MC4zIiwiTDAiOjkwLCJMIjoxODAsIkwyIjo5MCwiTDEiOiIzMyw3IFx1MDBiMSAxIn0seyJpZCI6Ik5XNzYuMSIsIkwwIjoxMTAsIkwiOjIyMCwiTDIiOjExMCwiTDEiOiI0MywxIFx1MDBiMSAxLDUifSx7ImlkIjoiTlc4OC45IiwiTDAiOjEzMCwiTCI6MjYwLCJMMiI6MTMwLCJMMSI6IjQ5LDUgXHUwMGIxIDEsNSJ9LHsiaWQiOiJOVzExNC4zIiwiTDAiOjE2MCwiTCI6MzIwLCJMMiI6MTYwLCJMMSI6IjYzLDIgXHUwMGIxIDEsNSJ9LHsiaWQiOiJOVzEzOS43IiwiTDAiOjIwMCwiTCI6NDAwLCJMMiI6MjAwLCJMMSI6Ijc5LDkgXHUwMGIxIDMifSx7ImlkIjoiTlcxNjguMyIsIkwwIjoyNTAsIkwiOjUwMCwiTDIiOjI1MCwiTDEiOiI5NywyIFx1MDBiMSAzIn0seyJpZCI6Ik5XMjE5LjEiLCJMMCI6MzAwLCJMIjo2MDAsIkwyIjozMDAsIkwxIjoiMTIzLDYgXHUwMGIxIDQifV19LCJDIjp7InN0YXR1cyI6InZlcmlmaXppZXJ0IiwibGFiZWwiOiJab2xsIiwicm93cyI6W3siaWQiOiIwLjI1IiwiTDAiOjQ0LjUsIkwiOjg5LCJMMiI6NDQuNSwiTDEiOiIxMSJ9LHsiaWQiOiIwLjM3NSIsIkwwIjo0NC41LCJMIjo4OSwiTDIiOjQ0LjUsIkwxIjoiMTEifSx7ImlkIjoiMC41IiwiTDAiOjQ3LjYsIkwiOjk1LjIsIkwyIjo0Ny42LCJMMSI6IjExIn0seyJpZCI6IjAuNzUiLCJMMCI6NTAuOCwiTCI6MTAxLjYsIkwyIjo1MC44LCJMMSI6IjExIFx1MDBiMSAwLDUifSx7ImlkIjoiMSIsIkwwIjo1NCwiTCI6MTA4LCJMMiI6NTQsIkwxIjoiMTQsMiBcdTAwYjEgMCw1In0seyJpZCI6IjEuNSIsIkwwIjo2MC4zLCJMIjoxMjAuNiwiTDIiOjYwLjMsIkwxIjoiMjEsMSBcdTAwYjEgMCw3NSJ9LHsiaWQiOiIyIiwiTDAiOjczLCJMIjoxNDYsIkwyIjo3MywiTDEiOiIyOCw5IFx1MDBiMSAxIn0seyJpZCI6IjIuNSIsIkwwIjo3OS40LCJMIjoxNTguOCwiTDIiOjc5LjQsIkwxIjoiMzUsMyBcdTAwYjEgMSJ9LHsiaWQiOiIzIiwiTDAiOjg1LjcsIkwiOjE3MS40LCJMMiI6ODUuNywiTDEiOiI0MywxIFx1MDBiMSAxLDUifSx7ImlkIjoiNCIsIkwwIjoxMDQuOCwiTCI6MjA5LjYsIkwyIjoxMDQuOCwiTDEiOiI1Niw4IFx1MDBiMSAxLDUifSx7ImlkIjoiNiIsIkwwIjoxNDIuOSwiTCI6Mjg1LjgsIkwyIjoxNDIuOSwiTDEiOiI5MCwxIFx1MDBiMSAzIn1dfX19LCJ0U3R1ZWNrUmVkdXppZXJ0Ijp7InN0YXR1cyI6InZlcmlmaXppZXJ0IiwicXVlbGxlIjoiVC1TdHVlY2tlLnhsc3ggKEJlcm5kLCAyMy4wNy4yMDI2KSwgQmxhdHQgVGFibGUgMSAtIGRvcHBlbHQgZXh0cmFoaWVydCAob3BlbnB5eGwgKyBSb2gtWE1MLCAwIEFid2VpY2h1bmdlbikuIEROMjAwIHJlZHV6aWVydCAoMjAwXC8xMDAsIDIwMFwvMTI1LCAyMDBcLzE1MCkgaXN0IHNlaXQgQmVybmRzIEJlc3RhZXRpZ3VuZyB2b20gMjcuMDcuMjAyNiBmcmVpOiBsID0gNjAwIChcImhhYmUgaWNoIHdvaGwgdmVyZ2Vzc2VuIGVpbnp1dHJhZ2VuXCIpLiIsInJlaWhlbiI6eyJBIjp7InN0YXR1cyI6InZlcmlmaXppZXJ0Iiwicm93cyI6W3sidm9uSWQiOiJETjA4IiwibmFjaElkIjoiRE4wNiIsIkwwIjozMCwiTCI6NjAsIkwyIjozMCwiTDEiOiIxMSIsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6IkROMTAiLCJuYWNoSWQiOiJETjA2IiwiTDAiOjMwLCJMIjo2MCwiTDIiOjMwLCJMMSI6IjExIiwic3RhdHVzIjoidmVyaWZpemllcnQifSx7InZvbklkIjoiRE4xMCIsIm5hY2hJZCI6IkROMDgiLCJMMCI6MzAsIkwiOjYwLCJMMiI6MzAsIkwxIjoiMTEiLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsidm9uSWQiOiJETjE1IiwibmFjaElkIjoiRE4wOCIsIkwwIjozNSwiTCI6NzAsIkwyIjozNSwiTDEiOiIxMSBcdTAwYjEgMCw1MCIsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6IkROMTUiLCJuYWNoSWQiOiJETjEwIiwiTDAiOjM1LCJMIjo3MCwiTDIiOjM1LCJMMSI6IjExIFx1MDBiMSAwLDUwIiwic3RhdHVzIjoidmVyaWZpemllcnQifSx7InZvbklkIjoiRE4yMCIsIm5hY2hJZCI6IkROMTAiLCJMMCI6NDAsIkwiOjgwLCJMMiI6NDAsIkwxIjoiMTMgXHUwMGIxIDAsNTAiLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsidm9uSWQiOiJETjIwIiwibmFjaElkIjoiRE4xNSIsIkwwIjo0MCwiTCI6ODAsIkwyIjo0MCwiTDEiOiIxMyBcdTAwYjEgMCw1MCIsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6IkROMjUiLCJuYWNoSWQiOiJETjE1IiwiTDAiOjUwLCJMIjoxMDAsIkwyIjo1MCwiTDEiOiIxNiBcdTAwYjEgMCw3NSIsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6IkROMjUiLCJuYWNoSWQiOiJETjIwIiwiTDAiOjUwLCJMIjoxMDAsIkwyIjo1MCwiTDEiOiIxNiBcdTAwYjEgMCw3NSIsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6IkROMzIiLCJuYWNoSWQiOiJETjE1IiwiTDAiOjU1LCJMIjoxMTAsIkwyIjo1NSwiTDEiOiIxOSBcdTAwYjEgMCw3NSIsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6IkROMzIiLCJuYWNoSWQiOiJETjIwIiwiTDAiOjU1LCJMIjoxMTAsIkwyIjo1NSwiTDEiOiIxOSBcdTAwYjEgMCw3NSIsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6IkROMzIiLCJuYWNoSWQiOiJETjI1IiwiTDAiOjU1LCJMIjoxMTAsIkwyIjo1NSwiTDEiOiIxOSBcdTAwYjEgMCw3NSIsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6IkRONDAiLCJuYWNoSWQiOiJETjIwIiwiTDAiOjYwLCJMIjoxMjAsIkwyIjo2MCwiTDEiOiIyMiBcdTAwYjEgMCw3NSIsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6IkRONDAiLCJuYWNoSWQiOiJETjI1IiwiTDAiOjYwLCJMIjoxMjAsIkwyIjo2MCwiTDEiOiIyMiBcdTAwYjEgMCw3NSIsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6IkRONDAiLCJuYWNoSWQiOiJETjMyIiwiTDAiOjYwLCJMIjoxMjAsIkwyIjo2MCwiTDEiOiIyMiw1IFx1MDBiMSAwLDc1Iiwic3RhdHVzIjoidmVyaWZpemllcnQifSx7InZvbklkIjoiRE41MCIsIm5hY2hJZCI6IkROMjUiLCJMMCI6ODAsIkwiOjE2MCwiTDIiOjgwLCJMMSI6IjI4IFx1MDBiMSAwLDc1Iiwic3RhdHVzIjoidmVyaWZpemllcnQifSx7InZvbklkIjoiRE41MCIsIm5hY2hJZCI6IkROMzIiLCJMMCI6ODAsIkwiOjE2MCwiTDIiOjgwLCJMMSI6IjI4LDUgXHUwMGIxIDAsNzUiLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsidm9uSWQiOiJETjUwIiwibmFjaElkIjoiRE40MCIsIkwwIjo4MCwiTCI6MTYwLCJMMiI6ODAsIkwxIjoiMjkgXHUwMGIxIDEiLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsidm9uSWQiOiJETjY1IiwibmFjaElkIjoiRE4zMiIsIkwwIjoxMDUsIkwiOjIxMCwiTDIiOjgwLCJMMSI6IjM3IFx1MDBiMSAwLDc1Iiwic3RhdHVzIjoidmVyaWZpemllcnQifSx7InZvbklkIjoiRE42NSIsIm5hY2hJZCI6IkRONDAiLCJMMCI6MTA1LCJMIjoyMTAsIkwyIjo4MCwiTDEiOiIzNyw1IFx1MDBiMSAxIiwic3RhdHVzIjoidmVyaWZpemllcnQifSx7InZvbklkIjoiRE42NSIsIm5hY2hJZCI6IkRONTAiLCJMMCI6MTA1LCJMIjoyMTAsIkwyIjo4MCwiTDEiOiIzOCw1IFx1MDBiMSAxIiwic3RhdHVzIjoidmVyaWZpemllcnQifSx7InZvbklkIjoiRE44MCIsIm5hY2hJZCI6IkRONDAiLCJMMCI6MTMwLCJMIjoyNjAsIkwyIjoxMDUsIkwxIjoiNDUgXHUwMGIxIDEiLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsidm9uSWQiOiJETjgwIiwibmFjaElkIjoiRE41MCIsIkwwIjoxMzAsIkwiOjI2MCwiTDIiOjEwNSwiTDEiOiI0NiBcdTAwYjEgMSIsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6IkROODAiLCJuYWNoSWQiOiJETjY1IiwiTDAiOjEzMCwiTCI6MjYwLCJMMiI6MTA1LCJMMSI6IjQ3LDUgXHUwMGIxIDEsNTAiLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsidm9uSWQiOiJETjEwMCIsIm5hY2hJZCI6IkRONTAiLCJMMCI6MTU1LCJMIjozMTAsIkwyIjoxMzAsIkwxIjoiNTUsNSBcdTAwYjEgMSIsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6IkROMTAwIiwibmFjaElkIjoiRE42NSIsIkwwIjoxNTUsIkwiOjMxMCwiTDIiOjEzMCwiTDEiOiI1NyBcdTAwYjEgMSw1MCIsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6IkROMTAwIiwibmFjaElkIjoiRE44MCIsIkwwIjoxNTUsIkwiOjMxMCwiTDIiOjEzMCwiTDEiOiI1NyBcdTAwYjEgMSw1MCIsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6IkROMTI1IiwibmFjaElkIjoiRE42NSIsIkwwIjoxODcuNSwiTCI6Mzc1LCJMMiI6MTU1LCJMMSI6IjY5LDUgXHUwMGIxIDEsNTAiLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsidm9uSWQiOiJETjEyNSIsIm5hY2hJZCI6IkROODAiLCJMMCI6MTg3LjUsIkwiOjM3NSwiTDIiOjE1NSwiTDEiOiI2OSw1IFx1MDBiMSAxLDUwIiwic3RhdHVzIjoidmVyaWZpemllcnQifSx7InZvbklkIjoiRE4xMjUiLCJuYWNoSWQiOiJETjEwMCIsIkwwIjoxODcuNSwiTCI6Mzc1LCJMMiI6MTU1LCJMMSI6IjcwLDUgXHUwMGIxIDEsNTAiLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsidm9uSWQiOiJETjE1MCIsIm5hY2hJZCI6IkROODAiLCJMMCI6MjI1LCJMIjo0NTAsIkwyIjoxODcuNSwiTDEiOiI4MiBcdTAwYjEgMSw1MCIsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6IkROMTUwIiwibmFjaElkIjoiRE4xMDAiLCJMMCI6MjI1LCJMIjo0NTAsIkwyIjoxODcuNSwiTDEiOiI4MyBcdTAwYjEgMSw1MCIsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6IkROMTUwIiwibmFjaElkIjoiRE4xMjUiLCJMMCI6MjI1LCJMIjo0NTAsIkwyIjoxODcuNSwiTDEiOiI4Niw1IFx1MDBiMSAzIiwic3RhdHVzIjoidmVyaWZpemllcnQifSx7InZvbklkIjoiRE4yMDAiLCJuYWNoSWQiOiJETjEwMCIsIkwwIjozMDAsIkwiOjYwMCwiTDIiOjIyNSwiTDEiOiIxMDggXHUwMGIxIDEsNTAiLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsidm9uSWQiOiJETjIwMCIsIm5hY2hJZCI6IkROMTI1IiwiTDAiOjMwMCwiTCI6NjAwLCJMMiI6MjI1LCJMMSI6IjExMSw1IFx1MDBiMSAzIiwic3RhdHVzIjoidmVyaWZpemllcnQifSx7InZvbklkIjoiRE4yMDAiLCJuYWNoSWQiOiJETjE1MCIsIkwwIjozMDAsIkwiOjYwMCwiTDIiOjIyNSwiTDEiOiIxMTUgXHUwMGIxIDMiLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9XX0sIkIiOnsic3RhdHVzIjoidmVyaWZpemllcnQiLCJyb3dzIjpbeyJ2b25JZCI6Ik5XMTMuNSIsIm5hY2hJZCI6Ik5XMTAuMiIsIkwwIjozMiwiTCI6NjQsIkwyIjozMiwiTDEiOiIxMSIsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6Ik5XMTcuMiIsIm5hY2hJZCI6Ik5XMTAuMiIsIkwwIjozNCwiTCI6NjgsIkwyIjozNCwiTDEiOiIxMCwxIFx1MDBiMSAwLDUiLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsidm9uSWQiOiJOVzE3LjIiLCJuYWNoSWQiOiJOVzEzLjUiLCJMMCI6MzQsIkwiOjY4LCJMMiI6MzQsIkwxIjoiMTAsMSBcdTAwYjEgMCw1Iiwic3RhdHVzIjoidmVyaWZpemllcnQifSx7InZvbklkIjoiTlcyMS4zIiwibmFjaElkIjoiTlcxMC4yIiwiTDAiOjM2LCJMIjo3MiwiTDIiOjM2LCJMMSI6IjEyLDIgXHUwMGIxIDAsNSIsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6Ik5XMjEuMyIsIm5hY2hJZCI6Ik5XMTMuNSIsIkwwIjozNiwiTCI6NzIsIkwyIjozNiwiTDEiOiIxMiwyIFx1MDBiMSAwLDUiLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsidm9uSWQiOiJOVzIxLjMiLCJuYWNoSWQiOiJOVzE3LjIiLCJMMCI6MzYsIkwiOjcyLCJMMiI6MzYsIkwxIjoiMTIsMiBcdTAwYjEgMCw1Iiwic3RhdHVzIjoidmVyaWZpemllcnQifSx7InZvbklkIjoiTlcyNi45IiwibmFjaElkIjoiTlcxMy41IiwiTDAiOjU1LCJMIjoxMTAsIkwyIjo1NSwiTDEiOiIxNSBcdTAwYjEgMCw1Iiwic3RhdHVzIjoidmVyaWZpemllcnQifSx7InZvbklkIjoiTlcyNi45IiwibmFjaElkIjoiTlcxNy4yIiwiTDAiOjU1LCJMIjoxMTAsIkwyIjo1NSwiTDEiOiIxNSBcdTAwYjEgMCw1Iiwic3RhdHVzIjoidmVyaWZpemllcnQifSx7InZvbklkIjoiTlcyNi45IiwibmFjaElkIjoiTlcyMS4zIiwiTDAiOjU1LCJMIjoxMTAsIkwyIjo1NSwiTDEiOiIxNSBcdTAwYjEgMCw1Iiwic3RhdHVzIjoidmVyaWZpemllcnQifSx7InZvbklkIjoiTlczMy43IiwibmFjaElkIjoiTlcxNy4yIiwiTDAiOjYwLCJMIjoxMjAsIkwyIjo2MCwiTDEiOiIxOCw0IFx1MDBiMSAwLDUiLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsidm9uSWQiOiJOVzMzLjciLCJuYWNoSWQiOiJOVzIxLjMiLCJMMCI6NjAsIkwiOjEyMCwiTDIiOjYwLCJMMSI6IjE4LDQgXHUwMGIxIDAsNSIsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6Ik5XMzMuNyIsIm5hY2hJZCI6Ik5XMjYuOSIsIkwwIjo2MCwiTCI6MTIwLCJMMiI6NjAsIkwxIjoiMTgsNCBcdTAwYjEgMCw1Iiwic3RhdHVzIjoidmVyaWZpemllcnQifSx7InZvbklkIjoiTlc0Mi40IiwibmFjaElkIjoiTlcyMS4zIiwiTDAiOjY1LCJMIjoxMzAsIkwyIjo2NSwiTDEiOiIyMiw3IFx1MDBiMSAwLDUiLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsidm9uSWQiOiJOVzQyLjQiLCJuYWNoSWQiOiJOVzI2LjkiLCJMMCI6NjUsIkwiOjEzMCwiTDIiOjY1LCJMMSI6IjIyLDcgXHUwMGIxIDAsNSIsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6Ik5XNDIuNCIsIm5hY2hJZCI6Ik5XMzMuNyIsIkwwIjo2NSwiTCI6MTMwLCJMMiI6NjUsIkwxIjoiMjIsNyBcdTAwYjEgMCw3NSIsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6Ik5XNDguMyIsIm5hY2hJZCI6Ik5XMjYuOSIsIkwwIjo2NSwiTCI6MTMwLCJMMiI6NjUsIkwxIjoiMjUsNyBcdTAwYjEgMCw1Iiwic3RhdHVzIjoidmVyaWZpemllcnQifSx7InZvbklkIjoiTlc0OC4zIiwibmFjaElkIjoiTlczMy43IiwiTDAiOjY1LCJMIjoxMzAsIkwyIjo2NSwiTDEiOiIyNSw3IFx1MDBiMSAwLDc1Iiwic3RhdHVzIjoidmVyaWZpemllcnQifSx7InZvbklkIjoiTlc0OC4zIiwibmFjaElkIjoiTlc0Mi40IiwiTDAiOjY1LCJMIjoxMzAsIkwyIjo2NSwiTDEiOiIyNiwyIFx1MDBiMSAwLDc1Iiwic3RhdHVzIjoidmVyaWZpemllcnQifSx7InZvbklkIjoiTlc2MC4zIiwibmFjaElkIjoiTlczMy43IiwiTDAiOjkwLCJMIjoxODAsIkwyIjo5MCwiTDEiOiIzMSw3IFx1MDBiMSAwLDc1Iiwic3RhdHVzIjoidmVyaWZpemllcnQifSx7InZvbklkIjoiTlc2MC4zIiwibmFjaElkIjoiTlc0Mi40IiwiTDAiOjkwLCJMIjoxODAsIkwyIjo5MCwiTDEiOiIzMiwyIFx1MDBiMSAwLDc1Iiwic3RhdHVzIjoidmVyaWZpemllcnQifSx7InZvbklkIjoiTlc2MC4zIiwibmFjaElkIjoiTlc0OC4zIiwiTDAiOjkwLCJMIjoxODAsIkwyIjo5MCwiTDEiOiIzMiw3IFx1MDBiMSAxIiwic3RhdHVzIjoidmVyaWZpemllcnQifSx7InZvbklkIjoiTlc3Ni4xIiwibmFjaElkIjoiTlc0Mi40IiwiTDAiOjExMCwiTCI6MjIwLCJMMiI6OTAsIkwxIjoiNDAsMSBcdTAwYjEgMCw3NSIsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6Ik5XNzYuMSIsIm5hY2hJZCI6Ik5XNDguMyIsIkwwIjoxMTAsIkwiOjIyMCwiTDIiOjkwLCJMMSI6IjQwLDYgXHUwMGIxIDEiLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsidm9uSWQiOiJOVzc2LjEiLCJuYWNoSWQiOiJOVzYwLjMiLCJMMCI6MTEwLCJMIjoyMjAsIkwyIjo5MCwiTDEiOiI0MSw2IFx1MDBiMSAxIiwic3RhdHVzIjoidmVyaWZpemllcnQifSx7InZvbklkIjoiTlc4OC45IiwibmFjaElkIjoiTlc0OC4zIiwiTDAiOjEzMCwiTCI6MjYwLCJMMiI6MTEwLCJMMSI6IjQ3IFx1MDBiMSAxIiwic3RhdHVzIjoidmVyaWZpemllcnQifSx7InZvbklkIjoiTlc4OC45IiwibmFjaElkIjoiTlc2MC4zIiwiTDAiOjEzMCwiTCI6MjYwLCJMMiI6MTEwLCJMMSI6IjQ4IFx1MDBiMSAxIiwic3RhdHVzIjoidmVyaWZpemllcnQifSx7InZvbklkIjoiTlc4OC45IiwibmFjaElkIjoiTlc3Ni4xIiwiTDAiOjEzMCwiTCI6MjYwLCJMMiI6MTEwLCJMMSI6IjQ5LDUgXHUwMGIxIDEsNSIsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6Ik5XMTE0LjMiLCJuYWNoSWQiOiJOVzYwLjMiLCJMMCI6MTYwLCJMIjozMjAsIkwyIjoxMzAsIkwxIjoiNjAsNyBcdTAwYjEgMSIsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6Ik5XMTE0LjMiLCJuYWNoSWQiOiJOVzc2LjEiLCJMMCI6MTYwLCJMIjozMjAsIkwyIjoxMzAsIkwxIjoiNjIsMiBcdTAwYjEgMSw1Iiwic3RhdHVzIjoidmVyaWZpemllcnQifSx7InZvbklkIjoiTlcxMTQuMyIsIm5hY2hJZCI6Ik5XODguOSIsIkwwIjoxNjAsIkwiOjMyMCwiTDIiOjEzMCwiTDEiOiI2MiwyIFx1MDBiMSAxLDUiLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsidm9uSWQiOiJOVzEzOS43IiwibmFjaElkIjoiTlc3Ni4xIiwiTDAiOjIwMCwiTCI6NDAwLCJMMiI6MTYwLCJMMSI6Ijc0LDkgXHUwMGIxIDEsNSIsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6Ik5XMTM5LjciLCJuYWNoSWQiOiJOVzg4LjkiLCJMMCI6MjAwLCJMIjo0MDAsIkwyIjoxNjAsIkwxIjoiNzQsOSBcdTAwYjEgMSw1Iiwic3RhdHVzIjoidmVyaWZpemllcnQifSx7InZvbklkIjoiTlcxMzkuNyIsIm5hY2hJZCI6Ik5XMTE0LjMiLCJMMCI6MjAwLCJMIjo0MDAsIkwyIjoxNjAsIkwxIjoiNzUsOSBcdTAwYjEgMSw1Iiwic3RhdHVzIjoidmVyaWZpemllcnQifSx7InZvbklkIjoiTlcxNjguMyIsIm5hY2hJZCI6Ik5XODguOSIsIkwwIjoyNTAsIkwiOjUwMCwiTDIiOjIwMCwiTDEiOiI4OSwyIFx1MDBiMSAxLDUiLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsidm9uSWQiOiJOVzE2OC4zIiwibmFjaElkIjoiTlcxMTQuMyIsIkwwIjoyNTAsIkwiOjUwMCwiTDIiOjIwMCwiTDEiOiI5MCwyIFx1MDBiMSAxLDUiLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsidm9uSWQiOiJOVzE2OC4zIiwibmFjaElkIjoiTlcxMzkuNyIsIkwwIjoyNTAsIkwiOjUwMCwiTDIiOjIwMCwiTDEiOiI5NCwyIFx1MDBiMSAzIiwic3RhdHVzIjoidmVyaWZpemllcnQifSx7InZvbklkIjoiTlcyMTkuMSIsIm5hY2hJZCI6Ik5XMTE0LjMiLCJMMCI6MzAwLCJMIjo2MDAsIkwyIjoyNTAsIkwxIjoiMTE1LDYgXHUwMGIxIDEsNSIsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6Ik5XMjE5LjEiLCJuYWNoSWQiOiJOVzEzOS43IiwiTDAiOjMwMCwiTCI6NjAwLCJMMiI6MjUwLCJMMSI6IjExOSw2IFx1MDBiMSAzIiwic3RhdHVzIjoidmVyaWZpemllcnQifSx7InZvbklkIjoiTlcyMTkuMSIsIm5hY2hJZCI6Ik5XMTY4LjMiLCJMMCI6MzAwLCJMIjo2MDAsIkwyIjoyNTAsIkwxIjoiMTIyLDYgXHUwMGIxIDMiLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9XX0sIkMiOnsic3RhdHVzIjoidmVyaWZpemllcnQiLCJyb3dzIjpbeyJ2b25JZCI6IjAuMzc1IiwibmFjaElkIjoiMC4yNSIsIkwwIjo0NC41LCJMIjo4OSwiTDIiOjQ0LjUsIkwxIjoiMTEiLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsidm9uSWQiOiIwLjUiLCJuYWNoSWQiOiIwLjI1IiwiTDAiOjQ3LjYsIkwiOjk1LjIsIkwyIjo0Ny42LCJMMSI6IjExIiwic3RhdHVzIjoidmVyaWZpemllcnQifSx7InZvbklkIjoiMC41IiwibmFjaElkIjoiMC4zNzUiLCJMMCI6NDcuNiwiTCI6OTUuMiwiTDIiOjQ3LjYsIkwxIjoiMTEiLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsidm9uSWQiOiIwLjc1IiwibmFjaElkIjoiMC4zNzUiLCJMMCI6NTAuOCwiTCI6MTAxLjYsIkwyIjo1MC44LCJMMSI6IjExIFx1MDBiMSAwLDUiLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsidm9uSWQiOiIwLjc1IiwibmFjaElkIjoiMC41IiwiTDAiOjUwLjgsIkwiOjEwMS42LCJMMiI6NTAuOCwiTDEiOiIxMSBcdTAwYjEgMCw1Iiwic3RhdHVzIjoidmVyaWZpemllcnQifSx7InZvbklkIjoiMSIsIm5hY2hJZCI6IjAuNSIsIkwwIjo1NCwiTCI6MTA4LCJMMiI6NTQsIkwxIjoiMTQsMiBcdTAwYjEgMCw1Iiwic3RhdHVzIjoidmVyaWZpemllcnQifSx7InZvbklkIjoiMSIsIm5hY2hJZCI6IjAuNzUiLCJMMCI6NTQsIkwiOjEwOCwiTDIiOjU0LCJMMSI6IjE0LDIgXHUwMGIxIDAsNSIsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6IjEuNSIsIm5hY2hJZCI6IjAuNzUiLCJMMCI6NjAuMywiTCI6MTIwLjYsIkwyIjo2MC4zLCJMMSI6IjIwLDYgXHUwMGIxIDAsNSIsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6IjEuNSIsIm5hY2hJZCI6IjEiLCJMMCI6NjAuMywiTCI6MTIwLjYsIkwyIjo2MC4zLCJMMSI6IjIwLDYgXHUwMGIxIDAsNSIsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6IjIiLCJuYWNoSWQiOiIxIiwiTDAiOjczLCJMIjoxNDYsIkwyIjo2Ni43LCJMMSI6IjI2LDkgXHUwMGIxIDAsNSIsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6IjIiLCJuYWNoSWQiOiIxLjUiLCJMMCI6NzMsIkwiOjE0NiwiTDIiOjY2LjcsIkwxIjoiMjcsNCBcdTAwYjEgMCw3NSIsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6IjIuNSIsIm5hY2hJZCI6IjEuNSIsIkwwIjo3OS40LCJMIjoxNTguOCwiTDIiOjczLCJMMSI6IjMzLDggXHUwMGIxIDAsNzUiLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsidm9uSWQiOiIyLjUiLCJuYWNoSWQiOiIyIiwiTDAiOjc5LjQsIkwiOjE1OC44LCJMMiI6NzMsIkwxIjoiMzUsMyBcdTAwYjEgMSIsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6IjMiLCJuYWNoSWQiOiIxLjUiLCJMMCI6ODUuNywiTCI6MTcxLjQsIkwyIjo3OS40LCJMMSI6IjQwLDEgXHUwMGIxIDAsNzUiLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsidm9uSWQiOiIzIiwibmFjaElkIjoiMiIsIkwwIjo4NS43LCJMIjoxNzEuNCwiTDIiOjc5LjQsIkwxIjoiNDEsNiBcdTAwYjEgMSIsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6IjMiLCJuYWNoSWQiOiIyLjUiLCJMMCI6ODUuNywiTCI6MTcxLjQsIkwyIjo3OS40LCJMMSI6IjQxLDYgXHUwMGIxIDEiLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsidm9uSWQiOiI0IiwibmFjaElkIjoiMiIsIkwwIjoxMDQuOCwiTCI6MjA5LjYsIkwyIjo5OC40LCJMMSI6IjU0LDMgXHUwMGIxIDEiLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsidm9uSWQiOiI0IiwibmFjaElkIjoiMi41IiwiTDAiOjEwNC44LCJMIjoyMDkuNiwiTDIiOjk4LjQsIkwxIjoiNTQsMyBcdTAwYjEgMSIsInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJ2b25JZCI6IjQiLCJuYWNoSWQiOiIzIiwiTDAiOjEwNC44LCJMIjoyMDkuNiwiTDIiOjk4LjQsIkwxIjoiNTUsOCBcdTAwYjEgMSw1Iiwic3RhdHVzIjoidmVyaWZpemllcnQifSx7InZvbklkIjoiNiIsIm5hY2hJZCI6IjMiLCJMMCI6MTQyLjksIkwiOjI4NS44LCJMMiI6MTIzLjgsIkwxIjoiODMsMSBcdTAwYjEgMSw1Iiwic3RhdHVzIjoidmVyaWZpemllcnQifSx7InZvbklkIjoiNiIsIm5hY2hJZCI6IjQiLCJMMCI6MTQyLjksIkwiOjI4NS44LCJMMiI6MTMwLjIsIkwxIjoiODMsMSBcdTAwYjEgMSw1Iiwic3RhdHVzIjoidmVyaWZpemllcnQifV19fX19LCJjb25uZWN0Ijp7Im1hcHBpbmciOnsic3RhdHVzIjoidmVyaWZpemllcnQiLCJzZXJpZW4iOnsiMS40NDA0Ijp7IndlcmtzdG9mZiI6IjEuNDQwNCIsIndlcmtzdG9mZkRhdGVuYmxhdHQiOiIxLjQ0MDQifSwiMS40NDM1Ijp7IndlcmtzdG9mZiI6IjEuNDQzNSIsIndlcmtzdG9mZkRhdGVuYmxhdHQiOiIxLjQ0MzUtQk4yIn19LCJiYXVmb3JtZW4iOnsiQ0YiOnsicHJvZHVrdCI6IkNvbm5lY3QtRmxhbnNjaCJ9LCJDRkkiOnsicHJvZHVrdCI6IkNvbm5lY3QtRmxhbnNjaCBJbmxpbmUifX0sImdlbWVpbnNhbSI6eyJsb2NraW5nUmluZ1dlcmtzdG9mZiI6IjEuNDQwNCIsInNjaHJhdWJlbk11dHRlcm5XZXJrc3RvZmZlIjpbIjEuNDQwNCIsIjEuNDMwMSJdLCJyYUlubmVuIjowLjQsInJhQXVzc2VuIjowLjgsImVsZWt0cm9wb2xpZXJlbk9wdGlvbmFsIjp0cnVlfX0sImNmIjp7ImlkIjoiQ0YiLCJxdWVsbGUiOiJIZXJzdGVsbGVyZGF0ZW5ibGF0dCBDb25uZWN0LUZsYW5zY2gsIFNlaXRlbiAxLTg7IENGLUNGSS1NYXNzZS1nZXNpY2hlcnQtMjAyNi0wNy0xNi5tZCAodW5hYmhhZW5naWdlciBBYmdsZWljaCAyMDI2LTA3LTIyKSIsImdlb21ldHJpZVN0YXR1cyI6InZlcmlmaXppZXJ0IiwiZ2VvbWV0cmllR2VtZWluc2FtRnVlclNlcmllbiI6dHJ1ZSwicmVpaGVuIjp7IkFTVE0iOnsibGFiZWwiOiJBU1RNIEEyNjktQTI3MCIsInJvd3MiOlt7ImlkIjoiQTAxMiIsImxhYmVsIjoiQTAxMiAoMVwvMlwiKSIsIkRlIjo1NSwiRGYiOjI1LCJEaSI6OS40LCJsYWVuZ2VuIjpbeyJMIjoxMn0seyJMIjoyNX0seyJMIjozOH0seyJMIjo1MX1dLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsiaWQiOiJBMDE5IiwibGFiZWwiOiJBMDE5ICgzXC80XCIpIiwiRGUiOjU1LCJEZiI6MjUsIkRpIjoxNS43NSwibGFlbmdlbiI6W3siTCI6MTJ9LHsiTCI6MjV9LHsiTCI6Mzh9LHsiTCI6NTF9XSwic3RhdHVzIjoidmVyaWZpemllcnQifSx7ImlkIjoiQTAyNSIsImxhYmVsIjoiQTAyNSAoMVwiKSIsIkRlIjo4NSwiRGYiOjUwLjQsIkRpIjoyMi4xLCJsYWVuZ2VuIjpbeyJMIjoxMn0seyJMIjoyNX0seyJMIjozOH0seyJMIjo1MX1dLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsiaWQiOiJBMDM4IiwibGFiZWwiOiJBMDM4ICgxIDFcLzJcIikiLCJEZSI6ODUsIkRmIjo1MC40LCJEaSI6MzQuOCwibGFlbmdlbiI6W3siTCI6MTJ9LHsiTCI6MjV9LHsiTCI6Mzh9LHsiTCI6NTF9XSwic3RhdHVzIjoidmVyaWZpemllcnQifSx7ImlkIjoiQTA1MCIsImxhYmVsIjoiQTA1MCAoMlwiKSIsIkRlIjoxMDAsIkRmIjo2My45LCJEaSI6NDcuNSwibGFlbmdlbiI6W3siTCI6MTV9LHsiTCI6MjV9LHsiTCI6Mzh9LHsiTCI6NTF9XSwic3RhdHVzIjoidmVyaWZpemllcnQifSx7ImlkIjoiQTA2MyIsImxhYmVsIjoiQTA2MyAoMiAxXC8yXCIpIiwiRGUiOjExMiwiRGYiOjc3LjQsIkRpIjo2MC4yLCJsYWVuZ2VuIjpbeyJMIjoxNX0seyJMIjoyNX0seyJMIjozOH0seyJMIjo1MX1dLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsiaWQiOiJBMDc2IiwibGFiZWwiOiJBMDc2ICgzXCIpIiwiRGUiOjEzMSwiRGYiOjkwLjksIkRpIjo3Mi45LCJsYWVuZ2VuIjpbeyJMIjoxNX0seyJMIjoyNX0seyJMIjozOH0seyJMIjo1MX1dLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsiaWQiOiJBMTAwIiwibGFiZWwiOiJBMTAwICg0XCIpIiwiRGUiOjE3MCwiRGYiOjExOC45LCJEaSI6OTcuMzksImxhZW5nZW4iOlt7IkwiOjE1fSx7IkwiOjI1fSx7IkwiOjM4fSx7IkwiOjUxfV0sInN0YXR1cyI6InZlcmlmaXppZXJ0In1dfSwiRElOIjp7ImxhYmVsIjoiRElOIDMyNjc2IFwvIERJTiAxMTg1MCBSZWloZSAxLTMiLCJyb3dzIjpbeyJpZCI6IkROMTAiLCJsYWJlbCI6IkROMTAiLCJEZSI6NzAsIkRmIjozNCwiRGkiOjEwLCJsYWVuZ2VuIjpbeyJMIjoxMn0seyJMIjoyNX0seyJMIjozOH0seyJMIjo1MX1dLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsiaWQiOiJETjE1IiwibGFiZWwiOiJETjE1IiwiRGUiOjcwLCJEZiI6MzQsIkRpIjoxNiwibGFlbmdlbiI6W3siTCI6MTJ9LHsiTCI6MjV9LHsiTCI6Mzh9LHsiTCI6NTF9XSwic3RhdHVzIjoidmVyaWZpemllcnQifSx7ImlkIjoiRE4yMCIsImxhYmVsIjoiRE4yMCIsIkRlIjo3MCwiRGYiOjM0LCJEaSI6MjAsImxhZW5nZW4iOlt7IkwiOjEyfSx7IkwiOjI1fSx7IkwiOjM4fSx7IkwiOjUxfV0sInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJpZCI6IkROMjUiLCJsYWJlbCI6IkROMjUiLCJEZSI6ODUsIkRmIjo1MC41LCJEaSI6MjYsImxhZW5nZW4iOlt7IkwiOjEyfSx7IkwiOjI1fSx7IkwiOjM4fSx7IkwiOjUxfV0sInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJpZCI6IkROMzIiLCJsYWJlbCI6IkROMzIiLCJEZSI6ODUsIkRmIjo1MC41LCJEaSI6MzIsImxhZW5nZW4iOlt7IkwiOjEyfSx7IkwiOjI1fSx7IkwiOjM4fSx7IkwiOjUxfV0sInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJpZCI6IkRONDAtRjUwLjUiLCJsYWJlbCI6IkRONDAgKEZsYW5zY2ggNTAsNSkiLCJEZSI6ODUsIkRmIjo1MC41LCJEaSI6MzgsImxhZW5nZW4iOlt7IkwiOjEyfSx7IkwiOjI1fSx7IkwiOjM4fSx7IkwiOjUxfV0sInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJpZCI6IkRONDAtRjY0IiwibGFiZWwiOiJETjQwIChGbGFuc2NoIDY0KSIsIkRlIjoxMDAsIkRmIjo2NCwiRGkiOjM4LCJsYWVuZ2VuIjpbeyJMIjoxNX0seyJMIjoyNX0seyJMIjozOH0seyJMIjo1MX1dLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsiaWQiOiJETjUwIiwibGFiZWwiOiJETjUwIiwiRGUiOjEwMCwiRGYiOjY0LCJEaSI6NTAsImxhZW5nZW4iOlt7IkwiOjE1fSx7IkwiOjI1fSx7IkwiOjM4fSx7IkwiOjUxfV0sInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJpZCI6IkRONjUiLCJsYWJlbCI6IkRONjUiLCJEZSI6MTMxLCJEZiI6OTEsIkRpIjo2NiwibGFlbmdlbiI6W3siTCI6MTV9LHsiTCI6MjV9LHsiTCI6Mzh9LHsiTCI6NTF9XSwic3RhdHVzIjoidmVyaWZpemllcnQifSx7ImlkIjoiRE44MCIsImxhYmVsIjoiRE44MCIsIkRlIjoxNDYsIkRmIjoxMDYsIkRpIjo4MSwibGFlbmdlbiI6W3siTCI6MTV9LHsiTCI6MjV9LHsiTCI6Mzh9LHsiTCI6NTF9XSwic3RhdHVzIjoidmVyaWZpemllcnQifSx7ImlkIjoiRE4xMDAiLCJsYWJlbCI6IkROMTAwIiwiRGUiOjE3MCwiRGYiOjExOSwiRGkiOjEwMCwibGFlbmdlbiI6W3siTCI6MTV9LHsiTCI6MjV9LHsiTCI6Mzh9LHsiTCI6NTF9XSwic3RhdHVzIjoidmVyaWZpemllcnQifV19LCJJU08iOnsibGFiZWwiOiJJU08gMTEyNyBTZXJpZSAxIiwicm93cyI6W3siaWQiOiJETjgtRjI1IiwibGFiZWwiOiJETjggKEZsYW5zY2ggMjUpIiwiRGUiOjU1LCJEZiI6MjUsIkRpIjoxMC4zLCJsYWVuZ2VuIjpbeyJMIjoxMn0seyJMIjoyNX0seyJMIjozOH0seyJMIjo1MX1dLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsiaWQiOiJETjgtRjM0IiwibGFiZWwiOiJETjggKEZsYW5zY2ggMzQpIiwiRGUiOjcwLCJEZiI6MzQsIkRpIjoxMC4zLCJsYWVuZ2VuIjpbeyJMIjoxMn0seyJMIjoyNX0seyJMIjozOH0seyJMIjo1MX1dLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsiaWQiOiJETjEwLUYyNSIsImxhYmVsIjoiRE4xMCAoRmxhbnNjaCAyNSkiLCJEZSI6NTUsIkRmIjoyNSwiRGkiOjE0LCJsYWVuZ2VuIjpbeyJMIjoxMn0seyJMIjoyNX0seyJMIjozOH0seyJMIjo1MX1dLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsiaWQiOiJETjEwLUYzNCIsImxhYmVsIjoiRE4xMCAoRmxhbnNjaCAzNCkiLCJEZSI6NzAsIkRmIjozNCwiRGkiOjE0LCJsYWVuZ2VuIjpbeyJMIjoxMn0seyJMIjoyNX0seyJMIjozOH0seyJMIjo1MX1dLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsiaWQiOiJETjE1IiwibGFiZWwiOiJETjE1IiwiRGUiOjcwLCJEZiI6MzQsIkRpIjoxOC4xLCJsYWVuZ2VuIjpbeyJMIjoxMn0seyJMIjoyNX0seyJMIjozOH0seyJMIjo1MX1dLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsiaWQiOiJETjIwIiwibGFiZWwiOiJETjIwIiwiRGUiOjg1LCJEZiI6NTAuNSwiRGkiOjIzLjcsImxhZW5nZW4iOlt7IkwiOjEyfSx7IkwiOjI1fSx7IkwiOjM4fSx7IkwiOjUxfV0sInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJpZCI6IkROMjUiLCJsYWJlbCI6IkROMjUiLCJEZSI6ODUsIkRmIjo1MC41LCJEaSI6MjkuNywibGFlbmdlbiI6W3siTCI6MTJ9LHsiTCI6MjV9LHsiTCI6Mzh9LHsiTCI6NTF9XSwic3RhdHVzIjoidmVyaWZpemllcnQifSx7ImlkIjoiRE4zMi1GNTAuNSIsImxhYmVsIjoiRE4zMiAoRmxhbnNjaCA1MCw1KSIsIkRlIjo4NSwiRGYiOjUwLjUsIkRpIjozOC40LCJsYWVuZ2VuIjpbeyJMIjoxMn0seyJMIjoyNX0seyJMIjozOH0seyJMIjo1MX1dLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsiaWQiOiJETjMyLUY2NCIsImxhYmVsIjoiRE4zMiAoRmxhbnNjaCA2NCkiLCJEZSI6MTAwLCJEZiI6NjQsIkRpIjozOC40LCJsYWVuZ2VuIjpbeyJMIjoxNX0seyJMIjoyNX0seyJMIjozOH0seyJMIjo1MX1dLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsiaWQiOiJETjQwIiwibGFiZWwiOiJETjQwIiwiRGUiOjEwMCwiRGYiOjY0LCJEaSI6NDQuMywibGFlbmdlbiI6W3siTCI6MTV9LHsiTCI6MjV9LHsiTCI6Mzh9LHsiTCI6NTF9XSwic3RhdHVzIjoidmVyaWZpemllcnQifSx7ImlkIjoiRE41MCIsImxhYmVsIjoiRE41MCIsIkRlIjoxMTIsIkRmIjo3Ny41LCJEaSI6NTYuMywibGFlbmdlbiI6W3siTCI6MTV9LHsiTCI6MjV9LHsiTCI6Mzh9LHsiTCI6NTF9XSwic3RhdHVzIjoidmVyaWZpemllcnQifSx7ImlkIjoiRE42NSIsImxhYmVsIjoiRE42NSIsIkRlIjoxMzEsIkRmIjo5MSwiRGkiOjcyLjEsImxhZW5nZW4iOlt7IkwiOjE1fSx7IkwiOjI1fSx7IkwiOjM4fSx7IkwiOjUxfV0sInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJpZCI6IkROODAiLCJsYWJlbCI6IkROODAiLCJEZSI6MTQ2LCJEZiI6MTA2LCJEaSI6ODQuMywibGFlbmdlbiI6W3siTCI6MTV9LHsiTCI6MjV9LHsiTCI6Mzh9LHsiTCI6NTF9XSwic3RhdHVzIjoidmVyaWZpemllcnQifV19LCJTTVMiOnsibGFiZWwiOiJTTVMgMzAwOCIsInJvd3MiOlt7ImlkIjoiUzEyIiwibGFiZWwiOiJTMTIiLCJEZSI6NTUsIkRmIjoyNSwiRGkiOjEwLCJsYWVuZ2VuIjpbeyJMIjoxMn0seyJMIjoyNX0seyJMIjozOH0seyJMIjo1MX1dLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsiaWQiOiJTMTgiLCJsYWJlbCI6IlMxOCIsIkRlIjo1NSwiRGYiOjI1LCJEaSI6MTUsImxhZW5nZW4iOlt7IkwiOjEyfSx7IkwiOjI1fSx7IkwiOjM4fSx7IkwiOjUxfV0sInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJpZCI6IlMyNSIsImxhYmVsIjoiUzI1IiwiRGUiOjg1LCJEZiI6NTAuNSwiRGkiOjIyLjYsImxhZW5nZW4iOlt7IkwiOjEyfSx7IkwiOjI1fSx7IkwiOjM4fSx7IkwiOjUxfV0sInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJpZCI6IlMzOCIsImxhYmVsIjoiUzM4IiwiRGUiOjg1LCJEZiI6NTAuNSwiRGkiOjM1LjYsImxhZW5nZW4iOlt7IkwiOjEyfSx7IkwiOjI1fSx7IkwiOjM4fSx7IkwiOjUxfV0sInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJpZCI6IlM1MSIsImxhYmVsIjoiUzUxIiwiRGUiOjEwMCwiRGYiOjY0LCJEaSI6NDguNiwibGFlbmdlbiI6W3siTCI6MTV9LHsiTCI6MjV9LHsiTCI6Mzh9LHsiTCI6NTF9XSwic3RhdHVzIjoidmVyaWZpemllcnQifSx7ImlkIjoiUzY0IiwibGFiZWwiOiJTNjQiLCJEZSI6MTEyLCJEZiI6NzcuNSwiRGkiOjYwLjMsImxhZW5nZW4iOlt7IkwiOjE1fSx7IkwiOjI1fSx7IkwiOjM4fSx7IkwiOjUxfV0sInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJpZCI6IlM3NiIsImxhYmVsIjoiUzc2IiwiRGUiOjEzMSwiRGYiOjkxLCJEaSI6NzIuOSwibGFlbmdlbiI6W3siTCI6MTV9LHsiTCI6MjV9LHsiTCI6Mzh9LHsiTCI6NTF9XSwic3RhdHVzIjoidmVyaWZpemllcnQifSx7ImlkIjoiUzEwMiIsImxhYmVsIjoiUzEwMiIsIkRlIjoxNzAsIkRmIjoxMTksIkRpIjo5Ny42LCJsYWVuZ2VuIjpbeyJMIjoxNX0seyJMIjoyNX0seyJMIjozOH0seyJMIjo1MX1dLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9XX19fSwiY2ZpIjp7ImlkIjoiQ0ZJIiwic3RhdHVzIjoidmVyaWZpemllcnQiLCJub3JtIjoiQVNUTSBBMjY5LUEyNzAgXC8gQVNNRSBCUEUiLCJvYmVyZXJBbnNjaGx1c3MiOnsiRGUiOjUwLjUsIkRpIjozNC44fSwicm93cyI6W3siaWQiOiJBMDEyIiwibGFiZWwiOiIxXC8yXCIiLCJEZSI6MTIuNywiRGkiOjkuNCwiWSI6MTAuMywiYW5zY2hsdWVzc2UiOnsiQlciOnsibGFiZWwiOiJCdXR0IFdlbGQiLCJMIjoxMTAsIkEiOjE5LCJUQyI6bnVsbH0sIlRDIjp7ImxhYmVsIjoiVHJpLUNsYW1wIiwiTCI6MTE2LCJBIjpudWxsLCJUQyI6MjV9fSwic3RhdHVzIjoidmVyaWZpemllcnQifSx7ImlkIjoiQTAxOSIsImxhYmVsIjoiM1wvNFwiIiwiRGUiOjE5LjA1LCJEaSI6MTUuNzUsIlkiOjEwLjksImFuc2NobHVlc3NlIjp7IkJXIjp7ImxhYmVsIjoiQnV0dCBXZWxkIiwiTCI6MTEwLCJBIjoxOSwiVEMiOm51bGx9LCJUQyI6eyJsYWJlbCI6IlRyaS1DbGFtcCIsIkwiOjExNiwiQSI6bnVsbCwiVEMiOjI1fX0sInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJpZCI6IkEwMjUiLCJsYWJlbCI6IjFcIiIsIkRlIjoyNS40LCJEaSI6MjIuMSwiWSI6MTQsImFuc2NobHVlc3NlIjp7IkJXIjp7ImxhYmVsIjoiQnV0dCBXZWxkIiwiTCI6MTEwLCJBIjoxOSwiVEMiOm51bGx9LCJUQyI6eyJsYWJlbCI6IlRyaS1DbGFtcCIsIkwiOjExNiwiQSI6bnVsbCwiVEMiOjUwLjV9fSwic3RhdHVzIjoidmVyaWZpemllcnQifSx7ImlkIjoiQTAzOCIsImxhYmVsIjoiMSAxXC8yXCIiLCJEZSI6MzguMSwiRGkiOjM0LjgsIlkiOjI0LCJhbnNjaGx1ZXNzZSI6eyJCVyI6eyJsYWJlbCI6IkJ1dHQgV2VsZCIsIkwiOjExMCwiQSI6MTksIlRDIjpudWxsfSwiVEMiOnsibGFiZWwiOiJUcmktQ2xhbXAiLCJMIjoxMzYsIkEiOm51bGwsIlRDIjo1MC41fX0sInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJpZCI6IkEwNTAiLCJsYWJlbCI6IjJcIiIsIkRlIjo1MC44LCJEaSI6NDcuNSwiWSI6MjksImFuc2NobHVlc3NlIjp7IkJXIjp7ImxhYmVsIjoiQnV0dCBXZWxkIiwiTCI6MTEwLCJBIjoxOSwiVEMiOm51bGx9LCJUQyI6eyJsYWJlbCI6IlRyaS1DbGFtcCIsIkwiOjEzNiwiQSI6bnVsbCwiVEMiOjY0fX0sInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJpZCI6IkEwNjMiLCJsYWJlbCI6IjIgMVwvMlwiIiwiRGUiOjYzLjUsIkRpIjo2MC4yLCJZIjozNSwiYW5zY2hsdWVzc2UiOnsiQlciOnsibGFiZWwiOiJCdXR0IFdlbGQiLCJMIjoxMTAsIkEiOjE5LCJUQyI6bnVsbH0sIlRDIjp7ImxhYmVsIjoiVHJpLUNsYW1wIiwiTCI6MTM2LCJBIjpudWxsLCJUQyI6NzcuNX19LCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9XX19LCJjZiI6eyJpZCI6IkNGIiwicXVlbGxlIjoiSGVyc3RlbGxlcmRhdGVuYmxhdHQgQ29ubmVjdC1GbGFuc2NoLCBTZWl0ZW4gMS04OyBDRi1DRkktTWFzc2UtZ2VzaWNoZXJ0LTIwMjYtMDctMTYubWQgKHVuYWJoYWVuZ2lnZXIgQWJnbGVpY2ggMjAyNi0wNy0yMikiLCJnZW9tZXRyaWVTdGF0dXMiOiJ2ZXJpZml6aWVydCIsImdlb21ldHJpZUdlbWVpbnNhbUZ1ZXJTZXJpZW4iOnRydWUsInJlaWhlbiI6eyJBU1RNIjp7ImxhYmVsIjoiQVNUTSBBMjY5LUEyNzAiLCJyb3dzIjpbeyJpZCI6IkEwMTIiLCJsYWJlbCI6IkEwMTIgKDFcLzJcIikiLCJEZSI6NTUsIkRmIjoyNSwiRGkiOjkuNCwibGFlbmdlbiI6W3siTCI6MTJ9LHsiTCI6MjV9LHsiTCI6Mzh9LHsiTCI6NTF9XSwic3RhdHVzIjoidmVyaWZpemllcnQifSx7ImlkIjoiQTAxOSIsImxhYmVsIjoiQTAxOSAoM1wvNFwiKSIsIkRlIjo1NSwiRGYiOjI1LCJEaSI6MTUuNzUsImxhZW5nZW4iOlt7IkwiOjEyfSx7IkwiOjI1fSx7IkwiOjM4fSx7IkwiOjUxfV0sInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJpZCI6IkEwMjUiLCJsYWJlbCI6IkEwMjUgKDFcIikiLCJEZSI6ODUsIkRmIjo1MC40LCJEaSI6MjIuMSwibGFlbmdlbiI6W3siTCI6MTJ9LHsiTCI6MjV9LHsiTCI6Mzh9LHsiTCI6NTF9XSwic3RhdHVzIjoidmVyaWZpemllcnQifSx7ImlkIjoiQTAzOCIsImxhYmVsIjoiQTAzOCAoMSAxXC8yXCIpIiwiRGUiOjg1LCJEZiI6NTAuNCwiRGkiOjM0LjgsImxhZW5nZW4iOlt7IkwiOjEyfSx7IkwiOjI1fSx7IkwiOjM4fSx7IkwiOjUxfV0sInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJpZCI6IkEwNTAiLCJsYWJlbCI6IkEwNTAgKDJcIikiLCJEZSI6MTAwLCJEZiI6NjMuOSwiRGkiOjQ3LjUsImxhZW5nZW4iOlt7IkwiOjE1fSx7IkwiOjI1fSx7IkwiOjM4fSx7IkwiOjUxfV0sInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJpZCI6IkEwNjMiLCJsYWJlbCI6IkEwNjMgKDIgMVwvMlwiKSIsIkRlIjoxMTIsIkRmIjo3Ny40LCJEaSI6NjAuMiwibGFlbmdlbiI6W3siTCI6MTV9LHsiTCI6MjV9LHsiTCI6Mzh9LHsiTCI6NTF9XSwic3RhdHVzIjoidmVyaWZpemllcnQifSx7ImlkIjoiQTA3NiIsImxhYmVsIjoiQTA3NiAoM1wiKSIsIkRlIjoxMzEsIkRmIjo5MC45LCJEaSI6NzIuOSwibGFlbmdlbiI6W3siTCI6MTV9LHsiTCI6MjV9LHsiTCI6Mzh9LHsiTCI6NTF9XSwic3RhdHVzIjoidmVyaWZpemllcnQifSx7ImlkIjoiQTEwMCIsImxhYmVsIjoiQTEwMCAoNFwiKSIsIkRlIjoxNzAsIkRmIjoxMTguOSwiRGkiOjk3LjM5LCJsYWVuZ2VuIjpbeyJMIjoxNX0seyJMIjoyNX0seyJMIjozOH0seyJMIjo1MX1dLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9XX0sIkRJTiI6eyJsYWJlbCI6IkRJTiAzMjY3NiBcLyBESU4gMTE4NTAgUmVpaGUgMS0zIiwicm93cyI6W3siaWQiOiJETjEwIiwibGFiZWwiOiJETjEwIiwiRGUiOjcwLCJEZiI6MzQsIkRpIjoxMCwibGFlbmdlbiI6W3siTCI6MTJ9LHsiTCI6MjV9LHsiTCI6Mzh9LHsiTCI6NTF9XSwic3RhdHVzIjoidmVyaWZpemllcnQifSx7ImlkIjoiRE4xNSIsImxhYmVsIjoiRE4xNSIsIkRlIjo3MCwiRGYiOjM0LCJEaSI6MTYsImxhZW5nZW4iOlt7IkwiOjEyfSx7IkwiOjI1fSx7IkwiOjM4fSx7IkwiOjUxfV0sInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJpZCI6IkROMjAiLCJsYWJlbCI6IkROMjAiLCJEZSI6NzAsIkRmIjozNCwiRGkiOjIwLCJsYWVuZ2VuIjpbeyJMIjoxMn0seyJMIjoyNX0seyJMIjozOH0seyJMIjo1MX1dLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsiaWQiOiJETjI1IiwibGFiZWwiOiJETjI1IiwiRGUiOjg1LCJEZiI6NTAuNSwiRGkiOjI2LCJsYWVuZ2VuIjpbeyJMIjoxMn0seyJMIjoyNX0seyJMIjozOH0seyJMIjo1MX1dLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsiaWQiOiJETjMyIiwibGFiZWwiOiJETjMyIiwiRGUiOjg1LCJEZiI6NTAuNSwiRGkiOjMyLCJsYWVuZ2VuIjpbeyJMIjoxMn0seyJMIjoyNX0seyJMIjozOH0seyJMIjo1MX1dLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsiaWQiOiJETjQwLUY1MC41IiwibGFiZWwiOiJETjQwIChGbGFuc2NoIDUwLDUpIiwiRGUiOjg1LCJEZiI6NTAuNSwiRGkiOjM4LCJsYWVuZ2VuIjpbeyJMIjoxMn0seyJMIjoyNX0seyJMIjozOH0seyJMIjo1MX1dLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsiaWQiOiJETjQwLUY2NCIsImxhYmVsIjoiRE40MCAoRmxhbnNjaCA2NCkiLCJEZSI6MTAwLCJEZiI6NjQsIkRpIjozOCwibGFlbmdlbiI6W3siTCI6MTV9LHsiTCI6MjV9LHsiTCI6Mzh9LHsiTCI6NTF9XSwic3RhdHVzIjoidmVyaWZpemllcnQifSx7ImlkIjoiRE41MCIsImxhYmVsIjoiRE41MCIsIkRlIjoxMDAsIkRmIjo2NCwiRGkiOjUwLCJsYWVuZ2VuIjpbeyJMIjoxNX0seyJMIjoyNX0seyJMIjozOH0seyJMIjo1MX1dLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsiaWQiOiJETjY1IiwibGFiZWwiOiJETjY1IiwiRGUiOjEzMSwiRGYiOjkxLCJEaSI6NjYsImxhZW5nZW4iOlt7IkwiOjE1fSx7IkwiOjI1fSx7IkwiOjM4fSx7IkwiOjUxfV0sInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJpZCI6IkROODAiLCJsYWJlbCI6IkROODAiLCJEZSI6MTQ2LCJEZiI6MTA2LCJEaSI6ODEsImxhZW5nZW4iOlt7IkwiOjE1fSx7IkwiOjI1fSx7IkwiOjM4fSx7IkwiOjUxfV0sInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJpZCI6IkROMTAwIiwibGFiZWwiOiJETjEwMCIsIkRlIjoxNzAsIkRmIjoxMTksIkRpIjoxMDAsImxhZW5nZW4iOlt7IkwiOjE1fSx7IkwiOjI1fSx7IkwiOjM4fSx7IkwiOjUxfV0sInN0YXR1cyI6InZlcmlmaXppZXJ0In1dfSwiSVNPIjp7ImxhYmVsIjoiSVNPIDExMjcgU2VyaWUgMSIsInJvd3MiOlt7ImlkIjoiRE44LUYyNSIsImxhYmVsIjoiRE44IChGbGFuc2NoIDI1KSIsIkRlIjo1NSwiRGYiOjI1LCJEaSI6MTAuMywibGFlbmdlbiI6W3siTCI6MTJ9LHsiTCI6MjV9LHsiTCI6Mzh9LHsiTCI6NTF9XSwic3RhdHVzIjoidmVyaWZpemllcnQifSx7ImlkIjoiRE44LUYzNCIsImxhYmVsIjoiRE44IChGbGFuc2NoIDM0KSIsIkRlIjo3MCwiRGYiOjM0LCJEaSI6MTAuMywibGFlbmdlbiI6W3siTCI6MTJ9LHsiTCI6MjV9LHsiTCI6Mzh9LHsiTCI6NTF9XSwic3RhdHVzIjoidmVyaWZpemllcnQifSx7ImlkIjoiRE4xMC1GMjUiLCJsYWJlbCI6IkROMTAgKEZsYW5zY2ggMjUpIiwiRGUiOjU1LCJEZiI6MjUsIkRpIjoxNCwibGFlbmdlbiI6W3siTCI6MTJ9LHsiTCI6MjV9LHsiTCI6Mzh9LHsiTCI6NTF9XSwic3RhdHVzIjoidmVyaWZpemllcnQifSx7ImlkIjoiRE4xMC1GMzQiLCJsYWJlbCI6IkROMTAgKEZsYW5zY2ggMzQpIiwiRGUiOjcwLCJEZiI6MzQsIkRpIjoxNCwibGFlbmdlbiI6W3siTCI6MTJ9LHsiTCI6MjV9LHsiTCI6Mzh9LHsiTCI6NTF9XSwic3RhdHVzIjoidmVyaWZpemllcnQifSx7ImlkIjoiRE4xNSIsImxhYmVsIjoiRE4xNSIsIkRlIjo3MCwiRGYiOjM0LCJEaSI6MTguMSwibGFlbmdlbiI6W3siTCI6MTJ9LHsiTCI6MjV9LHsiTCI6Mzh9LHsiTCI6NTF9XSwic3RhdHVzIjoidmVyaWZpemllcnQifSx7ImlkIjoiRE4yMCIsImxhYmVsIjoiRE4yMCIsIkRlIjo4NSwiRGYiOjUwLjUsIkRpIjoyMy43LCJsYWVuZ2VuIjpbeyJMIjoxMn0seyJMIjoyNX0seyJMIjozOH0seyJMIjo1MX1dLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsiaWQiOiJETjI1IiwibGFiZWwiOiJETjI1IiwiRGUiOjg1LCJEZiI6NTAuNSwiRGkiOjI5LjcsImxhZW5nZW4iOlt7IkwiOjEyfSx7IkwiOjI1fSx7IkwiOjM4fSx7IkwiOjUxfV0sInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJpZCI6IkROMzItRjUwLjUiLCJsYWJlbCI6IkROMzIgKEZsYW5zY2ggNTAsNSkiLCJEZSI6ODUsIkRmIjo1MC41LCJEaSI6MzguNCwibGFlbmdlbiI6W3siTCI6MTJ9LHsiTCI6MjV9LHsiTCI6Mzh9LHsiTCI6NTF9XSwic3RhdHVzIjoidmVyaWZpemllcnQifSx7ImlkIjoiRE4zMi1GNjQiLCJsYWJlbCI6IkROMzIgKEZsYW5zY2ggNjQpIiwiRGUiOjEwMCwiRGYiOjY0LCJEaSI6MzguNCwibGFlbmdlbiI6W3siTCI6MTV9LHsiTCI6MjV9LHsiTCI6Mzh9LHsiTCI6NTF9XSwic3RhdHVzIjoidmVyaWZpemllcnQifSx7ImlkIjoiRE40MCIsImxhYmVsIjoiRE40MCIsIkRlIjoxMDAsIkRmIjo2NCwiRGkiOjQ0LjMsImxhZW5nZW4iOlt7IkwiOjE1fSx7IkwiOjI1fSx7IkwiOjM4fSx7IkwiOjUxfV0sInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJpZCI6IkRONTAiLCJsYWJlbCI6IkRONTAiLCJEZSI6MTEyLCJEZiI6NzcuNSwiRGkiOjU2LjMsImxhZW5nZW4iOlt7IkwiOjE1fSx7IkwiOjI1fSx7IkwiOjM4fSx7IkwiOjUxfV0sInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJpZCI6IkRONjUiLCJsYWJlbCI6IkRONjUiLCJEZSI6MTMxLCJEZiI6OTEsIkRpIjo3Mi4xLCJsYWVuZ2VuIjpbeyJMIjoxNX0seyJMIjoyNX0seyJMIjozOH0seyJMIjo1MX1dLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsiaWQiOiJETjgwIiwibGFiZWwiOiJETjgwIiwiRGUiOjE0NiwiRGYiOjEwNiwiRGkiOjg0LjMsImxhZW5nZW4iOlt7IkwiOjE1fSx7IkwiOjI1fSx7IkwiOjM4fSx7IkwiOjUxfV0sInN0YXR1cyI6InZlcmlmaXppZXJ0In1dfSwiU01TIjp7ImxhYmVsIjoiU01TIDMwMDgiLCJyb3dzIjpbeyJpZCI6IlMxMiIsImxhYmVsIjoiUzEyIiwiRGUiOjU1LCJEZiI6MjUsIkRpIjoxMCwibGFlbmdlbiI6W3siTCI6MTJ9LHsiTCI6MjV9LHsiTCI6Mzh9LHsiTCI6NTF9XSwic3RhdHVzIjoidmVyaWZpemllcnQifSx7ImlkIjoiUzE4IiwibGFiZWwiOiJTMTgiLCJEZSI6NTUsIkRmIjoyNSwiRGkiOjE1LCJsYWVuZ2VuIjpbeyJMIjoxMn0seyJMIjoyNX0seyJMIjozOH0seyJMIjo1MX1dLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsiaWQiOiJTMjUiLCJsYWJlbCI6IlMyNSIsIkRlIjo4NSwiRGYiOjUwLjUsIkRpIjoyMi42LCJsYWVuZ2VuIjpbeyJMIjoxMn0seyJMIjoyNX0seyJMIjozOH0seyJMIjo1MX1dLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsiaWQiOiJTMzgiLCJsYWJlbCI6IlMzOCIsIkRlIjo4NSwiRGYiOjUwLjUsIkRpIjozNS42LCJsYWVuZ2VuIjpbeyJMIjoxMn0seyJMIjoyNX0seyJMIjozOH0seyJMIjo1MX1dLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsiaWQiOiJTNTEiLCJsYWJlbCI6IlM1MSIsIkRlIjoxMDAsIkRmIjo2NCwiRGkiOjQ4LjYsImxhZW5nZW4iOlt7IkwiOjE1fSx7IkwiOjI1fSx7IkwiOjM4fSx7IkwiOjUxfV0sInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJpZCI6IlM2NCIsImxhYmVsIjoiUzY0IiwiRGUiOjExMiwiRGYiOjc3LjUsIkRpIjo2MC4zLCJsYWVuZ2VuIjpbeyJMIjoxNX0seyJMIjoyNX0seyJMIjozOH0seyJMIjo1MX1dLCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsiaWQiOiJTNzYiLCJsYWJlbCI6IlM3NiIsIkRlIjoxMzEsIkRmIjo5MSwiRGkiOjcyLjksImxhZW5nZW4iOlt7IkwiOjE1fSx7IkwiOjI1fSx7IkwiOjM4fSx7IkwiOjUxfV0sInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJpZCI6IlMxMDIiLCJsYWJlbCI6IlMxMDIiLCJEZSI6MTcwLCJEZiI6MTE5LCJEaSI6OTcuNiwibGFlbmdlbiI6W3siTCI6MTV9LHsiTCI6MjV9LHsiTCI6Mzh9LHsiTCI6NTF9XSwic3RhdHVzIjoidmVyaWZpemllcnQifV19fX0sImNmaSI6eyJpZCI6IkNGSSIsInN0YXR1cyI6InZlcmlmaXppZXJ0Iiwibm9ybSI6IkFTVE0gQTI2OS1BMjcwIFwvIEFTTUUgQlBFIiwib2JlcmVyQW5zY2hsdXNzIjp7IkRlIjo1MC41LCJEaSI6MzQuOH0sInJvd3MiOlt7ImlkIjoiQTAxMiIsImxhYmVsIjoiMVwvMlwiIiwiRGUiOjEyLjcsIkRpIjo5LjQsIlkiOjEwLjMsImFuc2NobHVlc3NlIjp7IkJXIjp7ImxhYmVsIjoiQnV0dCBXZWxkIiwiTCI6MTEwLCJBIjoxOSwiVEMiOm51bGx9LCJUQyI6eyJsYWJlbCI6IlRyaS1DbGFtcCIsIkwiOjExNiwiQSI6bnVsbCwiVEMiOjI1fX0sInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJpZCI6IkEwMTkiLCJsYWJlbCI6IjNcLzRcIiIsIkRlIjoxOS4wNSwiRGkiOjE1Ljc1LCJZIjoxMC45LCJhbnNjaGx1ZXNzZSI6eyJCVyI6eyJsYWJlbCI6IkJ1dHQgV2VsZCIsIkwiOjExMCwiQSI6MTksIlRDIjpudWxsfSwiVEMiOnsibGFiZWwiOiJUcmktQ2xhbXAiLCJMIjoxMTYsIkEiOm51bGwsIlRDIjoyNX19LCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsiaWQiOiJBMDI1IiwibGFiZWwiOiIxXCIiLCJEZSI6MjUuNCwiRGkiOjIyLjEsIlkiOjE0LCJhbnNjaGx1ZXNzZSI6eyJCVyI6eyJsYWJlbCI6IkJ1dHQgV2VsZCIsIkwiOjExMCwiQSI6MTksIlRDIjpudWxsfSwiVEMiOnsibGFiZWwiOiJUcmktQ2xhbXAiLCJMIjoxMTYsIkEiOm51bGwsIlRDIjo1MC41fX0sInN0YXR1cyI6InZlcmlmaXppZXJ0In0seyJpZCI6IkEwMzgiLCJsYWJlbCI6IjEgMVwvMlwiIiwiRGUiOjM4LjEsIkRpIjozNC44LCJZIjoyNCwiYW5zY2hsdWVzc2UiOnsiQlciOnsibGFiZWwiOiJCdXR0IFdlbGQiLCJMIjoxMTAsIkEiOjE5LCJUQyI6bnVsbH0sIlRDIjp7ImxhYmVsIjoiVHJpLUNsYW1wIiwiTCI6MTM2LCJBIjpudWxsLCJUQyI6NTAuNX19LCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsiaWQiOiJBMDUwIiwibGFiZWwiOiIyXCIiLCJEZSI6NTAuOCwiRGkiOjQ3LjUsIlkiOjI5LCJhbnNjaGx1ZXNzZSI6eyJCVyI6eyJsYWJlbCI6IkJ1dHQgV2VsZCIsIkwiOjExMCwiQSI6MTksIlRDIjpudWxsfSwiVEMiOnsibGFiZWwiOiJUcmktQ2xhbXAiLCJMIjoxMzYsIkEiOm51bGwsIlRDIjo2NH19LCJzdGF0dXMiOiJ2ZXJpZml6aWVydCJ9LHsiaWQiOiJBMDYzIiwibGFiZWwiOiIyIDFcLzJcIiIsIkRlIjo2My41LCJEaSI6NjAuMiwiWSI6MzUsImFuc2NobHVlc3NlIjp7IkJXIjp7ImxhYmVsIjoiQnV0dCBXZWxkIiwiTCI6MTEwLCJBIjoxOSwiVEMiOm51bGx9LCJUQyI6eyJsYWJlbCI6IlRyaS1DbGFtcCIsIkwiOjEzNiwiQSI6bnVsbCwiVEMiOjc3LjV9fSwic3RhdHVzIjoidmVyaWZpemllcnQifV19LCJ0Y2QiOnsicmVpaGVuIjp7IkEiOnsibGFiZWwiOiJSZWloZSBBIC0gbWV0cmlzY2ggKEROLCBESU4gMTE4NTApIiwiZ3JvZXNzZSI6IkROIiwicm93cyI6W3siaWQiOiJETjA2IiwibGFiZWwiOiJETjA2IiwibnciOjYsImZsYW5nZU9EIjoyNSwiYXVzc2VuRCI6MTIsIndhbGwiOjQsImhvZWhlIjo2MH0seyJpZCI6IkROMDgiLCJsYWJlbCI6IkROMDgiLCJudyI6OCwiZmxhbmdlT0QiOjI1LCJhdXNzZW5EIjoxNiwid2FsbCI6NCwiaG9laGUiOjYwfSx7ImlkIjoiRE4xMCIsImxhYmVsIjoiRE4xMCIsIm53IjoxMCwiZmxhbmdlT0QiOjM0LCJhdXNzZW5EIjoxOCwid2FsbCI6NCwiaG9laGUiOjYwfSx7ImlkIjoiRE4xNSIsImxhYmVsIjoiRE4xNSIsIm53IjoxNSwiZmxhbmdlT0QiOjM0LCJhdXNzZW5EIjoyNCwid2FsbCI6NCwiaG9laGUiOjYwfSx7ImlkIjoiRE4yMCIsImxhYmVsIjoiRE4yMCIsIm53IjoyMCwiZmxhbmdlT0QiOjM0LCJhdXNzZW5EIjoyOCwid2FsbCI6NCwiaG9laGUiOjYwfSx7ImlkIjoiRE4yNSIsImxhYmVsIjoiRE4yNSIsIm53IjoyNSwiZmxhbmdlT0QiOjUwLjUsImF1c3NlbkQiOjM0LCJ3YWxsIjo0LCJob2VoZSI6NjB9LHsiaWQiOiJETjMyIiwibGFiZWwiOiJETjMyIiwibnciOjMyLCJmbGFuZ2VPRCI6NTAuNSwiYXVzc2VuRCI6NDAsIndhbGwiOjQsImhvZWhlIjo2MH0seyJpZCI6IkRONDAiLCJsYWJlbCI6IkRONDAiLCJudyI6NDAsImZsYW5nZU9EIjo1MC41LCJhdXNzZW5EIjo0Niwid2FsbCI6NCwiaG9laGUiOjYwfSx7ImlkIjoiRE41MCIsImxhYmVsIjoiRE41MCIsIm53Ijo1MCwiZmxhbmdlT0QiOjY0LCJhdXNzZW5EIjo1OCwid2FsbCI6NCwiaG9laGUiOjYwfSx7ImlkIjoiRE42NSIsImxhYmVsIjoiRE42NSIsIm53Ijo2NSwiZmxhbmdlT0QiOjkxLCJhdXNzZW5EIjo3NCwid2FsbCI6NCwiaG9laGUiOjYwfSx7ImlkIjoiRE44MCIsImxhYmVsIjoiRE44MCIsIm53Ijo4MCwiZmxhbmdlT0QiOjEwNiwiYXVzc2VuRCI6ODksIndhbGwiOjQsImhvZWhlIjo2MH0seyJpZCI6IkROMTAwIiwibGFiZWwiOiJETjEwMCIsIm53IjoxMDAsImZsYW5nZU9EIjoxMTksImF1c3NlbkQiOjEwOCwid2FsbCI6NCwiaG9laGUiOjYwfSx7ImlkIjoiRE4xMjUiLCJsYWJlbCI6IkROMTI1IiwibnciOjEyNSwiZmxhbmdlT0QiOjE1NSwiYXVzc2VuRCI6MTMzLCJ3YWxsIjo0LCJob2VoZSI6NjB9LHsiaWQiOiJETjE1MCIsImxhYmVsIjoiRE4xNTAiLCJudyI6MTUwLCJmbGFuZ2VPRCI6MTgzLCJhdXNzZW5EIjoxNTgsIndhbGwiOjQsImhvZWhlIjo2MH0seyJpZCI6IkROMjAwIiwibGFiZWwiOiJETjIwMCIsIm53IjoyMDAsImZsYW5nZU9EIjoyMzMuNSwiYXVzc2VuRCI6MjA4LCJ3YWxsIjo0LCJob2VoZSI6NjB9XX0sIkIiOnsibGFiZWwiOiJSZWloZSBCIC0gbWV0cmlzY2ggSVNPIChPRCwgRU4gSVNPIDExMjcpIiwiZ3JvZXNzZSI6Ik9EIiwicm93cyI6W3siaWQiOiJOVzEwLjIiLCJsYWJlbCI6Ik5XIDEwLDIiLCJudyI6MTAuMiwiZmxhbmdlT0QiOjI1LCJhdXNzZW5EIjoxNSwid2FsbCI6NCwiaG9laGUiOjYwfSx7ImlkIjoiTlcxMy41IiwibGFiZWwiOiJOVyAxMyw1IiwibnciOjEzLjUsImZsYW5nZU9EIjoyNSwiYXVzc2VuRCI6MTguMywid2FsbCI6NCwiaG9laGUiOjYwfSx7ImlkIjoiTlcxNy4yIiwibGFiZWwiOiJOVyAxNywyIiwibnciOjE3LjIsImZsYW5nZU9EIjoyNSwiYXVzc2VuRCI6MjIsIndhbGwiOjQsImhvZWhlIjo2MH0seyJpZCI6Ik5XMjEuMyIsImxhYmVsIjoiTlcgMjEsMyIsIm53IjoyMS4zLCJmbGFuZ2VPRCI6NTAuNSwiYXVzc2VuRCI6MjYuMSwid2FsbCI6NCwiaG9laGUiOjYwfSx7ImlkIjoiTlcyNi45IiwibGFiZWwiOiJOVyAyNiw5IiwibnciOjI2LjksImZsYW5nZU9EIjo1MC41LCJhdXNzZW5EIjozMS43LCJ3YWxsIjo0LCJob2VoZSI6NjB9LHsiaWQiOiJOVzMzLjciLCJsYWJlbCI6Ik5XIDMzLDciLCJudyI6MzMuNywiZmxhbmdlT0QiOjUwLjUsImF1c3NlbkQiOjM3LjcsIndhbGwiOjQsImhvZWhlIjo2MH0seyJpZCI6Ik5XNDIuNCIsImxhYmVsIjoiTlcgNDIsNCIsIm53Ijo0Mi40LCJmbGFuZ2VPRCI6NjQsImF1c3NlbkQiOjQ2LjQsIndhbGwiOjQsImhvZWhlIjo2MH0seyJpZCI6Ik5XNDguMyIsImxhYmVsIjoiTlcgNDgsMyIsIm53Ijo0OC4zLCJmbGFuZ2VPRCI6NjQsImF1c3NlbkQiOjUyLjMsIndhbGwiOjQsImhvZWhlIjo2MH0seyJpZCI6Ik5XNjAuMyIsImxhYmVsIjoiTlcgNjAsMyIsIm53Ijo2MC4zLCJmbGFuZ2VPRCI6NzcuNSwiYXVzc2VuRCI6NjQuMywid2FsbCI6NCwiaG9laGUiOjYwfSx7ImlkIjoiTlc3Ni4xIiwibGFiZWwiOiJOVyA3NiwxIiwibnciOjc2LjEsImZsYW5nZU9EIjo5MSwiYXVzc2VuRCI6ODAuMSwid2FsbCI6NCwiaG9laGUiOjYwfSx7ImlkIjoiTlc4OC45IiwibGFiZWwiOiJOVyA4OCw5IiwibnciOjg4LjksImZsYW5nZU9EIjoxMDYsImF1c3NlbkQiOjkyLjMsIndhbGwiOjQsImhvZWhlIjo2MH0seyJpZCI6Ik5XMTE0LjMiLCJsYWJlbCI6Ik5XIDExNCwzIiwibnciOjExNC4zLCJmbGFuZ2VPRCI6MTMwLCJhdXNzZW5EIjoxMTcuNywid2FsbCI6NCwiaG9laGUiOjYwfSx7ImlkIjoiTlcxMzkuNyIsImxhYmVsIjoiTlcgMTM5LDciLCJudyI6MTM5LjcsImZsYW5nZU9EIjoxNTUsImF1c3NlbkQiOjE0Mi41LCJ3YWxsIjo0LCJob2VoZSI6NjB9LHsiaWQiOiJOVzE2OC4zIiwibGFiZWwiOiJOVyAxNjgsMyIsIm53IjoxNjguMywiZmxhbmdlT0QiOjE4MywiYXVzc2VuRCI6MTcxLjEsIndhbGwiOjQsImhvZWhlIjo2MH0seyJpZCI6Ik5XMjE5LjEiLCJsYWJlbCI6Ik5XIDIxOSwxIiwibnciOjIxOS4xLCJmbGFuZ2VPRCI6MjMzLjUsImF1c3NlbkQiOjIyMS45LCJ3YWxsIjo0LCJob2VoZSI6NjB9XX0sIkMiOnsibGFiZWwiOiJSZWloZSBDIC0gWm9sbFwvT0QgKEFTTUUtQlBFLW5haCkiLCJncm9lc3NlIjoiWm9sbCIsInJvd3MiOlt7ImlkIjoiMC4yNSIsImxhYmVsIjoiMVwvNFwiIiwibnciOiIxXC80XCIiLCJmbGFuZ2VPRCI6MjUsImF1c3NlbkQiOjEyLjUsIndhbGwiOjQsImhvZWhlIjo2MH0seyJpZCI6IjAuMzc1IiwibGFiZWwiOiIzXC84XCIiLCJudyI6IjNcLzhcIiIsImZsYW5nZU9EIjoyNSwiYXVzc2VuRCI6MTUuNywid2FsbCI6NCwiaG9laGUiOjYwfSx7ImlkIjoiMC41IiwibGFiZWwiOiIxXC8yXCIiLCJudyI6IjFcLzJcIiIsImZsYW5nZU9EIjoyNSwiYXVzc2VuRCI6MTcuNCwid2FsbCI6NCwiaG9laGUiOjYwfSx7ImlkIjoiMC43NSIsImxhYmVsIjoiM1wvNFwiIiwibnciOiIzXC80XCIiLCJmbGFuZ2VPRCI6MjUsImF1c3NlbkQiOjIzLjcsIndhbGwiOjQsImhvZWhlIjo2MH0seyJpZCI6IjEiLCJsYWJlbCI6IjFcIiIsIm53IjoiMVwiIiwiZmxhbmdlT0QiOjUwLjUsImF1c3NlbkQiOjMwLjEsIndhbGwiOjQsImhvZWhlIjo2MH0seyJpZCI6IjEuNSIsImxhYmVsIjoiMSAxXC8yXCIiLCJudyI6IjEgMVwvMlwiIiwiZmxhbmdlT0QiOjUwLjUsImF1c3NlbkQiOjQyLjgsIndhbGwiOjQsImhvZWhlIjo2MH0seyJpZCI6IjIiLCJsYWJlbCI6IjJcIiIsIm53IjoiMlwiIiwiZmxhbmdlT0QiOjY0LCJhdXNzZW5EIjo1NS41LCJ3YWxsIjo0LCJob2VoZSI6NjB9LHsiaWQiOiIyLjUiLCJsYWJlbCI6IjIgMVwvMlwiIiwibnciOiIyIDFcLzJcIiIsImZsYW5nZU9EIjo3Ny41LCJhdXNzZW5EIjo2OC4yLCJ3YWxsIjo0LCJob2VoZSI6NjB9LHsiaWQiOiIzIiwibGFiZWwiOiIzXCIiLCJudyI6IjNcIiIsImZsYW5nZU9EIjo5MSwiYXVzc2VuRCI6ODAuOSwid2FsbCI6NCwiaG9laGUiOjYwfSx7ImlkIjoiNCIsImxhYmVsIjoiNFwiIiwibnciOiI0XCIiLCJmbGFuZ2VPRCI6MTE5LCJhdXNzZW5EIjoxMDUuMywid2FsbCI6NCwiaG9laGUiOjYwfSx7ImlkIjoiNiIsImxhYmVsIjoiNlwiIiwibnciOiI2XCIiLCJmbGFuZ2VPRCI6MTY3LCJhdXNzZW5EIjoxNTQuOCwid2FsbCI6NCwiaG9laGUiOjYwfV19fSwia29uc3RhbnQiOnsid2FsbCI6NCwiaG9laGUiOjYwfX19LCJmbGFuc2NoZ3JvZXNzZW4iOlt7ImlkIjoiRjI1IiwiZmxhbmdlT0QiOjI1LCJsYWJlbCI6IjI1IiwiYmxpbmRUaGsiOjQuNzUsImdhc2tldE9EIjoyMiwia2xhbW1lckEiOnsiS0wxIjoyOCwiS0xMSSI6MjgsIktMSCI6MjguMn0sIm1hc3NlbkJla2FubnQiOnRydWV9LHsiaWQiOiJGMzQiLCJmbGFuZ2VPRCI6MzQsImxhYmVsIjoiMzQiLCJibGluZFRoayI6NC43NSwiZ2Fza2V0T0QiOjM0LCJrbGFtbWVyQSI6eyJLTDEiOjM3LCJLTExJIjozNywiS0xIIjozN30sIm1hc3NlbkJla2FubnQiOnRydWV9LHsiaWQiOiJGNTBfNSIsImZsYW5nZU9EIjo1MC41LCJsYWJlbCI6IjUwLDUiLCJibGluZFRoayI6Ni4zNSwiZ2Fza2V0T0QiOjUwLjUsImtsYW1tZXJBIjp7IktMMSI6NTMsIktMTEkiOjUzLCJLTEgiOjUxLjV9LCJtYXNzZW5CZWthbm50Ijp0cnVlfSx7ImlkIjoiRjY0IiwiZmxhbmdlT0QiOjY0LCJsYWJlbCI6IjY0IiwiYmxpbmRUaGsiOjYuMzUsImdhc2tldE9EIjo2NCwia2xhbW1lckEiOnsiS0wxIjo2Ni41LCJLTExJIjo2Ni41LCJLTEgiOjY1LjV9LCJtYXNzZW5CZWthbm50Ijp0cnVlfSx7ImlkIjoiRjc3XzUiLCJmbGFuZ2VPRCI6NzcuNSwibGFiZWwiOiI3Nyw1IiwiYmxpbmRUaGsiOjYuMzUsImdhc2tldE9EIjo3Ny41LCJrbGFtbWVyQSI6eyJLTDEiOjgwLCJLTExJIjo4MCwiS0xIIjo3OX0sIm1hc3NlbkJla2FubnQiOnRydWV9LHsiaWQiOiJGOTEiLCJmbGFuZ2VPRCI6OTEsImxhYmVsIjoiOTEiLCJibGluZFRoayI6Ni4zNSwiZ2Fza2V0T0QiOjkxLCJrbGFtbWVyQSI6eyJLTDEiOjkzLjUsIktMTEkiOjkzLjUsIktMSCI6OTIuNX0sIm1hc3NlbkJla2FubnQiOnRydWV9LHsiaWQiOiJGMTA2IiwiZmxhbmdlT0QiOjEwNiwibGFiZWwiOiIxMDYiLCJibGluZFRoayI6Ni4zNSwiZ2Fza2V0T0QiOjEwNiwia2xhbW1lckEiOnsiS0wxIjoxMDksIktMTEkiOjEwOSwiS0xIIjoxMTEuNX0sIm1hc3NlbkJla2FubnQiOnRydWV9LHsiaWQiOiJGMTE5IiwiZmxhbmdlT0QiOjExOSwibGFiZWwiOiIxMTkiLCJibGluZFRoayI6OCwiZ2Fza2V0T0QiOjExOSwia2xhbW1lckEiOnsiS0wxIjoxMjEuNSwiS0xMSSI6MTIxLjUsIktMSCI6MTIwLjV9LCJtYXNzZW5CZWthbm50Ijp0cnVlfSx7ImlkIjoiRjEzMCIsImZsYW5nZU9EIjoxMzAsImxhYmVsIjoiMTMwIiwiYmxpbmRUaGsiOjgsImdhc2tldE9EIjoxMzAsImtsYW1tZXJBIjp7IktMMSI6MTMzLCJLTExJIjoxMzMsIktMSCI6MTMyLjV9LCJtYXNzZW5CZWthbm50Ijp0cnVlfSx7ImlkIjoiRjE0NF81IiwiZmxhbmdlT0QiOjE0NC41LCJsYWJlbCI6IjE0NCw1IiwiYmxpbmRUaGsiOjgsImdhc2tldE9EIjpudWxsLCJrbGFtbWVyQSI6eyJLTDEiOjE0NiwiS0xMSSI6MTQ2LCJLTEgiOjE0N30sIm1hc3NlbkJla2FubnQiOnRydWV9LHsiaWQiOiJGMTU1IiwiZmxhbmdlT0QiOjE1NSwibGFiZWwiOiIxNTUiLCJibGluZFRoayI6OCwiZ2Fza2V0T0QiOjE1NSwia2xhbW1lckEiOnsiS0wxIjoxNTksIktMTEkiOjE1OSwiS0xIIjoxNTl9LCJtYXNzZW5CZWthbm50Ijp0cnVlfSx7ImlkIjoiRjE2NyIsImZsYW5nZU9EIjoxNjcsImxhYmVsIjoiMTY3IiwiYmxpbmRUaGsiOjE0LCJnYXNrZXRPRCI6MTY3LCJrbGFtbWVyQSI6eyJLTDEiOjE3MCwiS0xMSSI6MTcwLCJLTEgiOjE3MH0sIm1hc3NlbkJla2FubnQiOnRydWV9LHsiaWQiOiJGMTgzIiwiZmxhbmdlT0QiOjE4MywibGFiZWwiOiIxODMiLCJibGluZFRoayI6MTQsImdhc2tldE9EIjoxODMsImtsYW1tZXJBIjp7IktMMSI6MTg3LCJLTExJIjoxODcsIktMSCI6MTg3fSwibWFzc2VuQmVrYW5udCI6dHJ1ZX0seyJpZCI6IkYyMTdfNSIsImZsYW5nZU9EIjoyMTcuNSwibGFiZWwiOiIyMTcsNSIsImJsaW5kVGhrIjoxNCwiZ2Fza2V0T0QiOm51bGwsImtsYW1tZXJBIjp7IktMMSI6MjE5LjUsIktMTEkiOjIxOS41LCJLTEgiOjIyMX0sIm1hc3NlbkJla2FubnQiOnRydWV9LHsiaWQiOiJGMjMzXzUiLCJmbGFuZ2VPRCI6MjMzLjUsImxhYmVsIjoiMjMzLDUiLCJibGluZFRoayI6MTQsImdhc2tldE9EIjoyMzMuNSwia2xhbW1lckEiOnsiS0wxIjoyMzcuNSwiS0xMSSI6MjM3LjUsIktMSCI6MjM3LjV9LCJtYXNzZW5CZWthbm50Ijp0cnVlfSx7ImlkIjoiRjI2OCIsImZsYW5nZU9EIjoyNjgsImxhYmVsIjoiMjY4IiwiYmxpbmRUaGsiOjE0LCJnYXNrZXRPRCI6bnVsbCwia2xhbW1lckEiOnsiS0wxIjoyNzIsIktMTEkiOjI3MiwiS0xIIjoyNzN9LCJtYXNzZW5CZWthbm50Ijp0cnVlfSx7ImlkIjoiRjI4Nl8xIiwiZmxhbmdlT0QiOjI4Ni4xLCJsYWJlbCI6IjI4NiwxIiwiYmxpbmRUaGsiOjE0LCJnYXNrZXRPRCI6bnVsbCwia2xhbW1lckEiOnsiS0wxIjoyOTIsIktMTEkiOjI5MiwiS0xIIjoyOTJ9LCJtYXNzZW5CZWthbm50Ijp0cnVlfSx7ImlkIjoiRjMxOSIsImZsYW5nZU9EIjozMTksImxhYmVsIjoiMzE5IiwiYmxpbmRUaGsiOjE0LCJnYXNrZXRPRCI6bnVsbCwia2xhbW1lckEiOnsiS0wxIjozMjQuNSwiS0xMSSI6MzI0LjUsIktMSCI6MzI0LjV9LCJtYXNzZW5CZWthbm50Ijp0cnVlfSx7ImlkIjoiRjMzOCIsImZsYW5nZU9EIjozMzgsImxhYmVsIjoiMzM4IiwiYmxpbmRUaGsiOjE0LCJnYXNrZXRPRCI6bnVsbCwia2xhbW1lckEiOnsiS0wxIjozNDMuNSwiS0xMSSI6MzQzLjUsIktMSCI6MzQzLjV9LCJtYXNzZW5CZWthbm50Ijp0cnVlfV0sImtsYW1tZXJUeXBlbiI6W3siaWQiOiJLTDEiLCJsYWJlbCI6IktMMSIsInN1YiI6IktsYW1tZXIgbWl0IGVpbmZhY2hlbSBHZWxlbmsgdW5kIGVpbmVtIFBpbiIsIndlcmtzdG9mZmUiOlsiMS40MzA4Il0sImRlZmF1bHQiOnRydWV9LHsiaWQiOiJLTExJIiwibGFiZWwiOiJLTExJIiwic3ViIjoiS2xhbW1lciBtaXQgZWluZW0gR2VsZW5rIHVuZCB6d2VpIFBpbnMiLCJ3ZXJrc3RvZmZlIjpbIjEuNDMwOCIsIjEuNDQwOCJdfSx7ImlkIjoiS0xIIiwibGFiZWwiOiJLTEgiLCJzdWIiOiJIb2NoZHJ1Y2trbGFtbWVyIFx1MjAxMyB6d2VpIEhhbGJzY2hhbGVuIG1pdCBsXHUwMGY2c2JhcmVuIFZlcmJpbmR1bmdlbiAoMiBHZWxlbmtlKSIsIndlcmtzdG9mZmUiOlsiMS40MzA4Il19XSwia2xhbW1lck11dHRlcm4iOlt7ImlkIjoiTSIsImxhYmVsIjoiTXV0dGVyIiwic3ViIjoiU3RhbmRhcmQiLCJkZWZhdWx0Ijp0cnVlfSx7ImlkIjoiUyIsImxhYmVsIjoiU2VjaHNrYW50bXV0dGVyIiwic3ViIjoiZ2VnZW4gQXVmcHJlaXMiLCJhdWZwcmVpcyI6dHJ1ZX1dLCJrbGFtbWVyTXV0dGVySGlud2VpcyI6IlNlY2hza2FudG11dHRlciBnZWdlbiBBdWZwcmVpcyBtXHUwMGY2Z2xpY2guIiwid2Vya3N0b2ZmZSI6W3siaWQiOiIxLjQ0MDQiLCJsYWJlbCI6IjEuNDQwNCIsInN1YiI6IlgyQ3JOaU1vMTctMTItMiBcdTAwYjcgMzE2TCIsImRlZmF1bHQiOnRydWUsImhpbndlaXMiOiJTdGFuZGFyZCBpbSBIeWdpZW5pYyBEZXNpZ24sIHNlaHIgZ3V0IHNjaHdlaXNzYmFyLiJ9LHsiaWQiOiIxLjQ0MzUiLCJsYWJlbCI6IjEuNDQzNSIsInN1YiI6IlgyQ3JOaU1vMTgtMTQtMyBcdTAwYjcgMzE2TCIsImRlZmF1bHQiOmZhbHNlLCJoaW53ZWlzIjoiSFx1MDBmNmhlcmVyIE1vXC9OaS1BbnRlaWwsIGZcdTAwZmNyIEVsZWt0cm9wb2xpdHVyIHVuZCBSZWluc3RtZWRpZW4uIn1dLCJrbGFtbWVyV2Vya3N0b2ZmZSI6W3siaWQiOiIxLjQzMDgiLCJsYWJlbCI6IjEuNDMwOCIsInN1YiI6bnVsbCwiaGlud2VpcyI6bnVsbCwiZGVmYXVsdCI6dHJ1ZX0seyJpZCI6IjEuNDQwOCIsImxhYmVsIjoiMS40NDA4Iiwic3ViIjpudWxsLCJoaW53ZWlzIjpudWxsfV0sIm9iZXJmbGFlY2hlbiI6W3siaWQiOiJING8iLCJsYWJlbCI6Ikg0byIsInJhSW5uZW4iOjAuNCwicmFBdXNzZW4iOjAuOCwidmVyZmFocmVuIjoiZWxla3Ryb3BvbGllcnQgKEVQKSIsInN1YiI6IlJhIGlubmVuIFx1MjI2NDAsNDAgXC8gYXVcdTAwZGZlbiBcdTIyNjQwLDgwIFx1MDBiNW0gXHUwMGI3IGVsZWt0cm9wb2xpZXJ0In0seyJpZCI6Ikg0IiwibGFiZWwiOiJINCIsInJhSW5uZW4iOjAuNCwicmFBdXNzZW4iOjAuOCwidmVyZmFocmVuIjoibWVjaGFuaXNjaCBwb2xpZXJ0IFwvIGdlZHJlaHQiLCJkZWZhdWx0Ijp0cnVlLCJzdWIiOiJSYSBpbm5lbiBcdTIyNjQwLDQwIFwvIGF1XHUwMGRmZW4gXHUyMjY0MCw4MCBcdTAwYjVtIFx1MDBiNyBtZWNoYW5pc2NoIHBvbGllcnQifSx7ImlkIjoiU3RlcmlsIiwibGFiZWwiOiJTdGVyaWwiLCJyYUlubmVuIjowLjUsInJhQXVzc2VuIjowLjgsInZlcmZhaHJlbiI6Im1lY2hhbmlzY2ggcG9saWVydCwgcG9saWVydCBcLyBnZWRyZWh0Iiwic3ViIjoiUmEgaW5uZW4gXHUyMjY0MCw1MCBcLyBhdVx1MDBkZmVuIFx1MjI2NDAsODAgXHUwMGI1bSBcdTAwYjcgbWVjaGFuaXNjaCBwb2xpZXJ0In0seyJpZCI6IkgzIiwibGFiZWwiOiJIMyIsInJhSW5uZW4iOjAuOCwicmFBdXNzZW4iOjEuNiwidmVyZmFocmVuIjoiZ2VzY2hsaWZmZW4iLCJzdWIiOiJSYSBpbm5lbiBcdTIyNjQwLDgwIFwvIGF1XHUwMGRmZW4gXHUyMjY0MSw2MCBcdTAwYjVtIn0seyJpZCI6IkgxIiwibGFiZWwiOiJIMSIsInJhSW5uZW4iOjEuNiwicmFBdXNzZW4iOjMuMiwidmVyZmFocmVuIjoiZ2ViZWl6dCBcLyBnZXNjaGxpZmZlbiIsInN1YiI6IlJhIGlubmVuIDwxLDYwIFwvIGF1XHUwMGRmZW4gPDMsMjAgXHUwMGI1bSBcdTAwYjcgQ2hlbWllLVN0YW5kYXJkIn1dLCJkaWNodHVuZ2VuIjpbeyJpZCI6IkVQRE0iLCJjb2RlIjoiRSIsImFydGlrZWxDb2RlIjoiRVBETSIsImxhYmVsIjoiRVBETSIsImZhcmJlIjoiIzJiMmIyYiIsInRlbXBNaW4iOi00MCwidGVtcE1heCI6MTUwLCJicmFuY2hlbiI6WyJwaGFybWEiLCJzdGVyaWx0ZWNobmlrIiwibGViZW5zbWl0dGVsIl0sImZkYSI6dHJ1ZSwidXNwVkkiOnRydWUsInN1YiI6Ildhc3NlciwgV0ZJLCBEYW1wZiwgQ0lQXC9TSVAifSx7ImlkIjoiVk1RIiwiY29kZSI6IlMiLCJhcnRpa2VsQ29kZSI6IlZNUSIsImxhYmVsIjoiU2lsaWtvbiAoVk1RKSIsImZhcmJlIjoiI2U3ZTJkOCIsInRlbXBNaW4iOi02MCwidGVtcE1heCI6MjAwLCJicmFuY2hlbiI6WyJsZWJlbnNtaXR0ZWwiLCJwaGFybWEiXSwiZmRhIjp0cnVlLCJ1c3BWSSI6dHJ1ZSwic3ViIjoiSGVydm9ycmFnZW5kZSBUZW1wZXJhdHVyYmVzdFx1MDBlNG5kaWdrZWl0IFx1MDBiNyBCZWRpbmd0IGZcdTAwZmNyIERhbXBmIn0seyJpZCI6IkZLTSIsImNvZGUiOiJWIiwiYXJ0aWtlbENvZGUiOiJGS00iLCJsYWJlbCI6IlZpdG9uIChGS00pIiwiZmFyYmUiOiIjMmY3ZDNhIiwidGVtcE1pbiI6LTIwLCJ0ZW1wTWF4IjoyMDAsImJyYW5jaGVuIjpbImNoZW1pZSJdLCJmZGEiOnRydWUsInVzcFZJIjp0cnVlLCJzdWIiOiJBdVx1MDBkZmVyb3JkZW50bGljaGUgQmVzdFx1MDBlNG5kaWdrZWl0IGdlZ2VuIFx1MDBkNmxlLCBGZXR0ZSwgU1x1MDBlNHVyZW4gdW5kIHNjaHdhY2hlbiBBbGthbGllbiJ9LHsiaWQiOiJQVEZFIiwiY29kZSI6IlAiLCJhcnRpa2VsQ29kZSI6IlBURkUiLCJsYWJlbCI6IlBURkUiLCJmYXJiZSI6IiNmNGY0ZjQiLCJ0ZW1wTWluIjotMjAwLCJ0ZW1wTWF4IjoyNjAsImJyYW5jaGVuIjpbImNoZW1pZSIsInBoYXJtYSIsInN0ZXJpbHRlY2huaWsiXSwiZmRhIjp0cnVlLCJ1c3BWSSI6dHJ1ZSwic3ViIjoibmFoZXp1IHVuaXZlcnNlbGwgY2hlbWlzY2ggYmVzdFx1MDBlNG5kaWcifSx7ImlkIjoiVlAiLCJjb2RlIjoiVlAiLCJhcnRpa2VsQ29kZSI6IlBURkVcL0ZLTSIsImxhYmVsIjoiUFRGRVwvRktNIiwiZmFyYmUiOiIjZWZlOWRmIiwidGVtcE1pbiI6LTIwLCJ0ZW1wTWF4IjoyMDAsImJyYW5jaGVuIjpbImNoZW1pZSIsInBoYXJtYSIsInN0ZXJpbHRlY2huaWsiXSwiZmRhIjp0cnVlLCJ1c3BWSSI6dHJ1ZSwic3ViIjoiUFRGRS11bW1hbnRlbHQgbWl0IEZLTS1LZXJuIFx1MDBiNyBiZXN0XHUwMGU0bmRpZyArIHJcdTAwZmNja3N0ZWxsZlx1MDBlNGhpZyJ9XSwiZGljaHR1bmdBdXNmdWVocnVuZyI6W3siaWQiOiJMIiwibGFiZWwiOiJtaXQgTGlwcGUgKFR5cCBJSSkifSx7ImlkIjoiTyIsImxhYmVsIjoib2huZSBMaXBwZSAoVHlwIEkpIn1dLCJmZGFLb25mb3JtaXRhZXQiOnsicGhhcm1hIjoiRkRBIFwvIFVTUCBDbGFzcyBWSSBcdTAwYjcgQURJXC9CU0VcL1RTRSIsInN0ZXJpbHRlY2huaWsiOiJGREEgXC8gVVNQIENsYXNzIFZJIFx1MDBiNyBBRElcL0JTRVwvVFNFIiwibGViZW5zbWl0dGVsIjoiRkRBIFwvIEVHIDE5MzVcLzIwMDQiLCJjaGVtaWUiOiJGREEgXC8gRUcgMTkzNVwvMjAwNCJ9LCJmZGFLb25mb3JtaXRhZXRGYWxsYmFjayI6IkZEQSBcLyBFRyAxOTM1XC8yMDA0IiwiZmRhS3VyeiI6eyJwaGFybWEiOiJVU1AgQ2xhc3MgVkkiLCJzdGVyaWx0ZWNobmlrIjoiVVNQIENsYXNzIFZJIiwibGViZW5zbWl0dGVsIjoiRUcgMTkzNVwvMjAwNCIsImNoZW1pZSI6IkVHIDE5MzVcLzIwMDQifSwibmFjaHdlaXNlIjpbeyJpZCI6IkVOMTAyMDRfMzEiLCJsYWJlbCI6IkFibmFobWVwclx1MDBmY2Z6ZXVnbmlzIDMuMSIsInN1YiI6IkVOIDEwMjA0LCBjaGFyZ2VuYmV6b2dlbiJ9LHsiaWQiOiJFTjEwMjA0XzMxX0FEVzIiLCJsYWJlbCI6IkFibmFobWVwclx1MDBmY2Z6ZXVnbmlzIDMuMSBuYWNoIEFELVcyIiwic3ViIjoiRU4gMTAyMDQsIGNoYXJnZW5iZXpvZ2VuIn0seyJpZCI6IkZEQSIsImxhYmVsIjoiRkRBIFwvIEVHIDE5MzVcLzIwMDQiLCJzdWIiOiJNZWRpZW5iZXJcdTAwZmNocnRlIFdlcmtzdG9mZmUiLCJhbndlbmR1bmdzTGFiZWwiOiJmZGFLb25mb3JtaXRhZXQifSx7ImlkIjoiRkVSUklUIiwibGFiZWwiOiJGZXJyaXQtTWVzc3VuZyIsInN1YiI6IkRlbHRhLUZlcnJpdC1HZWhhbHQifSx7ImlkIjoiUkFfUFJPVCIsImxhYmVsIjoiUmEtTWVzc3Byb3Rva29sbCIsInN1YiI6Ik9iZXJmbFx1MDBlNGNoZW5yYXVoZWl0In1dLCJtZW5nZW5zdGFmZmVsIjpbMSwyNSw1MCwxMDAsMjUwXSwiZWluc2F0eiI6eyJub3JtIjoiRElOIDMyNjc2IiwiZHJ1Y2tCYW5kcyI6W3siYWRNYXgiOjQyLjQsImJhciI6MjUsIm1wYSI6Mi41fSx7ImFkTWF4Ijo3Ni4yLCJiYXIiOjE2LCJtcGEiOjEuNn0seyJhZE1heCI6MjE5LjEsImJhciI6MTAsIm1wYSI6MX1dLCJ0ZW1wTWluIjotMTAsInRlbXBNYXgiOjE0MCwidGVtcEhpbndlaXMiOiJiZWkgZ2VlaWduZXRlbiBLbGFtbWVybiB1bmQgRGljaHR1bmdzd2Vya3N0b2ZmZW4iLCJwbGFjZWhvbGRlciI6ZmFsc2V9LCJjb25zdHJhaW50cyI6W3sid2VubiI6eyJvYmVyZmxhZWNoZSI6Ikg0byJ9LCJlbXBmaWVobFdlcmtzdG9mZiI6IjEuNDQzNSIsImdydW5kIjoiRWxla3Ryb3BvbGl0dXIgKEg0bykgd2lyZCBtaXQgMS40NDM1IGVtcGZvaGxlbi4ifV0sInByZWlzZSI6eyJwbGF0emhhbHRlciI6dHJ1ZSwid2FlaHJ1bmciOiJFVVIiLCJnbG9iYWxGYWt0b3IiOjEsImZyZWlnZWdlYmVuIjpmYWxzZSwiZ3J1bmRwcmVpcyI6eyJUQyI6bnVsbCwiVENEIjpudWxsLCJUQ1MiOm51bGwsIkQiOm51bGwsIkNGIjpudWxsLCJDRkkiOm51bGwsIkJEIjpudWxsLCJLTCI6bnVsbCwiQjkwIjpudWxsLCJCNDUiOm51bGwsIlRTIjpudWxsLCJUU1IiOm51bGwsIlIiOm51bGx9LCJkbkZha3RvclJlZk9EIjoyNSwiZG5GYWt0b3JTdGVpZ3VuZyI6MCwid2Vya3N0b2ZmWnVzY2hsYWdQcm96ZW50Ijp7IjEuNDQwNCI6bnVsbCwiMS40NDM1IjpudWxsfSwib2JlcmZsYWVjaGVadXNjaGxhZ1Byb3plbnQiOnsiSDRvIjpudWxsLCJINCI6bnVsbCwiU3RlcmlsIjpudWxsLCJIMyI6bnVsbCwiSDEiOm51bGx9LCJkaWNodHVuZ0F1ZnByZWlzRXVybyI6eyJFUERNIjpudWxsLCJWTVEiOm51bGwsIkZLTSI6bnVsbCwiUFRGRSI6bnVsbCwiVlAiOm51bGx9LCJuYWNod2Vpc0F1ZnByZWlzRXVybyI6eyJFTjEwMjA0XzMxIjowLCJFTjEwMjA0XzMxX0FEVzIiOm51bGwsIkZEQSI6MCwiRkVSUklUIjpudWxsLCJSQV9QUk9UIjpudWxsfSwibmFjaHdlaXNTdGFuZGFyZCI6WyJGREEiXSwic3RhZmZlbCI6W3siYWIiOjEsInJhYmF0dCI6MH1dfX07d2luZG93LldFSVNTX1NIQVJFX0JBU0U9Imh0dHBzOlwvXC93ZWlzcy1hcHBhcmF0ZWJhdS5kZVwvZW5cL3NlcnZpY2VcL3RyaS1jbGFtcC1jb25uZWN0aW9ucy1zdGFpbmxlc3Mtc3RlZWxcLyI7d2luZG93LldFSVNTX1BSRUxPQUQ9Ij9ub3JtPWRpbjMyNjc2Ijs8L3NjcmlwdD48c2NyaXB0PndpbmRvdy5XRUlTU19JMThOPXsKICJleGFrdCI6IHsKICAiQWIgaGllciB3w6RjaHN0IGRpZSBaZWljaG51bmcgcmVjaHRzIGxpdmUgbWl0IGRlaW5lciBBdXN3YWhsLiI6ICJGcm9tIGhlcmUgdGhlIGRyYXdpbmcgb24gdGhlIHJpZ2h0IGdyb3dzIGxpdmUgd2l0aCB5b3VyIHNlbGVjdGlvbi4iLAogICJBYm5haG1lcHLDvGZ6ZXVnbmlzIDMuMSI6ICJJbnNwZWN0aW9uIGNlcnRpZmljYXRlIDMuMSIsCiAgIkFibmFobWVwcsO8ZnpldWduaXMgMy4xIG5hY2ggQUQtVzIiOiAiSW5zcGVjdGlvbiBjZXJ0aWZpY2F0ZSAzLjEgdG8gQUQtVzIiLAogICJBbGxlIERJTi0xMTg2NS1GaXR0aW5ncyBmw7xyIE9yYml0YWxzY2h3ZWnDn3VuZy4iOiAiQWxsIERJTiAxMTg2NSBmaXR0aW5ncyBmb3Igb3JiaXRhbCB3ZWxkaW5nLiIsCiAgIkFuZnJhZ2UiOiAiSW5xdWlyeSIsCiAgIkFuZnJhZ2UgcGVyIEUtTWFpbCBzZW5kZW4iOiAiU2VuZCBpbnF1aXJ5IGJ5IGUtbWFpbCIsCiAgIkFuZnJhZ2UgenVzYW1tZW5zdGVsbGVuIjogIkNvbXBpbGUgaW5xdWlyeSIsCiAgIkFuc2Nod2Vpc3NzdHV0emVuIG1pdCBDbGFtcGFuc2NobHVzcyI6ICJXZWxkLW9uIGZlcnJ1bGUgd2l0aCBjbGFtcCBjb25uZWN0aW9uIiwKICAiQW5zaWNodCI6ICJWaWV3IiwKICAiQW5zaWNodDoiOiAiVmlldzoiLAogICJBbndlbmR1bmciOiAiQXBwbGljYXRpb24iLAogICJBdWYgQW5mcmFnZSI6ICJPbiByZXF1ZXN0IiwKICAiYXVmIEFuZnJhZ2UiOiAib24gcmVxdWVzdCIsCiAgIkF1cyBkZXIgQW53ZW5kdW5nIHNjaGxhZ2VuIHdpciBXZXJrc3RvZmYsIE9iZXJmbMOkY2hlIHVuZCBEaWNodHVuZyBzaW5udm9sbCB2b3IuIEFucGFzc2VuIGthbm5zdCBkdSBhbGxlcyBzcMOkdGVyLiI6ICJCYXNlZCBvbiB0aGUgYXBwbGljYXRpb24gd2Ugc3VnZ2VzdCBhIHN1aXRhYmxlIG1hdGVyaWFsLCBzdXJmYWNlIGZpbmlzaCBhbmQgZ2Fza2V0LiBZb3UgY2FuIGNoYW5nZSBldmVyeXRoaW5nIGxhdGVyLiIsCiAgIkF1c2bDvGhydW5nIjogIkRlc2lnbiIsCiAgIkF1w59lcm9yZGVudGxpY2hlIEJlc3TDpG5kaWdrZWl0IGdlZ2VuIMOWbGUsIEZldHRlLCBTw6R1cmVuIHVuZCBzY2h3YWNoZW4gQWxrYWxpZW4gwrcgRkRBIMK3IFVTUCBDbGFzcyBWSSI6ICJPdXRzdGFuZGluZyByZXNpc3RhbmNlIHRvIG9pbHMsIGdyZWFzZXMsIGFjaWRzIGFuZCB3ZWFrIGFsa2FsaXMgwrcgRkRBIMK3IFVTUCBDbGFzcyBWSSIsCiAgIkJhdXRlaWwiOiAiQ29tcG9uZW50IiwKICAiQmF1dGVpbCB3w6RobGVuIjogIlNlbGVjdCBjb21wb25lbnQiLAogICJCZWlkZSBzaW5kIGF1cyBkZXIgQW53ZW5kdW5nIHZvcmJlbGVndC4iOiAiQm90aCBhcmUgcHJlc2V0IGZyb20gdGhlIGFwcGxpY2F0aW9uLiIsCiAgIkLDtmdlbiwgVC1TdMO8Y2tlLCBSZWR1emllcnVuZ2VuIC0gYXVmIEFuZnJhZ2UsIGplIG5hY2ggVmVyZsO8Z2JhcmtlaXQuIjogIkJlbmRzLCB0ZWVzLCByZWR1Y2VycyAtIG9uIHJlcXVlc3QsIHN1YmplY3QgdG8gYXZhaWxhYmlsaXR5LiIsCiAgIkNsYW1wc3R1dHplbiwgQmxpbmRkZWNrZWwsIEtsYW1tZXJuIOKAkyBQcmVpcyBhdWYgQW5mcmFnZS4iOiAiQ2xhbXAgZmVycnVsZXMsIGJsYW5rIGNhcHMsIGNsYW1wcyAtIHByaWNlIG9uIHJlcXVlc3QuIiwKICAiRElOIDExODY1IOKAkyBGaXJtYSBXZWlzcyBrYWxrdWxpZXJ0IGluZGl2aWR1ZWxsLiI6ICJESU4gMTE4NjUgLSBXZWlzcyBxdW90ZXMgaW5kaXZpZHVhbGx5LiIsCiAgIkRJTiAxMTg2NSDigJMgR2VzY2h3ZWnDn3RlIEZpdHRpbmdzIjogIkRJTiAxMTg2NSAtIHdlbGRlZCBmaXR0aW5ncyIsCiAgIkRJTiAzMjY3NiDigJMgRmlybWEgV2Vpc3Mga2Fsa3VsaWVydCBpbmRpdmlkdWVsbC4iOiAiRElOIDMyNjc2IC0gV2Vpc3MgcXVvdGVzIGluZGl2aWR1YWxseS4iLAogICJESU4gMzI2NzYg4oCTIENsYW1wdmVyYmluZHVuZyI6ICJESU4gMzI2NzYgLSBjbGFtcCBjb25uZWN0aW9uIiwKICAiRGFzIEFibmFobWVwcsO8ZnpldWduaXMgMy4xIGlzdCBrb3N0ZW5sb3MuIDMuMSBuYWNoIEFELVcyLCBGZXJyaXQtTWVzc3VuZyB1bmQgUmEtTWVzc3Byb3Rva29sbCBnaWJ0IGVzIGdlZ2VuIE1laHJrb3N0ZW4uIjogIlRoZSBpbnNwZWN0aW9uIGNlcnRpZmljYXRlIDMuMSBpcyBmcmVlIG9mIGNoYXJnZS4gMy4xIHRvIEFELVcyLCBmZXJyaXRlIG1lYXN1cmVtZW50IGFuZCBSYSB0ZXN0IHJlcG9ydCBhcmUgYXZhaWxhYmxlIGF0IGV4dHJhIGNvc3QuIiwKICAiRGljaHR1bmcgd8OkaGxlbiI6ICJTZWxlY3QgZ2Fza2V0IiwKICAiRGllIERpY2h0dW5nc2ZhcmJlIGVyc2NoZWludCBkaXJla3QgaW4gZGVyIFplaWNobnVuZy4gQWxsZSBTdGFuZGFyZGRpY2h0dW5nZW4gdm9uIEZpcm1hIFdlaXNzIHNpbmQgRkRBLSB1bmQgVVNQIENsYXNzIFZJLWtvbmZvcm0uIjogIlRoZSBnYXNrZXQgY29sb3VyIGFwcGVhcnMgZGlyZWN0bHkgaW4gdGhlIGRyYXdpbmcuIEFsbCBzdGFuZGFyZCBnYXNrZXRzIGZyb20gV2Vpc3MgY29tcGx5IHdpdGggRkRBIGFuZCBVU1AgQ2xhc3MgVkkuIiwKICAiRWluc2F0eiI6ICJVc2UiLAogICJGREEgLyBVU1AgQ2xhc3MgVkkgwrcgQURJL0JTRS9UU0UgKFN0YW5kYXJkKSDigJQgYmVpIGFsbGVuIFN0YW5kYXJkZGljaHR1bmdlbiB2b24gRmlybWEgV2Vpc3MgaW5rbHVzaXZlLiI6ICJGREEgLyBVU1AgQ2xhc3MgVkkgwrcgQURJL0JTRS9UU0UgKHN0YW5kYXJkKSAtIGluY2x1ZGVkIHdpdGggYWxsIHN0YW5kYXJkIGdhc2tldHMgZnJvbSBXZWlzcy4iLAogICJGaXJtYSI6ICJDb21wYW55IiwKICAiRmlybWEgV2Vpc3Mga2Fsa3VsaWVydCBiZWlkZSBQcm9kdWt0Z3J1cHBlbiBpbmRpdmlkdWVsbCBhdWYgQW5mcmFnZS4iOiAiV2Vpc3MgcXVvdGVzIGJvdGggcHJvZHVjdCBncm91cHMgaW5kaXZpZHVhbGx5IG9uIHJlcXVlc3QuIiwKICAiR2V0csOkbmtlLCBNb2xrZXJlaSwgRm9vZCI6ICJCZXZlcmFnZXMsIGRhaXJ5LCBmb29kIiwKICAiR3LDtsOfZSI6ICJTaXplIiwKICAiR3LDtsOfZSAoT0QpIjogIlNpemUgKE9EKSIsCiAgIkdyw7bDn2UgbmFjaCBGbGFuc2NoLcOYIjogIlNpemUgYnkgZmxhbmdlIOKMgCIsCiAgIkhlcnZvcnJhZ2VuZGUgVGVtcGVyYXR1cmJlc3TDpG5kaWdrZWl0IMK3IEJlZGluZ3QgZsO8ciBEYW1wZiDCtyBGREEgwrcgVVNQIENsYXNzIFZJIjogIkV4Y2VsbGVudCB0ZW1wZXJhdHVyZSByZXNpc3RhbmNlIMK3IGxpbWl0ZWQgZm9yIHN0ZWFtIMK3IEZEQSDCtyBVU1AgQ2xhc3MgVkkiLAogICJIb2NoZHJ1Y2trbGFtbWVyIOKAkyB6d2VpIEhhbGJzY2hhbGVuIG1pdCBsw7ZzYmFyZW4gVmVyYmluZHVuZ2VuICgyIEdlbGVua2UpIjogIkhpZ2gtcHJlc3N1cmUgY2xhbXAgLSB0d28gaGFsZiBzaGVsbHMgd2l0aCBkZXRhY2hhYmxlIGpvaW50cyAoMiBoaW5nZXMpIiwKICAiSW5saW5lLUF1c2bDvGhydW5nIjogIklubGluZSBkZXNpZ24iLAogICJLbGFtbWVyIGRlciBrb21wbGV0dGVuIFZlcmJpbmR1bmciOiAiQ2xhbXAgb2YgdGhlIGNvbXBsZXRlIGNvbm5lY3Rpb24iLAogICJLbGFtbWVyIG1pdCBlaW5lbSBHZWxlbmsgdW5kIHp3ZWkgUGlucyI6ICJDbGFtcCB3aXRoIG9uZSBoaW5nZSBhbmQgdHdvIHBpbnMiLAogICJLbGFtbWVyIG1pdCBlaW5mYWNoZW0gR2VsZW5rIHVuZCBlaW5lbSBQaW4iOiAiQ2xhbXAgd2l0aCBhIHNpbmdsZSBoaW5nZSBhbmQgb25lIHBpbiIsCiAgIktvbmZpZ3VyYXRpb24gYXVmIGRlbiBVcnNwcnVuZ3N6dXN0YW5kIHp1csO8Y2tzZXR6ZW4iOiAiUmVzZXQgdGhlIGNvbmZpZ3VyYXRpb24gdG8gaXRzIG9yaWdpbmFsIHN0YXRlIiwKICAiTMOkbmdzc2Nobml0dCAoQm9nZW4gNDXCsCkiOiAiTG9uZ2l0dWRpbmFsIHNlY3Rpb24gKDQ1wrAgYmVuZCkiLAogICJMw6RuZ3NzY2huaXR0IChCb2dlbiA5MMKwKSI6ICJMb25naXR1ZGluYWwgc2VjdGlvbiAoOTDCsCBiZW5kKSIsCiAgIkzDpG5nc3NjaG5pdHQgKENsYW1wLVZlcmJpbmR1bmcpIjogIkxvbmdpdHVkaW5hbCBzZWN0aW9uIChjbGFtcCBjb25uZWN0aW9uKSIsCiAgIkzDpG5nc3NjaG5pdHQgKFQtU3TDvGNrKSI6ICJMb25naXR1ZGluYWwgc2VjdGlvbiAodGVlKSIsCiAgIkzDpG5nc3NjaG5pdHQgKGVpbnplbG5lciBTdHV0emVuKSI6ICJMb25naXR1ZGluYWwgc2VjdGlvbiAoc2luZ2xlIGZlcnJ1bGUpIiwKICAiTMO2c2VtaXR0ZWwsIFPDpHVyZW4sIMOWbGUiOiAiU29sdmVudHMsIGFjaWRzLCBvaWxzIiwKICAiTWHDn2UgZmVzdGxlZ2VuIjogIkRlZmluZSBkaW1lbnNpb25zIiwKICAiTWVkaWVuYmVyw7xocnRlIFdlcmtzdG9mZmUiOiAiUHJvZHVjdC1jb250YWN0IG1hdGVyaWFscyIsCiAgIk5hY2h3ZWlzZSAmIE1lbmdlIjogIkNlcnRpZmljYXRlcyAmIHF1YW50aXR5IiwKICAiTm9ybSI6ICJTdGFuZGFyZCIsCiAgIk9iZXJmbMOkY2hlIjogIlN1cmZhY2UgZmluaXNoIiwKICAiT2JlcmZsw6RjaGUgKERJTiAxMTg2NikiOiAiU3VyZmFjZSBmaW5pc2ggKERJTiAxMTg2NikiLAogICJPYmVyZmzDpGNoZToiOiAiU3VyZmFjZSBmaW5pc2g6IiwKICAiT2JlcmZsw6RjaGVucmF1aGVpdCI6ICJTdXJmYWNlIHJvdWdobmVzcyIsCiAgIlBURkUtdW1tYW50ZWx0IG1pdCBGS00tS2VybiDCtyBiZXN0w6RuZGlnICsgcsO8Y2tzdGVsbGbDpGhpZyDCtyBGREEgwrcgVVNQIENsYXNzIFZJIjogIlBURkUtamFja2V0ZWQgd2l0aCBGS00gY29yZSDCtyByZXNpc3RhbnQgYW5kIHJlc2lsaWVudCDCtyBGREEgwrcgVVNQIENsYXNzIFZJIiwKICAiUHJlaXNlIHdlcmRlbiBpbmRpdmlkdWVsbCBhbmdlYm90ZW4uIE5pY2h0IGJlbGVndGUgTWHDn2Ugb2RlciBBcnRpa2VsbnVtbWVybiBlcmfDpG56dCBGaXJtYSBXZWlzcyBpbSBBbmdlYm90OyB3aWRlcnNwcsO8Y2hsaWNoZSBvZGVyIG5pY2h0IGdlbGllZmVydGUgQmVyZWljaGUgYmxlaWJlbiBnZXNwZXJydCB1bmQgd2VyZGVuIG5pY2h0IGdlc2Now6R0enQuIjogIlByaWNlcyBhcmUgcXVvdGVkIGluZGl2aWR1YWxseS4gV2Vpc3MgYWRkcyBhbnkgZGltZW5zaW9ucyBvciBhcnRpY2xlIG51bWJlcnMgbm90IGNvdmVyZWQgaGVyZSBpbiB0aGUgcXVvdGF0aW9uOyBjb250cmFkaWN0b3J5IG9yIHVuc3VwcGxpZWQgcmFuZ2VzIHN0YXkgbG9ja2VkIGFuZCBhcmUgbm90IGVzdGltYXRlZC4iLAogICJQcsO8ZmUgZGllIGJlbGVndGVuIEFuZ2FiZW4gdW5kIGVyZ8OkbnplIGRlaW5lbiBLb250YWt0LiBPZmZlbmUgV2VydGUgYmxlaWJlbiBkZXV0bGljaCBnZWtlbm56ZWljaG5ldC4iOiAiQ2hlY2sgdGhlIGRldGFpbHMgcHJvdmlkZWQgYW5kIGFkZCB5b3VyIGNvbnRhY3QgZGF0YS4gT3BlbiB2YWx1ZXMgcmVtYWluIGNsZWFybHkgbWFya2VkLiIsCiAgIlIsIEwxLCBMMiB1bmQgTDMgc3RhbW1lbiBhdXMgZGVyIGF1c2dlZsO8bGx0ZW4gV2Vpc3MtTWHDn3RhYmVsbGUuIERpZSB2b24gRmlybWEgV2Vpc3Mga29ycmlnaWVydGVuIEROMjUtV2VydGUgc2luZCBlbnRoYWx0ZW4uIjogIlIsIEwxLCBMMiBhbmQgTDMgY29tZSBmcm9tIHRoZSBjb21wbGV0ZWQgV2Vpc3MgZGltZW5zaW9uIHRhYmxlLiBUaGUgRE4yNSB2YWx1ZXMgY29ycmVjdGVkIGJ5IFdlaXNzIGFyZSBpbmNsdWRlZC4iLAogICJSYSBpbm5lbiA8MSw2MCAvIGF1w59lbiA8MywyMCDCtW0gwrcgQ2hlbWllLVN0YW5kYXJkIMK3IGdlYmVpenQgLyBnZXNjaGxpZmZlbiI6ICJSYSBpbnNpZGUgPDEuNjAgLyBvdXRzaWRlIDwzLjIwIMK1bSDCtyBjaGVtaWNhbCBzdGFuZGFyZCDCtyBwaWNrbGVkIC8gZ3JvdW5kIiwKICAiUmEgaW5uZW4g4omkMCw0MCAvIGF1w59lbiDiiaQwLDgwIMK1bSDCtyBlbGVrdHJvcG9saWVydCDCtyBlbGVrdHJvcG9saWVydCAoRVApIjogIlJhIGluc2lkZSDiiaQwLjQwIC8gb3V0c2lkZSDiiaQwLjgwIMK1bSDCtyBlbGVjdHJvcG9saXNoZWQgwrcgZWxlY3Ryb3BvbGlzaGVkIChFUCkiLAogICJSYSBpbm5lbiDiiaQwLDQwIC8gYXXDn2VuIOKJpDAsODAgwrVtIMK3IG1lY2hhbmlzY2ggcG9saWVydCDCtyBtZWNoYW5pc2NoIHBvbGllcnQgLyBnZWRyZWh0IjogIlJhIGluc2lkZSDiiaQwLjQwIC8gb3V0c2lkZSDiiaQwLjgwIMK1bSDCtyBtZWNoYW5pY2FsbHkgcG9saXNoZWQgwrcgbWVjaGFuaWNhbGx5IHBvbGlzaGVkIC8gdHVybmVkIiwKICAiUmEgaW5uZW4g4omkMCw1MCAvIGF1w59lbiDiiaQwLDgwIMK1bSDCtyBtZWNoYW5pc2NoIHBvbGllcnQgwrcgbWVjaGFuaXNjaCBwb2xpZXJ0LCBwb2xpZXJ0IC8gZ2VkcmVodCI6ICJSYSBpbnNpZGUg4omkMC41MCAvIG91dHNpZGUg4omkMC44MCDCtW0gwrcgbWVjaGFuaWNhbGx5IHBvbGlzaGVkIMK3IG1lY2hhbmljYWxseSBwb2xpc2hlZCwgcG9saXNoZWQgLyB0dXJuZWQiLAogICJSYSBpbm5lbiDiiaQwLDgwIC8gYXXDn2VuIOKJpDEsNjAgwrVtIMK3IGdlc2NobGlmZmVuIjogIlJhIGluc2lkZSDiiaQwLjgwIC8gb3V0c2lkZSDiiaQxLjYwIMK1bSDCtyBncm91bmQiLAogICJSZWloZSB1bmQgR3LDtsOfZSBiZXN0aW1tZW4gZGllIEdlb21ldHJpZS4gRGllIFplaWNobnVuZyB1bmQgZGllIE1hw59rZXR0ZW4gd2FjaHNlbiBsaXZlIG1pdC4iOiAiU2VyaWVzIGFuZCBzaXplIGRldGVybWluZSB0aGUgZ2VvbWV0cnkuIFRoZSBkcmF3aW5nIGFuZCB0aGUgZGltZW5zaW9uIGNoYWlucyBncm93IHdpdGggaXQgbGl2ZS4iLAogICJTdHV0emVubMOkbmdlIjogIkZlcnJ1bGUgbGVuZ3RoIiwKICAiU3TDvGNremFobCI6ICJRdWFudGl0eSIsCiAgIlQtU3TDvGNrIjogIlRlZSIsCiAgIlQtU3TDvGNrIHJlZHV6aWVydCI6ICJSZWR1Y2luZyB0ZWUiLAogICJUaXBwOiBMYWRlIGRpZSBQbGFuc2tpenplIGFscyBQREYgaGVydW50ZXIgdW5kIGjDpG5nIHNpZSBkZWluZXIgQW5mcmFnZS1NYWlsIGFuIOKAlCBGaXJtYSBXZWlzcyBiZWtvbW10IGRhbWl0IGRpcmVrdCBkaWUgZmVydGlnZSBTa2l6emUgbWl0IGFsbGVuIE1hw59lbi4iOiAiVGlwOiBkb3dubG9hZCB0aGUgc2tldGNoIGFzIGEgUERGIGFuZCBhdHRhY2ggaXQgdG8geW91ciBpbnF1aXJ5IGUtbWFpbCAtIFdlaXNzIHRoZW4gcmVjZWl2ZXMgdGhlIGZpbmlzaGVkIHNrZXRjaCB3aXRoIGFsbCBkaW1lbnNpb25zLiIsCiAgIlZlcmJpbmR1bmdzYXJ0IHfDpGhsZW4iOiAiU2VsZWN0IHR5cGUgb2YgY29ubmVjdGlvbiIsCiAgIlZvbGxiaWxkIMO2ZmZuZW4iOiAiT3BlbiBmdWxsIHNjcmVlbiIsCiAgIldhbmRiw7xuZGlnZXIgQmVow6RsdGVyYW5zY2hsdXNzIjogIkZsdXNoIHZlc3NlbCBjb25uZWN0aW9uIiwKICAiV2VpdGVyIjogIk5leHQiLAogICJXZWl0ZXJlIFBvc2l0aW9uIGhpbnp1ZsO8Z2VuIjogIkFkZCBhbm90aGVyIGl0ZW0iLAogICJXZXJrc3RvZmYiOiAiTWF0ZXJpYWwiLAogICJXZXJrc3RvZmYgJiBPYmVyZmzDpGNoZSI6ICJNYXRlcmlhbCAmIHN1cmZhY2UgZmluaXNoIiwKICAiV2Vya3N0b2ZmOiI6ICJNYXRlcmlhbDoiLAogICJXb2bDvHIgd2lyZCBkYXMgRml0dGluZyBlaW5nZXNldHp0PyI6ICJXaGF0IHdpbGwgdGhlIGZpdHRpbmcgYmUgdXNlZCBmb3I\\\/IiwKICAiV8OkaGxlIGxpbmtzIGRpZSBBbndlbmR1bmcg4oCUIGRhbm4gYmF1dCBzaWNoIGhpZXIgZGVpbiBGaXR0aW5nIGxpdmUgbWl0IFplaWNobnVuZyB1bmQgYmVsZWd0ZW4gTWHDn2VuIGF1Zi4iOiAiU2VsZWN0IHRoZSBhcHBsaWNhdGlvbiBvbiB0aGUgbGVmdCAtIHlvdXIgZml0dGluZyB0aGVuIGJ1aWxkcyB1cCBoZXJlIGxpdmUgd2l0aCBhIGRyYXdpbmcgYW5kIGRvY3VtZW50ZWQgZGltZW5zaW9ucy4iLAogICJYMkNyTmlNbzE4LTE0LTMgwrcgMzE2TCDCtyBIw7ZoZXJlciBNby9OaS1BbnRlaWwsIGbDvHIgRWxla3Ryb3BvbGl0dXIgdW5kIFJlaW5zdG1lZGllbi4iOiAiWDJDck5pTW8xOC0xNC0zIMK3IDMxNkwgwrcgaGlnaGVyIE1vL05pIGNvbnRlbnQsIGZvciBlbGVjdHJvcG9saXNoaW5nIGFuZCB1bHRyYXB1cmUgbWVkaWEuIiwKICAiWDJDck5pTW8xNy0xMi0yIMK3IDMxNkwgwrcgU3RhbmRhcmQgaW0gSHlnaWVuaWMgRGVzaWduLCBzZWhyIGd1dCBzY2h3ZWlzc2Jhci4iOiAiWDJDck5pTW8xNy0xMi0yIMK3IDMxNkwgwrcgc3RhbmRhcmQgaW4gaHlnaWVuaWMgZGVzaWduLCB2ZXJ5IGdvb2Qgd2VsZGFiaWxpdHkuIiwKICAiWmVpY2hudW5nIjogIkRyYXdpbmciLAogICJaZXJ0aWZpa2F0ZSB6dWJ1Y2hlbiB1bmQgU3TDvGNremFobCB3w6RobGVuLiBCZWlkZXMgZ2VodCBtaXQgaW4gZGllIEFuZnJhZ2UuIjogIkFkZCBjZXJ0aWZpY2F0ZXMgYW5kIGNob29zZSB0aGUgcXVhbnRpdHkuIEJvdGggZ28gaW50byB0aGUgaW5xdWlyeS4iLAogICJadXLDvGNrIjogIkJhY2siLAogICJadXLDvGNrc2V0emVuIjogIlJlc2V0IiwKICAiV2lya2xpY2ggenVyw7xja3NldHplbj8iOiAiUmVhbGx5IHJlc2V0PyIsCiAgIm5haGV6dSB1bml2ZXJzZWxsIGNoZW1pc2NoIGJlc3TDpG5kaWcgwrcgRkRBIMK3IFVTUCBDbGFzcyBWSSI6ICJhbG1vc3QgdW5pdmVyc2FsbHkgY2hlbWljYWxseSByZXNpc3RhbnQgwrcgRkRBIMK3IFVTUCBDbGFzcyBWSSIsCiAgIsK3IERJTiAxMTg2NSBhdWYgQW5mcmFnZSI6ICLCtyBESU4gMTE4NjUgb24gcmVxdWVzdCIsCiAgIkFuc3ByZWNocGFydG5lciI6ICJDb250YWN0IHBlcnNvbiIsCiAgIkFzZXB0aWssIENJUC9TSVAiOiAiQXNlcHRpYywgQ0lQL1NJUCIsCiAgIkJlaXNwaWVsLURhcnN0ZWxsdW5nLiI6ICJFeGFtcGxlIGlsbHVzdHJhdGlvbi4iLAogICJCbGluZGRlY2tlbCI6ICJCbGFuayBjYXAiLAogICJCb2dlbiA0NcKwIjogIjQ1wrAgYmVuZCIsCiAgIkJvZ2VuIDkwwrAiOiAiOTDCsCBiZW5kIiwKICAiQ2hlbWllIjogIkNoZW1pY2FscyIsCiAgIkNvbm5lY3QtRmxhbnNjaCI6ICJDb25uZWN0IGZsYW5nZSIsCiAgIkNvbm5lY3QtRmxhbnNjaCBJbmxpbmUiOiAiQ29ubmVjdCBmbGFuZ2UgaW5saW5lIiwKICAiRGFyc3RlbGx1bmciOiAiSWxsdXN0cmF0aW9uIiwKICAiRGVsdGEtRmVycml0LUdlaGFsdCI6ICJEZWx0YSBmZXJyaXRlIGNvbnRlbnQiLAogICJEaWNodHVuZyI6ICJHYXNrZXQiLAogICJFLU1haWwiOiAiRS1tYWlsIiwKICAiRU4gMTAyMDQsIGNoYXJnZW5iZXpvZ2VuIjogIkVOIDEwMjA0LCBiYXRjaC1yZWxhdGVkIiwKICAiRWluemVsbmUgRGljaHR1bmciOiAiU2luZ2xlIGdhc2tldCIsCiAgIkVpbnplbG5lciBUcmlDbGFtcC1TdHV0emVuIjogIlNpbmdsZSBUcmktQ2xhbXAgZmVycnVsZSIsCiAgIkVzIGlzdCBub2NoIG5pY2h0cyBrb25maWd1cmllcnQuIjogIk5vdGhpbmcgaGFzIGJlZW4gY29uZmlndXJlZCB5ZXQuIiwKICAiRmVycml0LU1lc3N1bmciOiAiRmVycml0ZSBtZWFzdXJlbWVudCIsCiAgIkZpdHRpbmdzLUtvbmZpZ3VyYXRvciI6ICJGaXR0aW5ncyBjb25maWd1cmF0b3IiLAogICJGbGFuc2NoLeKMgCI6ICJGbGFuZ2Ug4oyAIiwKICAiRm9ydHNjaHJpdHQiOiAiUHJvZ3Jlc3MiLAogICJGcm9udGFuc2ljaHQgKEtsYW1tZXIgS0wxKSI6ICJGcm9udCB2aWV3IChjbGFtcCBLTDEpIiwKICAiS2xhbW1lciAvIFNwYW5ucmluZyI6ICJDbGFtcCAvIGNsYW1waW5nIHJpbmciLAogICJLbGFtbWVydHlwIjogIkNsYW1wIHR5cGUiLAogICJLb21wbGV0dGUgVHJpQ2xhbXAgVmVyYmluZHVuZyI6ICJDb21wbGV0ZSBUcmktQ2xhbXAgY29ubmVjdGlvbiIsCiAgIktvbmZpZ3VyYXRpb24gdGVpbGVuIjogIlNoYXJlIGNvbmZpZ3VyYXRpb24iLAogICJLb25maWd1cmF0aW9ucy0gLyBBcnRpa2VsLU5yLiI6ICJDb25maWd1cmF0aW9uIC8gYXJ0aWNsZSBuby4iLAogICJLb25maWd1cmF0aW9ucy1Oci4iOiAiQ29uZmlndXJhdGlvbiBuby4iLAogICJMZWJlbnNtaXR0ZWwiOiAiRm9vZCIsCiAgIk11dHRlciI6ICJOdXQiLAogICJOYWNod2Vpc2UgLyBaZXJ0aWZpa2F0ZSI6ICJDZXJ0aWZpY2F0ZXMiLAogICJOZW5ud2VpdGUiOiAiTm9taW5hbCBzaXplIiwKICAiUGxhbnNraXp6ZSBhbHMgUERGIjogIlNrZXRjaCBhcyBQREYiLAogICJQb3NpdGlvbnNsaW5rcyBrb3BpZXJlbiI6ICJDb3B5IGl0ZW0gbGlua3MiLAogICJQcm9kdWt0ZGFyc3RlbGx1bmciOiAiUHJvZHVjdCBpbGx1c3RyYXRpb24iLAogICJSYS1NZXNzcHJvdG9rb2xsIjogIlJhIHRlc3QgcmVwb3J0IiwKICAiUmVkdXppZXJ1bmciOiAiUmVkdWNlciIsCiAgIlJlaWhlIjogIlNlcmllcyIsCiAgIlNjaHJpdHQgMSI6ICJTdGVwIDEiLAogICJTY2hyaXR0IDIiOiAiU3RlcCAyIiwKICAiU2Nocml0dCAzIjogIlN0ZXAgMyIsCiAgIlNjaHJpdHQgNCI6ICJTdGVwIDQiLAogICJTY2hyaXR0IDUiOiAiU3RlcCA1IiwKICAiU2Nocml0dCA2IjogIlN0ZXAgNiIsCiAgIlNjaHJpdHQgNyI6ICJTdGVwIDciLAogICJTY2hyaXR0IDgiOiAiU3RlcCA4IiwKICAiU2lsaWtvbiAoVk1RKSI6ICJTaWxpY29uZSAoVk1RKSIsCiAgIlNvbmRlcmFibWVzc3VuZyBhbmZyYWdlbiI6ICJJbnF1aXJlIGFib3V0IGEgc3BlY2lhbCBkaW1lbnNpb24iLAogICJTb25kZXJhbmZvcmRlcnVuZ2VuIChvcHRpb25hbCkiOiAiU3BlY2lhbCByZXF1aXJlbWVudHMgKG9wdGlvbmFsKSIsCiAgIlN0ZXJpbCI6ICJTdGVyaWxlIiwKICAiU3RlcmlsdGVjaG5payI6ICJTdGVyaWxlIHRlY2hub2xvZ3kiLAogICJUQy1TdHV0emVuIjogIlRDIGZlcnJ1bGUiLAogICJUYW5rc3R1dHplbiBkaWNrd2FuZGlnIjogIkhlYXZ5LXdhbGwgdGFuayBmZXJydWxlIiwKICAiVGVsZWZvbiI6ICJQaG9uZSIsCiAgIlZlcnNjaGxpZXNzdCBlaW5lbiBDbGFtcGFuc2NobHVzcyI6ICJDbG9zZXMgb2ZmIGEgY2xhbXAgY29ubmVjdGlvbiIsCiAgIlZvbGxiaWxkICsgWm9vbSI6ICJGdWxsIHNjcmVlbiArIHpvb20iLAogICJWb3JzY2hhdSI6ICJQcmV2aWV3IiwKICAiV0ZJLCBEYW1wZi1TSVAsIGhvY2hyZWluIjogIldGSSwgc3RlYW0gU0lQLCB1bHRyYXB1cmUiLAogICJXYXNzZXIsIFdGSSwgRGFtcGYsIENJUC9TSVAgwrcgRkRBIMK3IFVTUCBDbGFzcyBWSSI6ICJXYXRlciwgV0ZJLCBzdGVhbSwgQ0lQL1NJUCDCtyBGREEgwrcgVVNQIENsYXNzIFZJIiwKICAiV3Vuc2NodGVybWluIC8gUHJvamVrdCAob3B0aW9uYWwpIjogIlByZWZlcnJlZCBkYXRlIC8gcHJvamVjdCAob3B0aW9uYWwpIiwKICAiWm9sbCI6ICJJbmNoIiwKICAiYWIgMSI6ICJmcm9tIDEiLAogICJhYiAyNSI6ICJmcm9tIDI1IiwKICAiYWIgNTAiOiAiZnJvbSA1MCIsCiAgImFiIDEwMCI6ICJmcm9tIDEwMCIsCiAgImFiIDI1MCI6ICJmcm9tIDI1MCIsCiAgImVudGZlcm5lbiI6ICJyZW1vdmUiLAogICJnbGVpY2ggwrcgbWV0cmlzY2gvSVNPL1pvbGwgwrcgRm9ybSBUIC8gRm9ybSBUSyI6ICJlcXVhbCDCtyBtZXRyaWMvSVNPL2luY2ggwrcgZm9ybSBUIC8gZm9ybSBUSyIsCiAgImtsZWluZXJlciBBYmdhbmcgwrcgRm9ybSBUIC8gRm9ybSBUSyI6ICJzbWFsbGVyIGJyYW5jaCDCtyBmb3JtIFQgLyBmb3JtIFRLIiwKICAia29uemVudHJpc2NoIChGb3JtIFJLKSAvIGV4emVudHJpc2NoIChGb3JtIFJFKSI6ICJjb25jZW50cmljIChmb3JtIFJLKSAvIGVjY2VudHJpYyAoZm9ybSBSRSkiLAogICJrb3BpZXJlbiI6ICJjb3B5IiwKICAia3VyeiAoS0spIjogInNob3J0IChLSykiLAogICJsYW5nIChLTCkiOiAibG9uZyAoS0wpIiwKICAibWVociI6ICJtb3JlIiwKICAid2VuaWdlciI6ICJsZXNzIiwKICAibWV0cmlzY2giOiAibWV0cmljIiwKICAibWV0cmlzY2ggRE4iOiAibWV0cmljIEROIiwKICAib2huZSBMaXBwZSAoVHlwIEkpIjogIndpdGhvdXQgbGlwICh0eXBlIEkpIiwKICAibWl0IExpcHBlIjogIndpdGggbGlwIiwKICAiei4gQi4gYmVzb25kZXJlIFRvbGVyYW56ZW4sIHdlaXRlcmUgWmVydGlmaWthdGUsIExpZWZlcmJlZGluZ3VuZ2VuIjogImUuZy4gc3BlY2lhbCB0b2xlcmFuY2VzLCBmdXJ0aGVyIGNlcnRpZmljYXRlcywgZGVsaXZlcnkgdGVybXMiLAogICJQcsO8ZmUgZGllIGJlbGVndGVuIEFuZ2FiZW4gdW5kIGVyZ8OkbnplIGRlaW5lbiBLb250YWt0LiI6ICJDaGVjayB0aGUgZGV0YWlscyBwcm92aWRlZCBhbmQgYWRkIHlvdXIgY29udGFjdCBkYXRhLiIsCiAgIm1pdCBQcmVpc2VuIjogIndpdGggcHJpY2VzIiwKICAiU3TDvGNrIjogInBjcyIKIH0sCiAiYmVncmlmZmUiOiB7CiAgIkJvZ2VuIDQ1wrAiOiAiNDXCsCBiZW5kIiwKICAiQm9nZW4gOTDCsCI6ICI5MMKwIGJlbmQiLAogICJULVN0w7xjayBnbGVpY2giOiAiRXF1YWwgdGVlIiwKICAiVC1TdMO8Y2sgcmVkdXppZXJ0IjogIlJlZHVjaW5nIHRlZSIsCiAgIlQtU3TDvGNrIjogIlRlZSIsCiAgIkNsYW1wLVZlcmJpbmR1bmciOiAiQ2xhbXAgY29ubmVjdGlvbiIsCiAgIktvbXBsZXR0ZSBUcmlDbGFtcCBWZXJiaW5kdW5nIjogIkNvbXBsZXRlIFRyaS1DbGFtcCBjb25uZWN0aW9uIiwKICAiRWluemVsbmVyIFRyaUNsYW1wLVN0dXR6ZW4iOiAiU2luZ2xlIFRyaS1DbGFtcCBmZXJydWxlIiwKICAiRWluemVsbmUgRGljaHR1bmciOiAiU2luZ2xlIGdhc2tldCIsCiAgIkJsaW5kZGVja2VsIjogIkJsYW5rIGNhcCIsCiAgIlJlZHV6aWVydW5nIjogIlJlZHVjZXIiLAogICJTdMO8Y2siOiAicGNzIiwKICAiRm9ybSBUIjogImZvcm0gVCIsCiAgIkZvcm0gVEsiOiAiZm9ybSBUSyIsCiAgIkVuZGt1bmRlbnByZWlzZSI6ICJFbmQgY3VzdG9tZXIgcHJpY2VzIiwKICAiT0VNLVByZWlzZSI6ICJPRU0gcHJpY2VzIiwKICAibWl0IFByZWlzZW4iOiAid2l0aCBwcmljZXMiLAogICJhdWYgQW5mcmFnZSI6ICJvbiByZXF1ZXN0IgogfQp9Ozwvc2NyaXB0PjxzY3JpcHQ+LyogRW5nbGlzY2hlIE9iZXJmbGFlY2hlIGRlcyBLb25maWd1cmF0b3JzLgogKgogKiBEZXIgS29uZmlndXJhdG9yIGJhdXQgc2VpbmUgT2JlcmZsYWVjaGUgYXVzIFZvcmxhZ2VuIGluIGFwcC5qcyB6dXNhbW1lbi4gU3RhdHQKICogaHVuZGVydGUgWmVpY2hlbmtldHRlbiBpbSBRdWVsbHRleHQgdW16dWJhdWVuLCB3aXJkIGRpZSBmZXJ0aWdlIE9iZXJmbGFlY2hlIGhpZXIKICogdWViZXJzZXR6dDogZXhha3RlIFRleHRrbm90ZW4gYXVzIGRlbSBXb2VydGVyYnVjaCwgZGFuYWNoIGVpbmUga3VyemUsIGdlcHJ1ZWZ0ZQogKiBCZWdyaWZmc2xpc3RlIGZ1ZXIgenVzYW1tZW5nZXNldHp0ZSBCZXplaWNobnVuZ2VuIHdpZSAiQm9nZW4gOTDCsCDCtyAxIFN0dWVjayIuCiAqCiAqIFNjaHV0enJlZ2VsbiwgZGFtaXQga2VpbmUgVGVjaG5payBnZXRyb2ZmZW4gd2lyZDoKICogIC0gQXJ0aWtlbC0gdW5kIEtvbmZpZ3VyYXRpb25zbnVtbWVybiAoTXVzdGVyIHdpZSBCNDUtRE4wNi1BLTEuNDQwNC1IMykgYmxlaWJlbiB1bmJlcnVlaHJ0LgogKiAgLSBLbm90ZW4gaW4gPHNjcmlwdD4gdW5kIDxzdHlsZT4gd2VyZGVuIG5pZSBhbmdlZmFzc3QuCiAqICAtIFdhZWhyZW5kIGRlciBlaWdlbmVuIEFlbmRlcnVuZ2VuIGlzdCBkZXIgQmVvYmFjaHRlciBzdGlsbGdlbGVndCwgc29uc3QgbG9lc3QgZGllCiAqICAgIFVlYmVyc2V0enVuZyBzaWNoIHNlbGJzdCB3aWVkZXIgYXVzLgogKiBFaW5nZWJhdXQgYW0gMTcuMDkuMjAyNiBmdWVyIGRpZSBlbmdsaXNjaGVuIExhbmRpbmdwYWdlcy4KICovCihmdW5jdGlvbiAoKSB7CiAgdmFyIHdiID0gd2luZG93LldFSVNTX0kxOE47CiAgaWYgKCF3YiB8fCAhd2IuZXhha3QpIHsgcmV0dXJuOyB9CiAgdmFyIGV4YWt0ID0gd2IuZXhha3Q7CiAgdmFyIGJlZ3JpZmZlID0gT2JqZWN0LmtleXMod2IuYmVncmlmZmUgfHwge30pLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGIubGVuZ3RoIC0gYS5sZW5ndGg7IH0pOwogIHZhciBjb2RlTXVzdGVyID0gL15bQS1aXXsxLDR9XGQqWy1dW0EtWjAtOS5cLV0rJC87CiAgdmFyIGxhZXVmdCA9IGZhbHNlOwogIHZhciBlcm5ldXQgPSBmYWxzZTsKCiAgZnVuY3Rpb24gdWViZXJzZXR6ZVRleHQocm9oKSB7CiAgICB2YXIgdCA9IHJvaC50cmltKCk7CiAgICBpZiAoIXQpIHsgcmV0dXJuIG51bGw7IH0KICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXhha3QsIHQpKSB7CiAgICAgIHJldHVybiByb2gucmVwbGFjZSh0LCBleGFrdFt0XSk7CiAgICB9CiAgICBpZiAoY29kZU11c3Rlci50ZXN0KHQpKSB7IHJldHVybiBudWxsOyB9CiAgICB2YXIgbmV1ID0gcm9oLCBnZXRyb2ZmZW4gPSBmYWxzZTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYmVncmlmZmUubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGRlID0gYmVncmlmZmVbaV07CiAgICAgIGlmIChuZXUuaW5kZXhPZihkZSkgIT09IC0xKSB7IG5ldSA9IG5ldS5zcGxpdChkZSkuam9pbih3Yi5iZWdyaWZmZVtkZV0pOyBnZXRyb2ZmZW4gPSB0cnVlOyB9CiAgICB9CiAgICByZXR1cm4gZ2V0cm9mZmVuID8gbmV1IDogbnVsbDsKICB9CgogIGZ1bmN0aW9uIGR1cmNobGF1Zih3dXJ6ZWwpIHsKICAgIHZhciBsYXVmID0gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcih3dXJ6ZWwsIE5vZGVGaWx0ZXIuU0hPV19URVhULCB7CiAgICAgIGFjY2VwdE5vZGU6IGZ1bmN0aW9uIChrKSB7CiAgICAgICAgdmFyIGUgPSBrLnBhcmVudEVsZW1lbnQ7CiAgICAgICAgaWYgKCFlKSB7IHJldHVybiBOb2RlRmlsdGVyLkZJTFRFUl9SRUpFQ1Q7IH0KICAgICAgICB2YXIgdGFnID0gKGUudGFnTmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKTsKICAgICAgICBpZiAodGFnID09PSAnc2NyaXB0JyB8fCB0YWcgPT09ICdzdHlsZScpIHsgcmV0dXJuIE5vZGVGaWx0ZXIuRklMVEVSX1JFSkVDVDsgfQogICAgICAgIHJldHVybiBOb2RlRmlsdGVyLkZJTFRFUl9BQ0NFUFQ7CiAgICAgIH0KICAgIH0pOwogICAgdmFyIGtub3RlbiA9IFtdLCBrOwogICAgd2hpbGUgKChrID0gbGF1Zi5uZXh0Tm9kZSgpKSkgeyBrbm90ZW4ucHVzaChrKTsgfQogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrbm90ZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIG5ldSA9IHVlYmVyc2V0emVUZXh0KGtub3RlbltpXS50ZXh0Q29udGVudCB8fCAnJyk7CiAgICAgIGlmIChuZXUgIT09IG51bGwgJiYgbmV1ICE9PSBrbm90ZW5baV0udGV4dENvbnRlbnQpIHsga25vdGVuW2ldLnRleHRDb250ZW50ID0gbmV1OyB9CiAgICB9CiAgICB2YXIgYXR0cmlidXRlID0gWyd0aXRsZScsICdhcmlhLWxhYmVsJywgJ3BsYWNlaG9sZGVyJ107CiAgICB2YXIgZWxlbWVudGUgPSB3dXJ6ZWwucXVlcnlTZWxlY3RvckFsbCA\\\/IHd1cnplbC5xdWVyeVNlbGVjdG9yQWxsKCdbdGl0bGVdLFthcmlhLWxhYmVsXSxbcGxhY2Vob2xkZXJdJykgOiBbXTsKICAgIGZvciAodmFyIGogPSAwOyBqIDwgZWxlbWVudGUubGVuZ3RoOyBqKyspIHsKICAgICAgZm9yICh2YXIgYSA9IDA7IGEgPCBhdHRyaWJ1dGUubGVuZ3RoOyBhKyspIHsKICAgICAgICB2YXIgd2VydCA9IGVsZW1lbnRlW2pdLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVbYV0pOwogICAgICAgIGlmICghd2VydCkgeyBjb250aW51ZTsgfQogICAgICAgIHZhciBuZXVBID0gdWViZXJzZXR6ZVRleHQod2VydCk7CiAgICAgICAgaWYgKG5ldUEgIT09IG51bGwgJiYgbmV1QSAhPT0gd2VydCkgeyBlbGVtZW50ZVtqXS5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlW2FdLCBuZXVBKTsgfQogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBhbnN0b3NzZW4oKSB7CiAgICAvLyBXYWVocmVuZCBlaW5lcyBEdXJjaGxhdWZzIGVpbnRyZWZmZW5kZSBBZW5kZXJ1bmdlbiBkdWVyZmVuIG5pY2h0IHZlcmxvcmVuIGdlaGVuLgogICAgLy8gRXJzdGUgRmFzc3VuZyBoYXQgc2llIHZlcndvcmZlbiwgZGFkdXJjaCBibGllYmVuIHNwYWV0ZXIgZ2VyZW5kZXJ0ZSBTY2hyaXR0ZSBkZXV0c2NoLgogICAgaWYgKGxhZXVmdCkgeyBlcm5ldXQgPSB0cnVlOyByZXR1cm47IH0KICAgIGxhZXVmdCA9IHRydWU7CiAgICB0cnkgeyBkdXJjaGxhdWYoZG9jdW1lbnQuYm9keSk7IH0gZmluYWxseSB7CiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7CiAgICAgICAgbGFldWZ0ID0gZmFsc2U7CiAgICAgICAgaWYgKGVybmV1dCkgeyBlcm5ldXQgPSBmYWxzZTsgYW5zdG9zc2VuKCk7IH0KICAgICAgfSk7CiAgICB9CiAgfQoKICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2V0QXR0cmlidXRlKCdsYW5nJywgJ2VuJyk7CiAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdsb2FkaW5nJykgewogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGFuc3Rvc3Nlbik7CiAgfSBlbHNlIHsKICAgIGFuc3Rvc3NlbigpOwogIH0KICB2YXIgYmVvYmFjaHRlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uICgpIHsKICAgIGlmIChsYWV1ZnQpIHsgZXJuZXV0ID0gdHJ1ZTsgcmV0dXJuOyB9CiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoYW5zdG9zc2VuKTsKICB9KTsKICBiZW9iYWNodGVyLm9ic2VydmUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSwgY2hhcmFjdGVyRGF0YTogdHJ1ZSB9KTsKfSkoKTsKPC9zY3JpcHQ+CiAgPHNjcmlwdD4KLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogV2Vpc3MgQXBwYXJhdGViYXUgLSBGaXR0aW5ncy1Lb25maWd1cmF0b3IKICogZHJhdy5qcyAgLSAgUGFyYW1ldHJpc2NoZSBESU4tbmFoZSAyRC1UZWNobmlremVpY2hudW5nIChWYW5pbGxhIEpTKQogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBSZWluZSBGdW5rdGlvbmVuOiAgcGFyYW1zIC0+IFNWRy1TdHJpbmcuICBLZWluIEZyYW1ld29yaywga2VpbiBCdWlsZC1TdGVwLgogKiBHZW9tZXRyaWUgKyBNYXNzemFobGVuIHdhY2hzZW4gbGl2ZS9wYXJhbWV0cmlzY2ggbWl0IGRuL29kL3dhbGwvbGVuZ3RoIHVzdy4KICogQmFzaXM6IHJlY2hlcmNoZS8wMy1zdmctc3RhcnRlci5qcyAoTm9kZS12ZXJpZml6aWVydCksIGVyd2VpdGVydCB1bSBlY2h0ZQogKiBGbGFuc2NoLU1hc3NlIChwYXJhbXMuZmxhbmdlT2QpIHVuZCBlaW5lIEtsYW1tZXItRnJvbnRhbnNpY2h0LgogKgogKiAgIHJlbmRlckZpdHRpbmcocGFyYW1zLCBvcHRzKSAtPiBzdHJpbmcgICAoa29tcGxldHRlciA8c3ZnPi4uLjwvc3ZnPikKICoKICogVGhlbWU6ICBGYXJiZW4gdWViZXIgQ1NTLVZhcmlhYmxlbiAoLS13ei0qKSwgRmFsbGJhY2tzIGVpbmdlYmF1dC4KICogVGFibGV0OiBLZWluIGJhY2tkcm9wLWZpbHRlciwga2VpbmUgU2Nyb2xsLVJldmVhbCAtIHJlaW5lcyBzdGF0aXNjaGVzIFNWRy4KICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KJ3VzZSBzdHJpY3QnOwoKKGZ1bmN0aW9uIChyb290KSB7CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRmFyYmVuICovCi8qIERpZXNlIFRhYmVsbGUgaXN0IG51ciBkZXIgUnVlY2tmYWxsLiBJbSBLb25maWd1cmF0b3IgZ2V3aW5udCBpbW1lciBvLmdhc2tldENvbG9yCiAqIChzaWVoZSB1bnRlbiBpbiBwcmVwKCkpLCB1bmQgYXBwLmpzIHJlaWNodCBkb3J0IGRpZSBGYXJiZSBhdXMgZGF0YS5qcyBkdXJjaC4gVlAKICogZmVobHRlIGhpZXIgdHJvdHpkZW0gdW5kIHdhciBkYW1pdCBkZXIgZWluemlnZSBXZXJrc3RvZmYgb2huZSBSdWVja2ZhbGx3ZXJ0IC0KICogamVkZXIgQXVmcnVmIG9obmUgZ2Fza2V0Q29sb3IgaGFldHRlIGlobiBFUERNLXNjaHdhcnogZ2V6ZWljaG5ldC4gRXJnYWVuenQgYW0KICogMjEuMDguMjAyNiBtaXQgZGVtc2VsYmVuIFdlcnQsIGRlbiBkYXRhLmpzIGZ1ZWhydCwgZGFtaXQgZXMgZnVlciBWUCBuaWNodCB6d2VpCiAqIHZlcnNjaGllZGVuZSBGYXJiZW4gaW0gUHJvamVrdCBnaWJ0LiAqLwpjb25zdCBHQVNLRVRfQ09MT1JTID0geyBFUERNOicjMmIyYjJiJywgVk1ROicjZTdlMmQ4JywgRktNOicjMmY3ZDNhJywgUFRGRTonI2Y0ZjRmNCcsIFZQOicjZWZlOWRmJyB9OwovKiBWUCBmZWhsdGUgaGllcjogZGllIFplaWNobnVuZyBoYXQgZGllIGludGVybmUgaWQgYXVzZ2VnZWJlbiB1bmQgZGVtIEt1bmRlbgogKiAiVlAiIHN0YXR0ICJQVEZFL0ZLTSIgZ2V6ZWlndCAoQmVmdW5kIDExLjA4LjIwMjYpLiBEaWUgU2NocmVpYndlaXNlIGZvbGd0CiAqIGRhdGEuanMgKGFydGlrZWxDb2RlICdQVEZFL0ZLTScsIEJlcm5kIDI3LjA3LjIwMjY6IFBURkUgYXVzc2VuLCBGS00gaW0gS2VybikuICovCmNvbnN0IEdBU0tFVF9MQUJFTCAgPSB7IEVQRE06J0VQRE0nLCBWTVE6J1NpbGlrb24gKFZNUSknLCBGS006J1ZpdG9uIChGS00pJywgUFRGRTonUFRGRScsIFZQOidQVEZFL0ZLTScgfTsKCi8qIENsYW1wLUZsYW5zY2hkdXJjaG1lc3NlciAoQnVuZCkgamUgUm9oci1PRCAtIE5hZWhlcnVuZywgbnVyIHdlbm4gcGFyYW1zCiAqIEtFSU4gZmxhbmdlT2QgbGllZmVydC4gRWNodGUgV2VydGUga29tbWVuIGF1cyBkYXRhLmpzIChESU4gMzI2NzYpLiAqLwpjb25zdCBDTEFNUF9GTEFOR0VfT0QgPSB7CiAgNi4zNToyNSwgODoyNSwgOS41MzoyNSwgMTA6MjUsIDEyLjc6MjUsIDEzOjM0LCAxOTozNCwgMTkuMDU6MjUsIDIzOjM0LAogIDI1OjUwLjUsIDI1LjQ6NTAuNSwgMjYuOTo1MC41LCAyOTo1MC41LCAzMy43OjUwLjUsIDM1OjUwLjUsIDM4OjUwLjUsIDQxOjUwLjUsCiAgNDIuNDo2NCwgNDguMzo2NCwgNTAuODo2NCwgNTM6NjQsIDYwLjM6NzcuNSwgNjMuNTo3Ny41LCA3MDo5MSwgNzYuMTo5MSwKICA3Ni4yOjkxLCA4NToxMDYsIDg4Ljk6MTA2LCAxMDEuNjoxMTksIDEwNDoxMTkKfTsKZnVuY3Rpb24gZmxhbmdlT2RGb3Iob2QpIHsKICBpZiAoQ0xBTVBfRkxBTkdFX09EW29kXSkgcmV0dXJuIENMQU1QX0ZMQU5HRV9PRFtvZF07CiAgbGV0IGJlc3QgPSBudWxsLCBiZCA9IEluZmluaXR5OwogIGZvciAoY29uc3QgayBpbiBDTEFNUF9GTEFOR0VfT0QpIHsgY29uc3QgZCA9IE1hdGguYWJzKCtrIC0gb2QpOyBpZiAoZCA8IGJkKSB7IGJkID0gZDsgYmVzdCA9IENMQU1QX0ZMQU5HRV9PRFtrXTsgfSB9CiAgaWYgKGJlc3QgJiYgYmQgPD0gNCkgcmV0dXJuIGJlc3Q7CiAgcmV0dXJuIE1hdGgubWF4KG9kICsgMjIsIG9kICogMS4yNSArIDYpOwp9CgovKiAtLS0tIEdlemVpY2huZXRlIEhvZWhlIGRlcyBDbGFtcGJ1bmRzIChUQy1UZWlsKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBCZXJuZCAyOC4wNy4yMDI2OiAiRWluZmFjaCBkZW4gVGVpbCBkZXMgVEMncyBrdWVyemVyIHplaWNobmVuIHZvbiBBbmZhbmcgYW4uCiAqIERhcyB3dWVyZGUgaWNoIGFiZXIgYmVpIGJlaWRlbiBWYXJpYW50ZW4gS0sgdW5kIEtMIGdsZWljaCBtYWNoZW4uIiB1bmQgIkJlaSBkZW4KICogZGlja3dhbmRpZ2VuIFRhbmtzdHV0emVuIHd1ZXJkZSBpY2ggYXVjaCBkaWUgZ2xlaWNoZSBIb2VoZSBkZXMgVEMncyB3aWUgYmVpIGRlbgogKiBub3JtYWxlbiBTdHV0emVuIG1hY2hlbi4gRGEgcGFzc3QgZXMgendhciBhYmVyIHNpZWh0IGdsZWljaG1hZXNzaWdlciBhdXMuIgogKgogKiBCaXNoZXIgaGluZyBkaWUgQnVuZGhvZWhlIGFuIFJvaHIt4oyAIFVORCBTdHV0emVubGFlbmdlIChvZCowLDE0ICsgb2QqMCwwOCwgbmFjaAogKiBvYmVuIGdlZGVja2VsdCBiZWkgOCArIDQsNSB1bmQgenVzYWV0emxpY2ggYW4gTCowLDIwICsgTCowLDEwKS4gR2VuYXUgZGVyCiAqIEwtQW50ZWlsIG1hY2h0ZSBLSyB1bmQgS0wgdW5nbGVpY2g6IEROMTAwIEtLIDgsNDAgbW0gZ2VnZW4gS0wgMTIsNTAgbW0uIERlcgogKiBkaWNrd2FuZGlnZSBUYW5rc3R1dHplbiAoTCA9IDYwIG1tLCBhYmVyIGdyb2Vzc2VyZXIgQXVzc2VuLeKMgCkgbGFuZGV0ZSBhYiBETjY1CiAqIGF1ZiBkZW0gS0wtV2VydCB1bmQgd2ljaCBiZWkgRE4xNSBiaXMgRE41MCB2b24gYmVpZGVuIGFiLgogKgogKiBOZXVlIFJlZ2VsIC0gRUlOIFdlcnQgamUgR3JvZXNzZToKICogICAtIFRyZWliZXIgaXN0IGRlciBGTEFOU0NILeKMgC4gRXIgaXN0IGRhcyBlaW56aWdlIEdyb2Vzc2VubWFzcywgZGFzIGZ1ZXIgS0ssIEtMCiAqICAgICB1bmQgZGlja3dhbmRpZyBpZGVudGlzY2ggaXN0IChkaWUgVENELVNwYWx0ZSBURCBkZWNrdCBzaWNoIHplaWxlbndlaXNlIG1pdAogKiAgICAgZmxhbmdlT0QgZGVyIERJTjMyNjc2LVJlaWhlbiwgc2llaGUgZGF0YS5qcykuIERlciBSb2hyLeKMgCB0YXVndCBuaWNodDogZXIgaXN0CiAqICAgICBiZWltIGRpY2t3YW5kaWdlbiBTdHV0emVuIGdyb2Vzc2VyIChETjE1OiAyNCBzdGF0dCAxOSBtbSkuCiAqICAgLSBEaWUgU3R1dHplbmxhZW5nZSBnZWh0IE5JQ0hUIG1laHIgaW4gZGllIEhvZWhlIGVpbiwgbnVyIG5vY2ggYWxzIERlY2tlbHVuZy4KICogICAtIFdlcnRlYmVyZWljaCB1bnZlcmFlbmRlcnQgbmFjaCB1bnRlbiAoNCw1MCBtbSA9IGRpZSBhbHRlbiBNaW5kZXN0d2VydGUKICogICAgIDMsMDAgQnVuZCArIDEsNTAgRmFzZSksIG5hY2ggb2JlbiBhdWYgOCw0MCBtbSBnZXNlbmt0LiA4LDQwIGlzdCBrZWluIG5ldWVyCiAqICAgICBXZXJ0LCBzb25kZXJuIGdlbmF1IGRpZSBIb2VoZSwgZGllIGRpZSBLVVJaRSBWYXJpYW50ZSAoS0spIGJpc2hlciBhYiBETjUwCiAqICAgICBzY2hvbiBoYXR0ZSAoNSw2MCArIDIsODApIC0gYWxzbyBkYXMgdm9uIEJlcm5kIGdld3VlbnNjaHRlICJrdWVyemVyIi4KICogICAtIEF1ZnRlaWx1bmcgd2llIGJpc2hlciAyOjEgaW4gQnVuZCB1bmQgRmFzZSAoNSw2MDoyLDgwIHVuZCAzLDAwOjEsNTAgc2luZAogKiAgICAgYmVpZGUgZXhha3QgMjoxKS4KICogICAtIHJlZkZsYW5zY2ggNjQgPSBrbGVpbnN0ZXIgRmxhbnNjaC3ijIAsIGJlaSBkZW0gZGllIGFsdGUgS0stVmFyaWFudGUgaWhyZW4KICogICAgIEhvZWNoc3R3ZXJ0IGVycmVpY2h0ZSAoRE41MCkuIERvcnQgdHJpZmZ0IGRpZSBHZXJhZGUgZGllIE9iZXJncmVuemUuCiAqCiAqIERFQ0tFTFVORyBCTEVJQlQgKHVyc3BydWVuZ2xpY2hlIEtvcnJla3R1ciB2b20gMjcuMDcuMjAyNiwgZGFyZiBuaWNodCB6dXJ1ZWNrZmFsbGVuKToKICogRGVyIEJ1bmQgZGFyZiBuaWUgbGFlbmdlciB3ZXJkZW4gYWxzIGRlciBTdHV0emVuLiBFciBuaW1tdCBob2VjaHN0ZW5zIGRpZSBoYWxiZQogKiBTdHV0emVubGFlbmdlIGVpbi4gRnVlciBhbGxlIGJlbGVndGVuIEdyb2Vzc2VuL1ZhcmlhbnRlbiBncmVpZnQgZGllc2UgRGVja2VsdW5nCiAqIG5pY2h0IChncm9lc3N0ZXIgQmVkYXJmOiBOVzQyLDQvTlc0OCwzLzIiIG1pdCBLSyAyMSw1IC0+IDgsNDAvMjEsNSA9IDAsMzkxKSwKICogZGllIEhvZWhlIGJsZWlidCBkb3J0IGFsc28gamUgR3JvZXNzZSB3aXJrbGljaCBpZGVudGlzY2guIFNpZSBpc3QgcmVpbmVzCiAqIFNpY2hlcmhlaXRzbmV0eiBmdWVyIG5pY2h0IGJlbGVndGUvc2VociBrdXJ6ZSBMYWVuZ2VuLgogKgogKiBEYXMgaXN0IGVpbmUgcmVpbmUgREFSU1RFTExVTkdTR1JPRVNTRSAtIGRlciBCdW5kIHRyYWVndCBrZWluZSBNYXNzemFobC4gKi8KY29uc3QgVENfQlVORCA9IHsgbWluOiA0LjUsIG1heDogOC40LCByZWZGbGFuc2NoOiA2NCwgbWF4QW50ZWlsTDogMC41IH07CmZ1bmN0aW9uIHRjQnVuZEhvZWhlKGZsYW5nZU9kLCBMKSB7CiAgY29uc3Qgcm9oID0gcG9zaXRpdmUoZmxhbmdlT2QpID8gZmxhbmdlT2QgLyBUQ19CVU5ELnJlZkZsYW5zY2ggKiBUQ19CVU5ELm1heCA6IFRDX0JVTkQubWluOwogIGNvbnN0IGggPSBNYXRoLm1pbihUQ19CVU5ELm1heCwgTWF0aC5tYXgoVENfQlVORC5taW4sIHJvaCkpOwogIHJldHVybiBNYXRoLm1pbihoLCBMICogVENfQlVORC5tYXhBbnRlaWxMKTsKfQoKLyogLS0tLSBCYXVsYWVuZ2UgbDQgZGVyIGtvbXBsZXR0ZW4gQ2xhbXAtVmVyYmluZHVuZyAoRElOIDMyNjc2KSAtLS0tLS0tLS0tLS0KICogUXVlbGxlOiBXRUlTU19EQVRBLm1hc3NlLmRpbjMyNjc2Lmw0IC8gLmw0RnVlciAoU3BhbHRlIGw0IGRlciBUYWJlbGxlbiAyLzMvNCwKICogdm9uIEJlcm5kIGFtIDI3LjA3LjIwMjYgZ2VsaWVmZXJ0KS4gbDQgaXN0IGRpZSBMYWVuZ2UgZGVyIE1PTlRJRVJURU4gVmVyYmluZHVuZwogKiAoendlaSBTdHV0emVuICsgRGljaHR1bmcpIC0gZGVzaGFsYiBudXIgYmVpbSBrb21wbGV0dGVuIFZlcmJpbmR1bmdzLVR5cCwgbmllCiAqIGJlaW0gZWluemVsbmVuIFN0dXR6ZW4sIGJlaW0gQmxpbmRkZWNrZWwgb2RlciBiZWltIGRpY2t3YW5kaWdlbiBUYW5rc3R1dHplbi4KICoKICogZHJhdy5qcyBiZWtvbW10IHZvbiBhcHAuanMgd2VkZXIgUmVpaGUgbm9jaCBHcm9lc3Nlbi1JRC4gRGllIFplaWxlIHdpcmQgZGVzaGFsYgogKiB1ZWJlciBkcmVpIGJlbGVndGUsIGdlbWVpbnNhbSBlaW5kZXV0aWdlIFdlcnRlIHp1cnVlY2tnZXN1Y2h0IChHcm9lc3Nlbi1MYWJlbAogKiBhdXMgY2xhbXBTaXplLCBGbGFuc2NoLeKMgCwgUm9oci3ijIApLCBkaWUgVmFyaWFudGUgdWViZXIgZGllIHVlYmVyZ2ViZW5lCiAqIFN0dXR6ZW5sYWVuZ2UgLSBkaWUgSVNUIHJ3LmtrIGJ6dy4gcncua2wsIGhpZXIgd2lyZCBuaWNodHMgZ2VzY2hhZXR6dC4KICoKICogRkFJTC1DTE9TRUQgaW4gZHJlaSBGYWVsbGVuLCBkYW5uIGJsZWlidCBkZXIgUGxhdHpoYWx0ZXIgc3RlaGVuOgogKiAgIDEuIERpZSBsNC1UYWJlbGxlIGZlaGx0IGdhbnogKGRyYXcuanMgbGFldWZ0IGF1Y2ggb2huZSBkYXRhLmpzIGltIE5vZGUtRGVtbykuCiAqICAgMi4gS2VpbmUgWmVpbGUgb2RlciBrZWluZSBWYXJpYW50ZSB0cmlmZnQgLT4ga2VpbiBCZWxlZy4KICogICAzLiBsNCA8IDIgeCBTdHV0emVubGFlbmdlLiBEYXMgaXN0IGVpbiBXSURFUlNQUlVDSCBpbiBkZW4gUXVlbGxkYXRlbiwga2VpbgogKiAgICAgIGZlaGxlbmRlciBXZXJ0OiBiZXRyaWZmdCBnZW5hdSBSZWloZSBBIC8gRE41MCAvIEtLIChaZWlsZSBrayA9IDI4LDAsIGFiZXIKICogICAgICBsNCBLSyA9IDQ0LDcgPSAyIHggMjEsNSArIDEsNyB3aWUgYmVpIEROMjUvRE4zMi9ETjQwKS4gQmVpZGUgV2VydGUgc2luZAogKiAgICAgIGJlbGVndCB1bmQgd2lkZXJzcHJlY2hlbiBzaWNoLiBFaW5lIEJhdWxhZW5nZSB6dSBiZW1hc3NlbiwgZGllIGtsZWluZXIgaXN0CiAqICAgICAgYWxzIGRpZSBiZWlkZW4gZ2V6ZWljaG5ldGVuLCBlYmVuZmFsbHMgYmVtYXNzdGVuIFN0dXR6ZW4sIHdhZXJlIGVpbmUKICogICAgICBaZWljaG51bmcsIGRpZSBzaWNoIHNlbGJzdCB3aWRlcnNwcmljaHQgLT4gbGllYmVyIFBsYXR6aGFsdGVyICsgUnVlY2tmcmFnZS4KICoKICogUnVlY2tnYWJlOiB7IHdlcnQsIHJlaWhlLCBpZCwgdmFyaWFudGUsIHNwYWx0IH0gb2RlciBudWxsLgogKiBzcGFsdCA9IGw0IC0gMiB4IFN0dXR6ZW5sYWVuZ2UgLT4gZXhha3QgZGVyIERpY2h0dW5nc3NwYWx0LCBtaXQgZGVtIGRpZQogKiBnZXplaWNobmV0ZSBHZXNhbXRsYWVuZ2UgZGFzIGJlbWFzc3RlIGw0IHdpcmtsaWNoIHRyaWZmdC4gKi8KLyogV2VydCBhdXMgZGVyIGw0LVRhYmVsbGUgaG9sZW4uCiAqCiAqIFdJQ0hUSUcsIGhpZXIgbGFnIGFtIDI4LjA3LjIwMjYgZWluIERlZmVrdDogRnJ1ZWhlciBoaW5nIGRhcyBhbGxlaW4gYW4KICogbWQubDRGdWVyKCkuIEltIFN0YW5kYWxvbmUtQnVpbGQgZnVua3Rpb25pZXJ0IGRhcywgdWViZXIgV29yZFByZXNzIE5JQ0hUIC0KICogZGFzIFBsdWdpbiBpbmppemllcnQgZGllIEtvbmZpZ3VyYXRpb24gbWl0IHdwX2pzb25fZW5jb2RlIGFscyByZWluZXMgSlNPTiwKICogdW5kIEZ1bmt0aW9uZW4gdWViZXJsZWJlbiBlaW5lIEpTT04tU2VyaWFsaXNpZXJ1bmcgbmljaHQuIGw0RnVlciB3YXIgZGFzCiAqIGVpbnppZ2UgRnVua3Rpb25zZmVsZCBhbiBXRUlTU19EQVRBLCBmZWhsdGUgaW0gV2lkZ2V0IGFsc28gaW1tZXIsIHVuZCBkaWUKICogQmF1bGFlbmdlIGJsaWViIGRvcnQgZGF1ZXJoYWZ0IGF1ZiAiQmF1bGFlbmdlIGZvbGd0IiBzdGVoZW4uCiAqIERlc2hhbGIgaXN0IGRpZSBSb2h0YWJlbGxlIG1kLmw0IGRlciB2ZXJiaW5kbGljaGUgV2VnIC0gc2llIGlzdCBpbSBKU09OCiAqIGVudGhhbHRlbi4gbDRGdWVyIHdpcmQgbnVyIG5vY2ggZ2VudXR6dCwgd2VubiBlcyB2b3JoYW5kZW4gaXN0LiAqLwpmdW5jdGlvbiBsNFdlcnQobWQsIHJlaWhlLCBpZCwgdmFyaWFudGUpIHsKICBjb25zdCBrZXkgPSBTdHJpbmcodmFyaWFudGUpLnRvVXBwZXJDYXNlKCkgPT09ICdLTCcgPyAnS0wnIDogJ0tLJzsKICBjb25zdCB0YWIgPSBtZCAmJiBtZC5sNCAmJiBtZC5sNFtyZWloZV07CiAgY29uc3Qgcm93ID0gdGFiICYmIHRhYltpZF07CiAgaWYgKHJvdyAmJiBwb3NpdGl2ZShyb3dba2V5XSkpIHJldHVybiByb3dba2V5XTsKICBpZiAobWQgJiYgdHlwZW9mIG1kLmw0RnVlciA9PT0gJ2Z1bmN0aW9uJykgewogICAgY29uc3QgdiA9IG1kLmw0RnVlcihyZWloZSwgaWQsIGtleSk7CiAgICBpZiAocG9zaXRpdmUodikpIHJldHVybiB2OwogIH0KICByZXR1cm4gbnVsbDsKfQpmdW5jdGlvbiBsNEluZm8obykgewogIGNvbnN0IG1kID0gcm9vdCAmJiByb290LldFSVNTX0RBVEEgJiYgcm9vdC5XRUlTU19EQVRBLm1hc3NlICYmIHJvb3QuV0VJU1NfREFUQS5tYXNzZS5kaW4zMjY3NjsKICBpZiAoIW1kIHx8ICFtZC5yZWloZW4pIHJldHVybiBudWxsOwogIGlmICghbWQubDQgJiYgdHlwZW9mIG1kLmw0RnVlciAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIG51bGw7CiAgY29uc3QgTCA9IG8ubGVuZ3RoOwogIGlmICghcG9zaXRpdmUoTCkpIHJldHVybiBudWxsOwogIGNvbnN0IGxhYmVsID0gU3RyaW5nKG8uY2xhbXBTaXplID09IG51bGwgPyAnJyA6IG8uY2xhbXBTaXplKS50cmltKCk7CiAgaWYgKCFsYWJlbCkgcmV0dXJuIG51bGw7CiAgZm9yIChjb25zdCBrIG9mIFsnQScsICdCJywgJ0MnXSkgewogICAgY29uc3QgcmVpaGUgPSBtZC5yZWloZW5ba107CiAgICBpZiAoIXJlaWhlIHx8ICFyZWloZS5yb3dzKSBjb250aW51ZTsKICAgIGZvciAoY29uc3Qgcm93IG9mIHJlaWhlLnJvd3MpIHsKICAgICAgLy8gRHJlaSBXZXJ0ZSBtdWVzc2VuIHp1c2FtbWVucGFzc2VuIC0gTGFiZWwgYWxsZWluIHd1ZXJkZSBhdWNoIGRpZQogICAgICAvLyBkaWNrd2FuZGlnZSBUQ0QtWmVpbGUgdHJlZmZlbiwgZGllIGRpZXNlbGJlbiBMYWJlbHMgZnVlaHJ0LgogICAgICBpZiAoU3RyaW5nKHJvdy5sYWJlbCkgIT09IGxhYmVsKSBjb250aW51ZTsKICAgICAgaWYgKHJvdy5mbGFuZ2VPRCAhPT0gby5mbGFuZ2VPZCB8fCByb3cudHViZU9EICE9PSBvLm9kKSBjb250aW51ZTsKICAgICAgY29uc3QgdmFyaWFudGUgPSAocm93LmtrICE9IG51bGwgJiYgcm93LmtrID09PSBMKSA\\\/ICdLSycKICAgICAgICA6IChyb3cua2wgIT0gbnVsbCAmJiByb3cua2wgPT09IEwpID8gJ0tMJyA6IG51bGw7CiAgICAgIGlmICghdmFyaWFudGUpIHJldHVybiBudWxsOwogICAgICBjb25zdCB3ZXJ0ID0gbDRXZXJ0KG1kLCBrLCByb3cuaWQsIHZhcmlhbnRlKTsKICAgICAgaWYgKCFwb3NpdGl2ZSh3ZXJ0KSkgcmV0dXJuIG51bGw7CiAgICAgIGNvbnN0IHNwYWx0ID0gd2VydCAtIDIgKiBMOwogICAgICBpZiAoc3BhbHQgPCAwKSByZXR1cm4gbnVsbDsgICAgICAgICAgICAgIC8vIEZhbGwgMywgc2llaGUgb2JlbgogICAgICByZXR1cm4geyB3ZXJ0OiB3ZXJ0LCByZWloZTogaywgaWQ6IHJvdy5pZCwgdmFyaWFudGU6IHZhcmlhbnRlLCBzcGFsdDogc3BhbHQgfTsKICAgIH0KICB9CiAgcmV0dXJuIG51bGw7Cn0KLyogS2xlaW5zdGVyIGdlemVpY2huZXRlciBEaWNodHVuZ3NzcGFsdC4gSW4gMjEgZGVyIDgyIGJlbGVndGVuIEtvbWJpbmF0aW9uZW4gaXN0CiAqIGw0IGxhdXQgTm9ybSBleGFrdCAyIHggbDMgKEZsYW5zY2hmbGFlY2hlbiBtZXRhbGxpc2NoIGF1ZiBCbG9jayksIGRlciByZWNobmVyaXNjaGUKICogU3BhbHQgYWxzbyAwIC0gZGFubiB3YWVyZSBkaWUgRGljaHR1bmcgaW4gZGVyIFplaWNobnVuZyB1bnNpY2h0YmFyLiBTaWUgYmVrb21tdAogKiBkZXNoYWxiIDAsOCBtbSBNaW5kZXN0YnJlaXRlOyBkaWUgZ2V6ZWljaG5ldGUgR2VzYW10bGFlbmdlIGxpZWd0IGluIGRpZXNlbiBGYWVsbGVuCiAqIHVtIGRpZXNlIDAsOCBtbSB1ZWJlciBkZW0gYmVtYXNzdGVuIGw0IChiZWkgZGVyIGtsZWluc3RlbiBWZXJiaW5kdW5nIGw0ID0gMjUsNAogKiBzaW5kIGRhcyAzLDEgJSkuIERpZSBNQVNTWkFITCBibGVpYnQgaW4gamVkZW0gRmFsbCB1bnZlcmFlbmRlcnQgZGVyIFRhYmVsbGVud2VydC4gKi8KY29uc3QgRElDSFRfU1BBTFRfTUlOID0gMC44OwoKY29uc3QgRklUVElOR19UWVBFUyA9IFsnY2xhbXBzdHV0emVuJywnYmxpbmRrYXBwZScsJ2JsaW5kZGVja2VsJywnYm9nZW45MCcsJ2JvZ2VuNDUnLCd0c3R1ZWNrJywncmVkdXppZXJ1bmcnLCdrbGFtbWVyJywnZGljaHR1bmcnLCdjb25uZWN0ZmxhbnNjaCcsJ2Nvbm5lY3RpbmxpbmUnXTsKCmNvbnN0IERFRkFVTFRTID0gewogIHR5cGU6J2NsYW1wc3R1dHplbicsIGRuOjI1LCBvZDoyNS4wLCB3YWxsOjEuNSwgbGVuZ3RoOjEwMCwgY2xhbXBTaXplOidETjI1JywKICBiZW5kUmFkaXVzOjM4LCBvZDI6MjAuMCwgYnJhbmNoT2Q6bnVsbCwgZWNjZW50cmljOmZhbHNlLCBmbGFuZ2VPZDpudWxsLAogIC8vIFIzLTMvUjMtNDogQmF1Zm9ybSBkZXMgVC1TdMO8Y2tzLiAnVCcgPSBBYmdhbmcgZ2xlaWNoIGxhbmcsICdUSycgPSBBYmdhbmcga3Vyei4KICAvLyBTdGV1ZXJ0IG51ciBkaWUgc2NoZW1hdGlzY2hlIEFiZ2FuZ3Nsw6RuZ2UgKGtlaW4gYmVtYcOfdGVzIE1hw58pIGluIGRyYXdUc3R1ZWNrLgogIHRmb3JtOidUJywKICBnYXNrZXRNYXRlcmlhbDonRVBETScsIGdhc2tldENvbG9yOm51bGwsIHN1cmZhY2U6J0g0Jywgd2Vya3N0b2ZmOicxLjQ0MDQnLAogIC8vIEJlc2NocmlmdHVuZyBkZXMgTGFlbmdlbm1hc3Nlcy4gJ0wnID0gQmF1bGFlbmdlL1N0dXR6ZW5sYWVuZ2UgKEtLL0tMLCBkdWVubndhbmRpZykuCiAgLy8gRGVyIGRpY2t3YW5kaWdlIFRhbmtzdHV0emVuIChUQ0QpIGhhdCBLRUlORSBLSy9LTC1MYWVuZ2UsIHNvbmRlcm4gZGllIEhvZWhlIGggPSA2MCBtbQogIC8vIC0+IGFwcC5qcyBzY2hpY2t0IGRvcnQgbGVuZ3RoTGFiZWw6J2gnLiBOdXIgZGFzIFByYWVmaXggYWVuZGVydCBzaWNoLCBuaWUgZGVyIFdlcnQuCiAgbGVuZ3RoTGFiZWw6J0wnCn07CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVdGlsaXRpZXMgKi8KbGV0IF91aWQgPSAwOwpjb25zdCB1aWQgPSAoKSA9PiAnd3onICsgKCsrX3VpZCk7CmNvbnN0IG51bSA9ICh2LCBkKSA9PiAodHlwZW9mIHYgPT09ICdudW1iZXInICYmIGlzRmluaXRlKHYpKSA\\\/IHYgOiBkOwpjb25zdCBmeCAgPSBuID0+IChNYXRoLnJvdW5kKG4gKiAxMDApIC8gMTAwKTsKY29uc3QgZGUgID0gbiA9PiBTdHJpbmcoZngobikpLnJlcGxhY2UoJy4nLCAnLCcpOyAgIC8vIGRldXRzY2hlIE1hc3N6YWhsIChLb21tYSkKY29uc3QgcG9seSA9IHB0cyA9PiBwdHMubWFwKHAgPT4gZngocFswXSkgKyAnLCcgKyBmeChwWzFdKSkuam9pbignICcpOwpjb25zdCBwYXRoRnJvbSA9IHB0cyA9PiAnTScgKyBwb2x5KHB0cykucmVwbGFjZSgvIC9nLCAnIEwnKS5yZXBsYWNlKCdMJywgJycpOwpjb25zdCBlc2MgPSBzID0+IFN0cmluZyhzID09IG51bGwgPyAnJyA6IHMpLnJlcGxhY2UoL1smPD4iJ10vZywgYyA9PiAoewogICcmJzonJmFtcDsnLCAnPCc6JyZsdDsnLCAnPic6JyZndDsnLCAnIic6JyZxdW90OycsICInIjonJiMzOTsnCn0pW2NdKTsKY29uc3QgcG9zaXRpdmUgPSB2ID0+IHR5cGVvZiB2ID09PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZSh2KSAmJiB2ID4gMDsKLy8gV2Vya3N0b2Zmc2VyaWUgZGVyIENvbm5lY3QtRmxhbnNjaGUgKFdlcmtzdG9mZm51bW1lciBzdGF0dCBIZXJzdGVsbGVya3VlcnplbCkuCmNvbnN0IHNlcmllc09rID0gdiA9PiBbJzEuNDQwNCcsJzEuNDQzNSddLmluY2x1ZGVzKFN0cmluZyh2IHx8ICcnKS50cmltKCkpOwpjb25zdCBoYXNTaXplTGFiZWwgPSBwID0+ICEhKHAgJiYgKCh0eXBlb2YgcC5sYWJlbCA9PT0gJ3N0cmluZycgJiYgcC5sYWJlbC50cmltKCkpIHx8IHAuZG4gIT0gbnVsbCkpOwpmdW5jdGlvbiB2YWxpZENvbm5lY3RmbGFuc2NoKHApIHsKICByZXR1cm4gISEocCAmJiBwb3NpdGl2ZShwLm9kKSAmJiBwb3NpdGl2ZShwLmlubmVyRGlhbWV0ZXIpICYmIHAuaW5uZXJEaWFtZXRlciA8IHAub2QgJiYKICAgIHBvc2l0aXZlKHAuZmxhbmdlT2QpICYmIHAuaW5uZXJEaWFtZXRlciA8IHAuZmxhbmdlT2QgJiYgcG9zaXRpdmUocC5sZW5ndGgpICYmCiAgICBzZXJpZXNPayhwLnByb2R1Y3RTZXJpZXMpICYmIGhhc1NpemVMYWJlbChwKSk7Cn0KZnVuY3Rpb24gdmFsaWRDb25uZWN0aW5saW5lKHApIHsKICBjb25zdCBlbmRUeXBlID0gU3RyaW5nKHAgJiYgcC5lbmRUeXBlIHx8ICcnKS50cmltKCkudG9VcHBlckNhc2UoKTsKICByZXR1cm4gISEocCAmJiBwb3NpdGl2ZShwLm9kKSAmJiBwb3NpdGl2ZShwLmlubmVyRGlhbWV0ZXIpICYmIHAuaW5uZXJEaWFtZXRlciA8IHAub2QgJiYKICAgIHBvc2l0aXZlKHAubGVuZ3RoKSAmJiBwb3NpdGl2ZShwLmJyYW5jaEhlaWdodCkgJiYgcG9zaXRpdmUocC5lbmREaWFtZXRlcikgJiYKICAgIHBvc2l0aXZlKHAudXBwZXJPdXRlckRpYW1ldGVyKSAmJiBwb3NpdGl2ZShwLnVwcGVySW5uZXJEaWFtZXRlcikgJiYgcC51cHBlcklubmVyRGlhbWV0ZXIgPCBwLnVwcGVyT3V0ZXJEaWFtZXRlciAmJgogICAgWydCVycsJ1RDJ10uaW5jbHVkZXMoZW5kVHlwZSkgJiYgc2VyaWVzT2socC5wcm9kdWN0U2VyaWVzKSAmJiBoYXNTaXplTGFiZWwocCkpOwp9CmZ1bmN0aW9uIHNpemVMYWJlbChvKSB7CiAgaWYgKHR5cGVvZiBvLmxhYmVsID09PSAnc3RyaW5nJyAmJiBvLmxhYmVsLnRyaW0oKSkgcmV0dXJuIG8ubGFiZWwudHJpbSgpOwogIGNvbnN0IGRuID0gU3RyaW5nKG8uZG4gPT0gbnVsbCA\\\/ICcnIDogby5kbikudHJpbSgpOwogIGlmICghZG4pIHJldHVybiAnJzsKICByZXR1cm4gL15ETlxzKi9pLnRlc3QoZG4pID8gZG4gOiAnRE4gJyArIGRuOwp9CmZ1bmN0aW9uIGZpdHRpbmdCYWRnZSh2dywgdGV4dCkgewogIGNvbnN0IGxhYmVsID0gZXNjKHRleHQpOwogIGNvbnN0IHcgPSBNYXRoLm1pbih2dyAtIDI4LCBNYXRoLm1heCgxODgsIFN0cmluZyh0ZXh0KS5sZW5ndGggKiA2LjEgKyAyOCkpOwogIHJldHVybiBgPHJlY3QgY2xhc3M9Ind6LWJhZGdlLWJnIiB4PSIke2Z4KCh2dyAtIHcpIC8gMil9IiB5PSIxMiIgd2lkdGg9IiR7Zngodyl9IiBoZWlnaHQ9IjIyIiByeD0iMTEiLz4KICAgIDx0ZXh0IGNsYXNzPSJ3ei1iYWRnZS10eCIgeD0iJHtmeCh2dyAvIDIpfSIgeT0iMjciIHRleHQtYW5jaG9yPSJtaWRkbGUiPiR7bGFiZWx9PC90ZXh0PmA7Cn0KZnVuY3Rpb24gYXJjUHRzKGN4LCBjeSwgciwgYTAsIGExLCBuKSB7CiAgbiA9IG4gfHwgTWF0aC5tYXgoNiwgTWF0aC5yb3VuZChNYXRoLmFicyhhMSAtIGEwKSAvIChNYXRoLlBJIC8gMjQpKSk7CiAgY29uc3Qgb3V0ID0gW107CiAgZm9yIChsZXQgaSA9IDA7IGkgPD0gbjsgaSsrKSB7IGNvbnN0IGEgPSBhMCArIChhMSAtIGEwKSAqIChpIC8gbik7IG91dC5wdXNoKFtjeCArIHIgKiBNYXRoLmNvcyhhKSwgY3kgKyByICogTWF0aC5zaW4oYSldKTsgfQogIHJldHVybiBvdXQ7Cn0KY29uc3QgbWVhc3VyZSA9IHMgPT4gU3RyaW5nKHMpLmxlbmd0aCAqIDMuNiArIDQ7CgpmdW5jdGlvbiBub3JtYWxpemUocCkgewogIGNvbnN0IG8gPSBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUUywgcCB8fCB7fSk7CiAgY29uc3QgY29ubmVjdFR5cGUgPSBwICYmIChwLnR5cGUgPT09ICdjb25uZWN0ZmxhbnNjaCcgfHwgcC50eXBlID09PSAnY29ubmVjdGlubGluZScpOwogIG8ub2QgPSBNYXRoLm1heCg0LCBudW0oby5vZCwgREVGQVVMVFMub2QpKTsKICBvLndhbGwgPSBNYXRoLm1pbihvLm9kIC8gMiAtIDAuMiwgTWF0aC5tYXgoMC4zLCBudW0oby53YWxsLCBERUZBVUxUUy53YWxsKSkpOwogIC8vIERlY2tlbHN0YWVya2UgZGVzIEJsaW5kZGVja2VscyBsaWVndCBiZWkgNCw3NS0xNCBtbSAtIGRpZSA4LW1tLVVudGVyZ3JlbnplCiAgLy8gZnVlciBTdHV0emVubGFlbmdlbiBkYXJmIHNpZSBuaWNodCB2ZXJmYWVsc2NoZW4uIERlciBXZXJ0IGRhcmYgTlVSIGF1cyBkZW0KICAvLyBBdWZydWYga29tbWVuIChuaWVtYWxzIGRlciBERUZBVUxUUy1XZXJ0IDEwMCk7IGZlaGx0IGVyIC0+IG51bGwgLT4gUGxhdHpoYWx0ZXIuCiAgby5sZW5ndGggPSAocCAmJiBwLnR5cGUgPT09ICdibGluZGRlY2tlbCcpCiAgICA\\\/IChpc0Zpbml0ZShwLmxlbmd0aCkgPyBOdW1iZXIocC5sZW5ndGgpIDogbnVsbCkKICAgIDogTWF0aC5tYXgoOCwgbnVtKG8ubGVuZ3RoLCBERUZBVUxUUy5sZW5ndGgpKTsKICAvLyBvZDIgbnVyIGFscyBFQ0hURVMgTWFzcyBiZWhhbmRlbG4sIHdlbm4gZGVyIEF1ZnJ1ZmVyIHdpcmtsaWNoIGVpbmVuIHp3ZWl0ZW4gw5ggZ2VsaWVmZXJ0CiAgLy8gaGF0LiBERUZBVUxUUy5vZDIgKDIwKSB1bmQgZGVyIDAuNjYtRmFsbGJhY2sgc2luZCBLRUlORSBXZWlzcy1NYXNzZSAtIG9obmUgZWNodGVuIHp3ZWl0ZW4KICAvLyDDmCB3dWVyZGUgZGllIFJlZHV6aWVydW5nIHNvbnN0IGVpbmUgZXJmdW5kZW5lIFphaGwgYmVtYXNzZW4gKE5hY2hwcnVlZi1CZWZ1bmQgYSkuIERpZQogIC8vIEdlb21ldHJpZSBiZWtvbW10IGVpbmVuIG5ldXRyYWxlbiBXZXJ0LCBkaWUgTUFTU1pBSEwgd2lyZCBhYmVyIHVlYmVyIG8ub2QyUHJvdiBhdWYKICAvLyAiZm9sZ3QiIGdlc2V0enQgKGRyYXdSZWR1emllcnVuZyksIGFuYWxvZyB6dSBwcm92RGltcyBiZWkgTGFlbmdlL1JhZGl1cy4KICBvLm9kMlByb3YgPSAhIShwICYmIGlzRmluaXRlKHAub2QyKSk7CiAgby5vZDIgPSBvLm9kMlByb3YgPyBNYXRoLm1heCg0LCBNYXRoLm1pbihvLm9kIC0gMC41LCBwLm9kMikpIDogTWF0aC5tYXgoNCwgTWF0aC5taW4oby5vZCAtIDAuNSwgby5vZCAqIDAuNjYpKTsKICBvLmJyYW5jaE9kID0gbnVtKG8uYnJhbmNoT2QsIG8ub2QpOwogIG8uYnJhbmNoTGVuZ3RoID0gcCAmJiBwb3NpdGl2ZShwLmJyYW5jaExlbmd0aCkgPyBOdW1iZXIocC5icmFuY2hMZW5ndGgpIDogbnVsbDsKICBvLndhbGwyID0gcCAmJiBwb3NpdGl2ZShwLndhbGwyKSA\\\/IE51bWJlcihwLndhbGwyKSA6IG8ud2FsbDsKICBvLm92ZXJhbGxMZW5ndGggPSBwICYmIHBvc2l0aXZlKHAub3ZlcmFsbExlbmd0aCkgPyBOdW1iZXIocC5vdmVyYWxsTGVuZ3RoKSA6IG51bGw7CiAgby5vdmVyYWxsTGVuZ3RoTGFiZWwgPSBwICYmIHR5cGVvZiBwLm92ZXJhbGxMZW5ndGhMYWJlbCA9PT0gJ3N0cmluZycgPyBwLm92ZXJhbGxMZW5ndGhMYWJlbCA6ICcnOwogIG8udGZvcm0gPSAoby50Zm9ybSA9PT0gJ1RLJykgPyAnVEsnIDogJ1QnOyAgIC8vIFIzLTMvUjMtNDogbnVyICdUJyBvZGVyICdUSycgenVsYXNzZW4KICBvLmJlbmRSYWRpdXMgPSBNYXRoLm1heChvLm9kLCBudW0oby5iZW5kUmFkaXVzLCBvLm9kICogMS41KSk7CiAgby5mbGFuZ2VPZCA9IG51bShvLmZsYW5nZU9kLCBmbGFuZ2VPZEZvcihvLm9kKSk7CiAgby5pbm5lckRpYW1ldGVyID0gbnVtKG8uaW5uZXJEaWFtZXRlciwgbnVsbCk7CiAgby5icmFuY2hIZWlnaHQgPSBudW0oby5icmFuY2hIZWlnaHQsIG51bGwpOwogIG8uZW5kRGlhbWV0ZXIgPSBudW0oby5lbmREaWFtZXRlciwgbnVsbCk7CiAgby51cHBlck91dGVyRGlhbWV0ZXIgPSBudW0oby51cHBlck91dGVyRGlhbWV0ZXIsIG51bGwpOwogIG8udXBwZXJJbm5lckRpYW1ldGVyID0gbnVtKG8udXBwZXJJbm5lckRpYW1ldGVyLCBudWxsKTsKICBvLmVuZFR5cGUgPSBTdHJpbmcoby5lbmRUeXBlIHx8ICcnKS50cmltKCkudG9VcHBlckNhc2UoKTsKICBvLnByb2R1Y3RTZXJpZXMgPSBTdHJpbmcoby5wcm9kdWN0U2VyaWVzIHx8ICcnKS50cmltKCkudG9VcHBlckNhc2UoKTsKICBvLmxhYmVsID0gdHlwZW9mIG8ubGFiZWwgPT09ICdzdHJpbmcnID8gby5sYWJlbC50cmltKCkgOiAnJzsKICAvLyBSdW5kZSA3IChXLTA1OSk6IGJlbGVndGUgWnVzYXR6bWFzc2UgZnVlciBLbGFtbWVyIC8gQmxpbmRkZWNrZWwgLyBEaWNodHVuZy4KICAvLyBFcyBnaWx0IG51ciwgd2FzIGRlciBBdWZydWZlciBsaWVmZXJ0IC0gb2huZSBkaWVzZSBXZXJ0ZSBibGVpYnQgZGVyIFBsYXR6aGFsdGVyLgogIG8ua2xhbW1lckEgPSBudW0oby5rbGFtbWVyQSwgbnVsbCk7CiAgby5rbGFtbWVyVHlwID0gWydLTDEnLCdLTExJJywnS0xIJ10uaW5kZXhPZihTdHJpbmcoby5rbGFtbWVyVHlwIHx8ICcnKS50b1VwcGVyQ2FzZSgpKSA+PSAwCiAgICA\\\/IFN0cmluZyhvLmtsYW1tZXJUeXApLnRvVXBwZXJDYXNlKCkgOiAnS0wxJzsKICBvLmtsYW1tZXJNdXR0ZXIgPSBTdHJpbmcoby5rbGFtbWVyTXV0dGVyIHx8ICcnKS50b1VwcGVyQ2FzZSgpID09PSAnUycgPyAnUycgOiAnTSc7CiAgby5nYXNrZXRPZCA9IG51bShvLmdhc2tldE9kLCBudWxsKTsKICBvLmdhc2tldElkID0gbnVtKG8uZ2Fza2V0SWQsIG51bGwpOwogIG8uZ2Fza2V0VHlwZSA9IFN0cmluZyhvLmdhc2tldFR5cGUgfHwgJycpLnRvVXBwZXJDYXNlKCkgPT09ICdJJyA\\\/ICdJJyA6ICdJSSc7CiAgLy8gRnVlciBDRi9DRkkga2VpbmUgTWV0YWRhdGVuIGF1cyBkZW4gQWx0LVR5cC1EZWZhdWx0cyBhbnplaWdlbi4KICAvLyBGYWxscyBkZXIgQXVmcnVmZXIgV2Vya3N0b2ZmL09iZXJmbGFlY2hlIG5pY2h0IGxpZWZlcnQsIGJsZWlidCBkaWUgTGVnZW5kZSBsZWVyLgogIGlmIChjb25uZWN0VHlwZSkgewogICAgby53ZXJrc3RvZmYgPSB0eXBlb2YgcC53ZXJrc3RvZmYgPT09ICdzdHJpbmcnID8gcC53ZXJrc3RvZmYudHJpbSgpIDogJyc7CiAgICBvLnN1cmZhY2UgPSB0eXBlb2YgcC5zdXJmYWNlID09PSAnc3RyaW5nJyA\\\/IHAuc3VyZmFjZS50cmltKCkgOiAnJzsKICB9CiAgby5vZFIgPSBvLm9kIC8gMjsKICBvLmlublIgPSBvLm9kIC8gMiAtIG8ud2FsbDsKICBvLmdDb2wgPSBvLmdhc2tldENvbG9yIHx8IEdBU0tFVF9DT0xPUlNbby5nYXNrZXRNYXRlcmlhbF0gfHwgR0FTS0VUX0NPTE9SUy5FUERNOwogIHJldHVybiBvOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTVkctUmFobWVuOiBzdHlsZS9kZWZzICovCmZ1bmN0aW9uIGZyYW1lRGVmcyhpZCwgZ2Fza2V0RmlsbCkgewogIHJldHVybiBgCiAgPGRlZnM+CiAgICA8cGF0dGVybiBpZD0iJHtpZH0taGF0Y2giIHdpZHRoPSI3IiBoZWlnaHQ9IjciIHBhdHRlcm5Vbml0cz0idXNlclNwYWNlT25Vc2UiIHBhdHRlcm5UcmFuc2Zvcm09InJvdGF0ZSg0NSkiPgogICAgICA8bGluZSB4MT0iMCIgeTE9IjAiIHgyPSIwIiB5Mj0iNyIgc3Ryb2tlPSJ2YXIoLS13ei1oYXRjaCwjOWFhMGE2KSIgc3Ryb2tlLXdpZHRoPSIwLjkiLz4KICAgIDwvcGF0dGVybj4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0iJHtpZH0tc3RlZWwiIHgxPSIwIiB5MT0iMCIgeDI9IjAiIHkyPSIxIj4KICAgICAgPHN0b3Agb2Zmc2V0PSIwIiAgIHN0b3AtY29sb3I9InZhcigtLXd6LXN0ZWVsLWEsI2ZiZmNmZCkiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIwLjUiIHN0b3AtY29sb3I9InZhcigtLXd6LXN0ZWVsLWIsI2VlZjFmNCkiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiAgIHN0b3AtY29sb3I9InZhcigtLXd6LXN0ZWVsLWMsI2RmZTRlOSkiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bWFya2VyIGlkPSIke2lkfS1hciIgbWFya2VyV2lkdGg9IjkiIG1hcmtlckhlaWdodD0iOSIgcmVmWD0iNy41IiByZWZZPSI0LjUiIG9yaWVudD0iYXV0byIgbWFya2VyVW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgPHBhdGggZD0iTTAsMS4yIEw4LDQuNSBMMCw3LjggWiIgZmlsbD0idmFyKC0td3otZGltLCM4YThmOTYpIi8+PC9tYXJrZXI+CiAgICA8bWFya2VyIGlkPSIke2lkfS1hbCIgbWFya2VyV2lkdGg9IjkiIG1hcmtlckhlaWdodD0iOSIgcmVmWD0iMS41IiByZWZZPSI0LjUiIG9yaWVudD0iYXV0byIgbWFya2VyVW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgPHBhdGggZD0iTTgsMS4yIEwwLDQuNSBMOCw3LjggWiIgZmlsbD0idmFyKC0td3otZGltLCM4YThmOTYpIi8+PC9tYXJrZXI+CiAgPC9kZWZzPgogIDxzdHlsZT4KICAgIC53ei1zdmd7Zm9udC1mYW1pbHk6J1BsdXMgSmFrYXJ0YSBTYW5zJywnS3VtYmggU2Fucycsc3lzdGVtLXVpLHNhbnMtc2VyaWZ9CiAgICAud3otYm9yZXtmaWxsOnZhcigtLXd6LWJvcmUsI2Y0ZjZmOCl9CiAgICAud3otc3RlZWx7ZmlsbDp1cmwoIyR7aWR9LXN0ZWVsKTtzdHJva2U6dmFyKC0td3otZWRnZSwjMWMxYzFjKTtzdHJva2Utd2lkdGg6MS4xfQogICAgLnd6LWhhdGNoe2ZpbGw6dXJsKCMke2lkfS1oYXRjaCk7c3Ryb2tlOnZhcigtLXd6LWVkZ2UsIzFjMWMxYyk7c3Ryb2tlLXdpZHRoOjEuMTtzdHJva2UtbGluZWpvaW46cm91bmR9CiAgICAud3otZWRnZXtmaWxsOm5vbmU7c3Ryb2tlOnZhcigtLXd6LWVkZ2UsIzFjMWMxYyk7c3Ryb2tlLXdpZHRoOjEuMX0KICAgIC53ei1nYXNrZXR7ZmlsbDoke2dhc2tldEZpbGx9O3N0cm9rZTp2YXIoLS13ei1lZGdlLCMxYzFjMWMpO3N0cm9rZS13aWR0aDowLjg7b3BhY2l0eTowLjk1fQogICAgLnd6LWNsYW1we2ZpbGw6dmFyKC0td3otY2xhbXAsI2M5Y2VkNCk7c3Ryb2tlOnZhcigtLXd6LWVkZ2UsIzFjMWMxYyk7c3Ryb2tlLXdpZHRoOjF9CiAgICAud3otY2VudGVye2ZpbGw6bm9uZTtzdHJva2U6dmFyKC0td3otY2VudGVyLCNkNjBhMGEpO3N0cm9rZS13aWR0aDowLjk7b3BhY2l0eTowLjc7c3Ryb2tlLWRhc2hhcnJheToxMSAzIDIgMztzdHJva2UtbGluZWNhcDpyb3VuZH0KICAgIC53ei1kaW17c3Ryb2tlOnZhcigtLXd6LWRpbSwjOGE4Zjk2KTtzdHJva2Utd2lkdGg6MC44O2ZpbGw6bm9uZX0KICAgIC53ei1kaW10eHR7ZmlsbDp2YXIoLS13ei1kaW10eHQsI2Q2MGEwYSk7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NjAwO3RleHQtYW5jaG9yOm1pZGRsZTtkb21pbmFudC1iYXNlbGluZTptaWRkbGV9CiAgICAud3otbGVhZHtzdHJva2U6dmFyKC0td3otZGltLCM4YThmOTYpO3N0cm9rZS13aWR0aDowLjc7ZmlsbDpub25lfQogICAgLnd6LW5vdGV7ZmlsbDp2YXIoLS13ei1ub3RlLCM1NTUpO2ZvbnQtc2l6ZToxMXB4fQogICAgLnd6LWJhZGdlLWJne2ZpbGw6dmFyKC0td3otYmFkZ2UsI2YxZjFmMSl9CiAgICAud3otYmFkZ2UtdHh7ZmlsbDp2YXIoLS13ei1pbmssIzFjMWMxYyk7Zm9udC1zaXplOjExcHg7Zm9udC13ZWlnaHQ6NjAwfQogIDwvc3R5bGU+YDsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJlbWFzc3VuZ3MtUHJpbWl0aXZlICovCmZ1bmN0aW9uIGRpbUgoaWQsIHhhLCB4YiwgeSwgbGFiZWwsIG9wdCkgewogIG9wdCA9IG9wdCB8fCB7fTsgY29uc3QgZXh0ID0gb3B0LmV4dCA9PSBudWxsID8gMCA6IG9wdC5leHQ7CiAgY29uc3QgZWwgPSBleHQgIT09IDAgPyBgCiAgICA8bGluZSBjbGFzcz0id3otZGltIiB4MT0iJHtmeCh4YSl9IiB5MT0iJHtmeChleHQpfSIgeDI9IiR7ZngoeGEpfSIgeTI9IiR7ZngoeSArICh5ID4gZXh0ID8gNCA6IC00KSl9Ii8+CiAgICA8bGluZSBjbGFzcz0id3otZGltIiB4MT0iJHtmeCh4Yil9IiB5MT0iJHtmeChleHQpfSIgeDI9IiR7ZngoeGIpfSIgeTI9IiR7ZngoeSArICh5ID4gZXh0ID8gNCA6IC00KSl9Ii8+YCA6ICcnOwogIHJldHVybiBgJHtlbH0KICAgIDxsaW5lIGNsYXNzPSJ3ei1kaW0iIHgxPSIke2Z4KHhhKX0iIHkxPSIke2Z4KHkpfSIgeDI9IiR7ZngoeGIpfSIgeTI9IiR7ZngoeSl9IiBtYXJrZXItc3RhcnQ9InVybCgjJHtpZH0tYWwpIiBtYXJrZXItZW5kPSJ1cmwoIyR7aWR9LWFyKSIvPgogICAgPHJlY3QgY2xhc3M9Ind6LWJhZGdlLWJnIiB4PSIke2Z4KCh4YSArIHhiKSAvIDIgLSBtZWFzdXJlKGxhYmVsKSl9IiB5PSIke2Z4KHkgLSA5KX0iIHdpZHRoPSIke2Z4KG1lYXN1cmUobGFiZWwpICogMil9IiBoZWlnaHQ9IjE2IiByeD0iMyIgb3BhY2l0eT0iMC45Ii8+CiAgICA8dGV4dCBjbGFzcz0id3otZGltdHh0IiB4PSIke2Z4KCh4YSArIHhiKSAvIDIpfSIgeT0iJHtmeCh5ICsgMSl9Ij4ke2xhYmVsfTwvdGV4dD5gOwp9CmZ1bmN0aW9uIGRpbVYoaWQsIHgsIHlhLCB5YiwgbGFiZWwsIG9wdCkgewogIG9wdCA9IG9wdCB8fCB7fTsgY29uc3QgZXh0ID0gb3B0LmV4dCA9PSBudWxsID8gMCA6IG9wdC5leHQ7CiAgY29uc3QgZWwgPSBleHQgIT09IDAgPyBgCiAgICA8bGluZSBjbGFzcz0id3otZGltIiB4MT0iJHtmeChleHQpfSIgeTE9IiR7ZngoeWEpfSIgeDI9IiR7ZngoeCArICh4ID4gZXh0ID8gNCA6IC00KSl9IiB5Mj0iJHtmeCh5YSl9Ii8+CiAgICA8bGluZSBjbGFzcz0id3otZGltIiB4MT0iJHtmeChleHQpfSIgeTE9IiR7ZngoeWIpfSIgeDI9IiR7ZngoeCArICh4ID4gZXh0ID8gNCA6IC00KSl9IiB5Mj0iJHtmeCh5Yil9Ii8+YCA6ICcnOwogIHJldHVybiBgJHtlbH0KICAgIDxsaW5lIGNsYXNzPSJ3ei1kaW0iIHgxPSIke2Z4KHgpfSIgeTE9IiR7ZngoeWEpfSIgeDI9IiR7ZngoeCl9IiB5Mj0iJHtmeCh5Yil9IiBtYXJrZXItc3RhcnQ9InVybCgjJHtpZH0tYWwpIiBtYXJrZXItZW5kPSJ1cmwoIyR7aWR9LWFyKSIvPgogICAgPHJlY3QgY2xhc3M9Ind6LWJhZGdlLWJnIiB4PSIke2Z4KHggLSBtZWFzdXJlKGxhYmVsKSl9IiB5PSIke2Z4KCh5YSArIHliKSAvIDIgLSA4KX0iIHdpZHRoPSIke2Z4KG1lYXN1cmUobGFiZWwpICogMil9IiBoZWlnaHQ9IjE2IiByeD0iMyIgb3BhY2l0eT0iMC45Ii8+CiAgICA8dGV4dCBjbGFzcz0id3otZGltdHh0IiB4PSIke2Z4KHgpfSIgeT0iJHtmeCgoeWEgKyB5YikgLyAyICsgMSl9Ij4ke2xhYmVsfTwvdGV4dD5gOwp9CmZ1bmN0aW9uIGRpbVZSb3QoaWQsIHgsIHlhLCB5YiwgbGFiZWwsIG9wdCkgewogIG9wdCA9IG9wdCB8fCB7fTsgY29uc3QgZXh0ID0gb3B0LmV4dCA9PSBudWxsID8gMCA6IG9wdC5leHQ7CiAgY29uc3QgY3kgPSAoeWEgKyB5YikgLyAyLCB0dyA9IG1lYXN1cmUobGFiZWwpICogMjsKICBjb25zdCBlbCA9IGV4dCAhPT0gMCA\\\/IGAKICAgIDxsaW5lIGNsYXNzPSJ3ei1kaW0iIHgxPSIke2Z4KGV4dCl9IiB5MT0iJHtmeCh5YSl9IiB4Mj0iJHtmeCh4ICsgKHggPiBleHQgPyA0IDogLTQpKX0iIHkyPSIke2Z4KHlhKX0iLz4KICAgIDxsaW5lIGNsYXNzPSJ3ei1kaW0iIHgxPSIke2Z4KGV4dCl9IiB5MT0iJHtmeCh5Yil9IiB4Mj0iJHtmeCh4ICsgKHggPiBleHQgPyA0IDogLTQpKX0iIHkyPSIke2Z4KHliKX0iLz5gIDogJyc7CiAgcmV0dXJuIGAke2VsfQogICAgPGxpbmUgY2xhc3M9Ind6LWRpbSIgeDE9IiR7ZngoeCl9IiB5MT0iJHtmeCh5YSl9IiB4Mj0iJHtmeCh4KX0iIHkyPSIke2Z4KHliKX0iIG1hcmtlci1zdGFydD0idXJsKCMke2lkfS1hbCkiIG1hcmtlci1lbmQ9InVybCgjJHtpZH0tYXIpIi8+CiAgICA8ZyB0cmFuc2Zvcm09InJvdGF0ZSgtOTAgJHtmeCh4KX0gJHtmeChjeSl9KSI+CiAgICAgIDxyZWN0IGNsYXNzPSJ3ei1iYWRnZS1iZyIgeD0iJHtmeCh4IC0gdHcgLyAyKX0iIHk9IiR7ZngoY3kgLSA4KX0iIHdpZHRoPSIke2Z4KHR3KX0iIGhlaWdodD0iMTYiIHJ4PSIzIiBvcGFjaXR5PSIwLjkyIi8+CiAgICAgIDx0ZXh0IGNsYXNzPSJ3ei1kaW10eHQiIHg9IiR7ZngoeCl9IiB5PSIke2Z4KGN5ICsgMSl9Ij4ke2xhYmVsfTwvdGV4dD4KICAgIDwvZz5gOwp9CmZ1bmN0aW9uIGxlYWRlcihpZCwgeDEsIHkxLCB4MiwgeTIsIGxhYmVsKSB7CiAgcmV0dXJuIGA8bGluZSBjbGFzcz0id3otbGVhZCIgeDE9IiR7ZngoeDEpfSIgeTE9IiR7ZngoeTEpfSIgeDI9IiR7ZngoeDIpfSIgeTI9IiR7ZngoeTIpfSIgbWFya2VyLXN0YXJ0PSJ1cmwoIyR7aWR9LWFsKSIvPgogICAgPHJlY3QgY2xhc3M9Ind6LWJhZGdlLWJnIiB4PSIke2Z4KHgyIC0gbWVhc3VyZShsYWJlbCkgLSAzKX0iIHk9IiR7ZngoeTIgLSA4KX0iIHdpZHRoPSIke2Z4KG1lYXN1cmUobGFiZWwpICogMiArIDYpfSIgaGVpZ2h0PSIxNiIgcng9IjMiIG9wYWNpdHk9IjAuOTUiLz4KICAgIDx0ZXh0IGNsYXNzPSJ3ei1kaW10eHQiIHg9IiR7ZngoeDIgKyBtZWFzdXJlKGxhYmVsKSl9IiB5PSIke2Z4KHkyICsgMSl9Ij4ke2xhYmVsfTwvdGV4dD5gOwp9CgpmdW5jdGlvbiB3cmFwU3ZnKGlkLCB2dywgdmgsIGdhc2tldEZpbGwsIGJvZHksIGxlZ2VuZCkgewogIHJldHVybiBgPHN2ZyBjbGFzcz0id3otc3ZnIiB2aWV3Qm94PSIwIDAgJHt2d30gJHt2aH0iIHJvbGU9ImltZyIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQgbWVldCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAke2ZyYW1lRGVmcyhpZCwgZ2Fza2V0RmlsbCl9CiAgPGc+JHtib2R5fTwvZz4KICAke2xlZ2VuZCB8fCAnJ30KPC9zdmc+YDsKfQovKiBSYS1adXNhdHogZnVlciBkaWUgTGVnZW5kZSAtIGtvbW10IEFVU1NDSExJRVNTTElDSCBhdXMgZGF0YS5qcyAob2JlcmZsYWVjaGVuW10pLgogKiBGcnVlaGVyIHN0YW5kIGhpZXIgZWluZSBoYXJ0a29kaWVydGUgS2V0dGUgKEgxIC0+ICIoZ2ViZWl6dCkiLCBIMyAtPiAiKFJhPDAsOCkiLAogKiBBTExFUyBBTkRFUkUgLT4gIihSYTwwLDQpIikuIERlciBlbHNlLVp3ZWlnIGhhZXR0ZSBqZWRlciB1bmJla2FubnRlbi9uZXVlbgogKiBPYmVyZmxhZWNoZSBzdGlsbHNjaHdlaWdlbmQgZWluZW4gZXJmdW5kZW5lbiBSYS1XZXJ0IGFuZ2VkaWNodGV0LgogKiBKZXR6dDogbnVyIGJlc3RhZXRpZ3RlIFdlcnRlLiBGZWhsdCBkZXIgV2VydCAoSDE6IHJhSW5uZW4gPSBudWxsKSBvZGVyIGZlaGxlbiBkaWUKICogRGF0ZW4gZ2FueiAoZHJhdy5qcyBsYWV1ZnQgYXVjaCBvaG5lIGRhdGEuanMgaW0gTm9kZS1EZW1vKSwgZW50ZmFlbGx0IGRlciBadXNhdHouICovCmZ1bmN0aW9uIHJhU3VmZml4KHN1cmZhY2UpIHsKICBjb25zdCBsaXN0ID0gcm9vdCAmJiByb290LldFSVNTX0RBVEEgJiYgcm9vdC5XRUlTU19EQVRBLm9iZXJmbGFlY2hlbjsKICBpZiAoIWxpc3QpIHJldHVybiAnJzsKICBjb25zdCBvID0gbGlzdC5maW5kKHggPT4geC5pZCA9PT0gc3VyZmFjZSk7CiAgaWYgKCFvIHx8IG8ucmFJbm5lbiA9PSBudWxsKSByZXR1cm4gJyc7CiAgcmV0dXJuICcgKFJhJmx0OycgKyBTdHJpbmcoby5yYUlubmVuKS5yZXBsYWNlKCcuJywgJywnKSArICcpJzsKfQpmdW5jdGlvbiBsZWdlbmRCb3goaWQsIHZ3LCB2aCwgbywgdmlld05hbWUpIHsKICBjb25zdCBpdGVtcyA9IFsKICAgIFsnQW5zaWNodCcsIHZpZXdOYW1lXSwKICAgIFsnV2Vya3N0b2ZmJywgby53ZXJrc3RvZmZdLAogICAgWydPYmVyZmzDpGNoZScsIG8uc3VyZmFjZSArIHJhU3VmZml4KG8uc3VyZmFjZSldCiAgXS5maWx0ZXIoaXQgPT4gaXRbMV0pOwogIGNvbnN0IHkwID0gdmggLSAxNCAtIGl0ZW1zLmxlbmd0aCAqIDE1OyBsZXQgcm93cyA9ICcnOwogIGl0ZW1zLmZvckVhY2goKGl0LCBpKSA9PiB7CiAgICByb3dzICs9IGA8dGV4dCBjbGFzcz0id3otbm90ZSIgeD0iMTQiIHk9IiR7eTAgKyAxMiArIGkgKiAxNX0iPgogICAgICA8dHNwYW4gZmlsbD0idmFyKC0td3otbm90ZSwjOTk5KSI+JHtpdFswXX06PC90c3Bhbj4KICAgICAgPHRzcGFuIGR4PSI0IiBmb250LXdlaWdodD0iNjAwIiBmaWxsPSJ2YXIoLS13ei1pbmssIzFjMWMxYykiPiR7aXRbMV19PC90c3Bhbj48L3RleHQ+YDsKICB9KTsKICByZXR1cm4gYDxnIG9wYWNpdHk9IjAuOTUiPiR7cm93c308L2c+YDsKfQoKLyogLS0gZ2VtZWluc2FtZXIgUHJvamVrdG9yICsgRml0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpmdW5jdGlvbiBtYWtlUHJvaihleHRYbWluLCBleHRYbWF4LCBleHRZbWluLCBleHRZbWF4LCB2dywgdmgsIHBhZCkgewogIGNvbnN0IHdNbSA9IGV4dFhtYXggLSBleHRYbWluLCBoTW0gPSBleHRZbWF4IC0gZXh0WW1pbjsKICBjb25zdCBib3hXID0gdncgLSBwYWQubCAtIHBhZC5yLCBib3hIID0gdmggLSBwYWQudCAtIHBhZC5iOwogIGNvbnN0IHNjYWxlID0gTWF0aC5tYXgoMC4zNSwgTWF0aC5taW4oNiwgTWF0aC5taW4oYm94VyAvIHdNbSwgYm94SCAvIGhNbSkpKTsKICBjb25zdCBveCA9IHBhZC5sICsgKGJveFcgLSB3TW0gKiBzY2FsZSkgLyAyIC0gZXh0WG1pbiAqIHNjYWxlOwogIGNvbnN0IG95ID0gcGFkLnQgKyAoYm94SCAtIGhNbSAqIHNjYWxlKSAvIDIgLSBleHRZbWluICogc2NhbGU7CiAgY29uc3QgUCA9ICh4LCB5KSA9PiBbb3ggKyB4ICogc2NhbGUsIG95ICsgeSAqIHNjYWxlXTsKICBQLnNjYWxlID0gc2NhbGU7IFAuc3ggPSB4ID0+IG94ICsgeCAqIHNjYWxlOyBQLnN5ID0geSA9PiBveSArIHkgKiBzY2FsZTsKICByZXR1cm4gUDsKfQoKLyogLS0gMSkgQ2xhbXBzdHV0emVuOiBBc3NlbWJseSAvIEJsaW5kZGVja2VsIC8gRUlOWkVMTkVSIFN0dXR6ZW4gLS0tLS0tLS0tLS0tCiAqIG1vZGU6IGZhbHNlIHwgJ2Fzc2VtYmx5JyAgLT4ga29tcGxldHRlIFRyaUNsYW1wLVZlcmJpbmR1bmcgKDJ4IEZlcnJ1bGUgKyBEaWNodHVuZyArIEtsYW1tZXIpCiAqICAgICAgIHRydWUgIHwgJ2Nsb3NlZCcgICAgLT4gQmxpbmRkZWNrZWwgKGVpbiBTdHV0emVuLCBTdGlybmZsYWVjaGUgenUpCiAqICAgICAgICdzaW5nbGUnICAgICAgICAgICAgLT4gRUlOIFN0dXR6ZW4sIG9mZmVuOiBrZWluZSB6d2VpdGUgRmVycnVsZSwga2VpbmUgRGljaHR1bmcsCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2VpbmUgS2xhbW1lciAoQmVybmQgMTYuMDcuMjAyNiwgUGt0LiA5LjIvOS4zIC0gVENEL1RDUykuCiAqIERpZSBhbHRlbiBCb29sZWFuLUF1ZnJ1ZmVyIChmYWxzZS90cnVlKSBmdW5rdGlvbmllcmVuIHVudmVyYWVuZGVydCB3ZWl0ZXIuCiAqIEdlemVpY2huZXQgd2VyZGVuIGF1c3NjaGxpZXNzbGljaCB1ZWJlcmdlYmVuZSBNYXNzZSAob2QgLyB3YWxsIC8gbGVuZ3RoIC8gZmxhbmdlT2QpIC0KICogaGllciB3aXJkIG5pY2h0cyBiZXJlY2huZXQgb2RlciBlcmdhZW56dC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCmZ1bmN0aW9uIGRyYXdDbGFtcHN0dXR6ZW4obywgdncsIHZoLCBtb2RlKSB7CiAgY29uc3QgY2xvc2VkID0gbW9kZSA9PT0gdHJ1ZSB8fCBtb2RlID09PSAnY2xvc2VkJzsKICBjb25zdCBzaW5nbGUgPSBtb2RlID09PSAnc2luZ2xlJzsKICAvLyBCZWlkZSBWYXJpYW50ZW4gemVpZ2VuIG51ciBkZW4gbGlua2VuIFN0dXR6ZW4gLT4gZ2xlaWNoZSBBdXNkZWhudW5nLCBnbGVpY2hlIEJlbWFzc3VuZy4KICBjb25zdCBlaW56ZWxuID0gY2xvc2VkIHx8IHNpbmdsZTsKICBjb25zdCBSID0gby5vZFIsIHJpID0gby5pbm5SLCBMID0gby5sZW5ndGg7CiAgY29uc3QgZlIgPSBvLmZsYW5nZU9kIC8gMjsKICAvKiBDbGFtcGJ1bmQgKFRDLVRlaWwpOiBFSU5FIEhvZWhlIGplIEdyb2Vzc2UsIGlkZW50aXNjaCBmdWVyIEtLLCBLTCB1bmQgZGVuCiAgICogZGlja3dhbmRpZ2VuIFRhbmtzdHV0emVuIC0gSGVybGVpdHVuZywgQmVsZWdlIHVuZCBkaWUgd2VpdGVyaGluIGdlbHRlbmRlCiAgICogRGVja2VsdW5nIGFuIGRlciBTdHV0emVubGFlbmdlIHN0ZWhlbiBiZWkgVENfQlVORCAvIHRjQnVuZEhvZWhlIG9iZW4uCiAgICogQXVmdGVpbHVuZyAyOjEgaW4gQnVuZGhvZWhlIHVuZCBGYXNlLCB3aWUgaW4gZGVyIFZvcmdhZW5nZXJmYXNzdW5nLgogICAqIFJlaW4gc2NoZW1hdGlzY2gsIHRyYWVndCBLRUlORSBNYXNzemFobC4gKi8KICBjb25zdCBidW5kSCA9IHRjQnVuZEhvZWhlKG8uZmxhbmdlT2QsIEwpOwogIGNvbnN0IHRGbCA9IGJ1bmRIICogMiAvIDM7CiAgY29uc3QgY2ggPSBidW5kSCAvIDM7CiAgLyogQmF1bGFlbmdlIGw0IChudXIga29tcGxldHRlIFZlcmJpbmR1bmcpLiBJc3Qgc2llIGJlbGVndCwgYmVrb21tdCBkZXIKICAgKiBEaWNodHVuZ3NzcGFsdCBnZW5hdSBkaWUgQnJlaXRlIGw0IC0gMiB4IFN0dXR6ZW5sYWVuZ2U6IGRhbm4gc3RpbW10IGRpZQogICAqIGdlemVpY2huZXRlIEdlc2FtdGxhZW5nZSBtaXQgZGVyIGJlbWFzc3RlbiB1ZWJlcmVpbiwgc3RhdHQgd2llIGJpc2hlciBhdXMKICAgKiBlaW5lbSBzY2hlbWF0aXNjaGVuIG9kKjAsMTItU3BhbHQgenUgZW50c3RlaGVuIChkZXIgYmVpIEROMjAwIGFsbGVpbiAyNCw1IG1tCiAgICogYnJlaXQgd2FyIHVuZCBkaWUgR2VzYW10bGFlbmdlIHVtIH4zOSAlIHZlcmZlaGx0IGhhZXR0ZSkuICovCiAgY29uc3QgbDQgPSBlaW56ZWxuID8gbnVsbCA6IGw0SW5mbyhvKTsKICBjb25zdCBnVCA9IGw0ID8gTWF0aC5tYXgobDQuc3BhbHQsIERJQ0hUX1NQQUxUX01JTikgOiBNYXRoLm1heCgyLjUsIG8ub2QgKiAwLjEyKTsKICBjb25zdCBjbGFtcFQgPSBNYXRoLm1heCg1LCBvLm9kICogMC4xNik7CiAgY29uc3QgZ09SID0gZlIgKiAwLjgyLCBnSVIgPSByaTsKCiAgLy8gQjIgKEJlcm5kLCAxNi4wNy4yMDI2KTogQkVJREUgU3R1dHplbiBnbGVpY2ggbGFuZyAtIGJlaSBLSyBiZWlkZSBrdXJ6LCBiZWkgS0wKICAvLyBiZWlkZSBsYW5nLiBEaWUgcmVjaHRlIFNlaXRlIGlzdCBqZXR6dCBleGFrdCBkaWUgU3BpZWdlbHVuZyBkZXIgbGlua2VuIGFuIGRlcgogIC8vIERpY2h0dW5nOiBTcGllZ2VsdW5nIG0oeCkgPSB4ZjIgKyAoTCAtIHgpLiBGcnVlaGVyIHdhciBkZXIgcmVjaHRlIFN0dXR6ZW4gZWluCiAgLy8gZWlnZW5lciwgYXVzIGRlciBHZW9tZXRyaWUgYWJnZWxlaXRldGVyIFN0dW1tZWwgKG1heCgxNCwgTCowLjI4KSkgdW5kIGRhbWl0CiAgLy8gdW5hYmhhZW5naWcgdm9uIGRlciBnZXdhZWhsdGVuIFN0dXR6ZW5sYWVuZ2UgLT4gTWl4IGF1cyBLSyB1bmQgS0wuCiAgLy8gTCA9IG8ubGVuZ3RoIGtvbW10IGF1cyBkZXIgRGF0ZW50YWJlbGxlIChhcHAuanM6IHJ3LmtrIGJ6dy4gcncua2wgamUgbmFjaAogIC8vIGxhZW5nZVZhcmlhbnRlKSAtIGhpZXIgd2lyZCBLRUlOIE1hc3MgYmVyZWNobmV0IG9kZXIgZXJmdW5kZW4sIG51ciBnZXNwaWVnZWx0LgogIGNvbnN0IHgwID0gMCwgeGIgPSBMIC0gdEZsIC0gY2gsIHhmID0gTCwgeGcgPSB4ZiArIGdULCB4ZjIgPSB4ZywgeGIyID0geGYyICsgdEZsICsgY2gsIHhFbmQgPSB4ZjIgKyBMOwogIGNvbnN0IHlNYXggPSBNYXRoLm1heChmUiArIGNsYW1wVCArIDYsIFIgKyA2KTsKICBjb25zdCBQID0gbWFrZVByb2ooMCwgZWluemVsbiA\\\/IHhmICsgNiA6IHhFbmQsIC15TWF4LCB5TWF4LCB2dywgdmgsIHsgbDo2Niwgcjo5NiwgdDo0MCwgYjo3NCB9KTsKICBjb25zdCBpZCA9IHVpZCgpOyBjb25zdCBjeSA9IFAuc3koMCk7CgogIGNvbnN0IGZlcnJ1bGVPdXRlciA9ICh4MCwgeGIsIHhmLCBmUikgPT4gWwogICAgUCh4MCwtUiksIFAoeGIsLVIpLCBQKHhiK2NoLC1mUiksIFAoeGYsLWZSKSwgUCh4ZiwtcmkpLAogICAgUCh4ZixyaSksIFAoeGYsZlIpLCBQKHhiK2NoLGZSKSwgUCh4YixSKSwgUCh4MCxSKQogIF07CiAgY29uc3QgZmVycnVsZUJvcmUgPSAoeDAsIHhmKSA9PiBbUCh4MCwtcmkpLCBQKHhmLC1yaSksIFAoeGYscmkpLCBQKHgwLHJpKV07CgogIGxldCBzID0gJyc7CiAgcyArPSBgPHJlY3QgY2xhc3M9Ind6LWJvcmUiIHg9IiR7ZngoUC5zeCh4MCkpfSIgeT0iJHtmeChQLnN5KC1yaSkpfSIgd2lkdGg9IiR7ZngoKGVpbnplbG4gPyB4ZiA6IHhFbmQgLSB4MCkgKiBQLnNjYWxlKX0iIGhlaWdodD0iJHtmeCgyICogcmkgKiBQLnNjYWxlKX0iLz5gOwogIHMgKz0gYDxwYXRoIGNsYXNzPSJ3ei1oYXRjaCIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSIke3BhdGhGcm9tKGZlcnJ1bGVPdXRlcih4MCwgeGIsIHhmLCBmUikpfSBaICR7cGF0aEZyb20oZmVycnVsZUJvcmUoeDAsIHhmKSl9IFoiLz5gOwoKICBpZiAoIWVpbnplbG4pIHsKICAgIGNvbnN0IGdUb3AgPSBbUCh4ZiwtZ09SKSwgUCh4ZywtZ09SKSwgUCh4ZywtZ0lSKSwgUCh4ZiwtZ0lSKV07CiAgICBjb25zdCBnQm90ID0gW1AoeGYsZ0lSKSwgUCh4ZyxnSVIpLCBQKHhnLGdPUiksIFAoeGYsZ09SKV07CiAgICBzICs9IGA8cGF0aCBjbGFzcz0id3otZ2Fza2V0IiBkPSIke3BhdGhGcm9tKGdUb3ApfSBaIi8+YDsKICAgIHMgKz0gYDxwYXRoIGNsYXNzPSJ3ei1nYXNrZXQiIGQ9IiR7cGF0aEZyb20oZ0JvdCl9IFoiLz5gOwogICAgY29uc3QgZzJPdXRlciA9IFsKICAgICAgUCh4RW5kLC1SKSwgUCh4YjIsLVIpLCBQKHhiMi1jaCwtZlIpLCBQKHhmMiwtZlIpLCBQKHhmMiwtcmkpLAogICAgICBQKHhmMixyaSksIFAoeGYyLGZSKSwgUCh4YjItY2gsZlIpLCBQKHhiMixSKSwgUCh4RW5kLFIpCiAgICBdOwogICAgY29uc3QgZzJCb3JlID0gW1AoeGYyLC1yaSksIFAoeEVuZCwtcmkpLCBQKHhFbmQscmkpLCBQKHhmMixyaSldOwogICAgcyArPSBgPHBhdGggY2xhc3M9Ind6LWhhdGNoIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9IiR7cGF0aEZyb20oZzJPdXRlcil9IFogJHtwYXRoRnJvbShnMkJvcmUpfSBaIi8+YDsKICAgIGNvbnN0IGNsYW1wVG9wID0gKHNnbikgPT4gewogICAgICBjb25zdCB5RiA9IHNnbiAqIGZSLCB5QyA9IHNnbiAqIChmUiArIGNsYW1wVCk7CiAgICAgIGNvbnN0IHhhID0geGIgKyBjaCAtIDEsIHhlID0geGIyIC0gY2ggKyAxOwogICAgICByZXR1cm4gWyBQKHhhLHlGKSwgUCh4Zix5RiksIFAoeGcseUYpLCBQKHhlLHlGKSwgUCh4ZSsyLCB5QyowLjYyICsgc2duKjIpLCBQKHhlLHlDKSwgUCh4YSx5QyksIFAoeGEtMiwgeUMqMC42MiArIHNnbioyKSBdOwogICAgfTsKICAgIHMgKz0gYDxwYXRoIGNsYXNzPSJ3ei1jbGFtcCIgZD0iJHtwYXRoRnJvbShjbGFtcFRvcCgtMSkpfSBaIi8+YDsKICAgIHMgKz0gYDxwYXRoIGNsYXNzPSJ3ei1jbGFtcCIgZD0iJHtwYXRoRnJvbShjbGFtcFRvcCgxKSl9IFoiLz5gOwogIH0gZWxzZSBpZiAoY2xvc2VkKSB7CiAgICAvLyBOdXIgZGVyIEJsaW5kZGVja2VsIGhhdCBlaW5lIGdlc2NobG9zc2VuZSBTdGlybmZsYWVjaGUuIERlciBlaW56ZWxuZSBTdHV0emVuCiAgICAvLyAoJ3NpbmdsZScpIGlzdCBvZmZlbiAtPiBoaWVyIGJld3Vzc3QgS0VJTiBEZWNrZWwuCiAgICBzICs9IGA8cmVjdCBjbGFzcz0id3otaGF0Y2giIHg9IiR7ZngoUC5zeCh4ZiAtIG8ud2FsbCAqIDEuNCkpfSIgeT0iJHtmeChQLnN5KC1yaSkpfSIgd2lkdGg9IiR7Zngoby53YWxsICogMS40ICogUC5zY2FsZSl9IiBoZWlnaHQ9IiR7ZngoMiAqIHJpICogUC5zY2FsZSl9Ii8+YDsKICB9CgogIHMgKz0gYDxsaW5lIGNsYXNzPSJ3ei1jZW50ZXIiIHgxPSIke2Z4KFAuc3goeDApIC0gMTApfSIgeTE9IiR7ZngoY3kpfSIgeDI9IiR7ZngoUC5zeChlaW56ZWxuID8geGYgOiB4RW5kKSArIDEwKX0iIHkyPSIke2Z4KGN5KX0iLz5gOwoKICBjb25zdCBkaW1ZID0gY3kgKyBSICogUC5zY2FsZSArIDMwLCBkaW1ZMiA9IGRpbVkgKyAyMjsKICAvLyBMYWVuZ2VubWFzczogUHJhZWZpeCBhdXMgby5sZW5ndGhMYWJlbCAoJ0wnID0gU3R1dHplbmxhZW5nZSBLSy9LTCwgJ2gnID0gSG9laGUgYmVpbSBUQ0QpLgogIHMgKz0gZGltSChpZCwgUC5zeCh4MCksIFAuc3goeGYpLCBkaW1ZLCBvLmxlbmd0aExhYmVsICsgJyAnICsgZGUoby5sZW5ndGgpLCB7IGV4dDogUC5zeShSKSB9KTsKICAvKiBCYXVsYWVuZ2UgZGVyIGtvbXBsZXR0ZW4gVmVyYmluZHVuZzogc2VpdCAyOC4wNy4yMDI2IGRhcyBlY2h0ZSBNYXNzIGw0IGF1cwogICAqIERJTiAzMjY3NiAoZGF0YS5qcykuIEJlaW0gZWluemVsbmVuIFN0dXR6ZW4gSVNUIGRhcyBMYWVuZ2VubWFzcyBvYmVuIHNjaG9uIGRhcwogICAqIHZvbGxzdGFlbmRpZ2UgTWFzcyAtPiBrZWluIHp3ZWl0ZXMgTWFzcyBhbmhhZW5nZW4uIE9obmUgQmVsZWcgKG9kZXIgYmVpCiAgICogd2lkZXJzcHJ1ZWNobGljaGVyIFF1ZWxsZSwgc2llaGUgbDRJbmZvKSBibGVpYnQgZGVyIGJpc2hlcmlnZSBQbGF0emhhbHRlciAtCiAgICogZXMgd2lyZCBLRUlORSBCYXVsYWVuZ2UgZ2VzY2hhZXR6dC4gKi8KICBpZiAoIWVpbnplbG4pIHMgKz0gZGltSChpZCwgUC5zeCh4MCksIFAuc3goeEVuZCksIGRpbVkyLAogICAgbDQgPyAnbDQgJyArIGRlKGw0LndlcnQpIDogJ0JhdWzDpG5nZSBmb2xndCcsIHsgZXh0OiAwIH0pOwogIHMgKz0gZGltVihpZCwgUC5zeCh4MCkgLSAzNCwgUC5zeSgtUiksIFAuc3koUiksICdBRCDijIAgJyArIGRlKG8ub2QpLCB7IGV4dDogUC5zeCh4MCkgfSk7CiAgLyogQmVybmQgMjcuMDcuMjAyNiAoV29yZCwgQWJzY2huaXR0IDMpOiBCaXNoZXIgc3RhbmRlbiBudXIgQXVzc2VuZHVyY2htZXNzZXIgdW5kCiAgICogV2FuZHN0YWVya2UgaW4gZGVyIFplaWNobnVuZy4gRGVyIElubmVuZHVyY2htZXNzZXIga29tbXQgZGF6dSAtIGJlcmVjaG5ldCBuYWNoCiAgICogQmVybmRzIEZvcm1lbCBJRCA9IEFEIC0gKDIgeCBXYW5kKSwgYWxzbyBleGFrdCBkZXIgZ2V6ZWljaG5ldGUgQm9ocnVuZ3Mt4oyAICgyKnJpKS4KICAgKiBFciBzdGVodCBhdWYgZGVyIFRDLVNlaXRlLCBkZXIgVEMt4oyAIHJ1ZWNrdCBkYWZ1ZXIgd2VpdGVyIG5hY2ggcmVjaHRzLiBCZWkgZGVyCiAgICoga29tcGxldHRlbiBWZXJiaW5kdW5nIHNpdHplbiBiZWlkZSBNYXNzZSBhbSByZWNodGVuIEVuZGUuICovCiAgY29uc3QgeFJpZ2h0ID0gZWluemVsbiA\\\/IHhmIDogeEVuZDsKICBzICs9IGRpbVZSb3QoaWQsIFAuc3goeFJpZ2h0KSArIDMyLCBQLnN5KC1yaSksIFAuc3kocmkpLCAnSUQg4oyAICcgKyBkZSgyICogcmkpLCB7IGV4dDogUC5zeCh4UmlnaHQpIH0pOwogIHMgKz0gZGltVlJvdChpZCwgUC5zeCh4UmlnaHQpICsgNjIsIFAuc3koLWZSKSwgUC5zeShmUiksICdUQyDijIAgJyArIGRlKGZSICogMiksIHsgZXh0OiBQLnN4KHhSaWdodCkgfSk7CiAgcyArPSBsZWFkZXIoaWQsIFAuc3goby5sZW5ndGggKiAwLjE4KSwgUC5zeSgtUiksIFAuc3goby5sZW5ndGggKiAwLjE4KSAtIDMwLCBQLnN5KC1SKSAtIDI0LCAncyAnICsgZGUoby53YWxsKSk7CgogIHMgKz0gYDxyZWN0IGNsYXNzPSJ3ei1iYWRnZS1iZyIgeD0iJHtmeChQLnN4KCh4MCArIHhmKSAvIDIpIC0gNjIpfSIgeT0iMTQiIHdpZHRoPSIxMjQiIGhlaWdodD0iMjAiIHJ4PSIxMCIvPgogICAgICAgIDx0ZXh0IGNsYXNzPSJ3ei1iYWRnZS10eCIgeD0iJHtmeChQLnN4KCh4MCArIHhmKSAvIDIpKX0iIHk9IjI4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj5ETiAke28uZG59IMK3IENsYW1wICR7by5jbGFtcFNpemV9PC90ZXh0PmA7CiAgY29uc3QgbGVnZW5kID0gbGVnZW5kQm94KGlkLCB2dywgdmgsIG8sIGNsb3NlZCA\\\/ICdMw6RuZ3NzY2huaXR0IChCbGluZGRlY2tlbCknCiAgICA6IHNpbmdsZSA\\\/ICdMw6RuZ3NzY2huaXR0IChlaW56ZWxuZXIgU3R1dHplbiknIDogJ0zDpG5nc3NjaG5pdHQgKENsYW1wLVZlcmJpbmR1bmcpJyk7CiAgcmV0dXJuIHdyYXBTdmcoaWQsIHZ3LCB2aCwgby5nQ29sLCBzLCBsZWdlbmQpOwp9CgovKiAtLSAyKSBCb2dlbiA5MC80NSAoZ2VzY2h3ZWlzc3QsIERJTiAxMTg2NSkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCmZ1bmN0aW9uIGRyYXdCb2dlbihvLCB2dywgdmgsIGRlZykgewogIGNvbnN0IFIgPSBvLm9kUiwgcmkgPSBvLmlublIsIFJjID0gby5iZW5kUmFkaXVzLCBMID0gby5sZW5ndGg7CiAgY29uc3QgYW5nID0gZGVnICogTWF0aC5QSSAvIDE4MDsKICBjb25zdCBBID0gLU1hdGguUEkgLyAyLCBCID0gQSArIGFuZywgQyA9IFswLCAwXTsKICBjb25zdCBvbkMgPSAociwgYSkgPT4gW0NbMF0gKyByICogTWF0aC5jb3MoYSksIENbMV0gKyByICogTWF0aC5zaW4oYSldOwogIGNvbnN0IHRBID0gWy1NYXRoLnNpbihBKSwgTWF0aC5jb3MoQSldLCB0QiA9IFstTWF0aC5zaW4oQiksIE1hdGguY29zKEIpXTsKICBjb25zdCBpblRpcCA9IHIgPT4gW29uQyhyLCBBKVswXSAtIHRBWzBdICogTCwgb25DKHIsIEEpWzFdIC0gdEFbMV0gKiBMXTsKICBjb25zdCBvdXRUaXAgPSByID0+IFtvbkMociwgQilbMF0gKyB0QlswXSAqIEwsIG9uQyhyLCBCKVsxXSArIHRCWzFdICogTF07CiAgY29uc3Qgc2VnID0gZGVnID4gNjAgPyAyMCA6IDE0OwogIGNvbnN0IG1pZCA9IChBICsgQikgLyAyOwogIC8qIEJlcm5kIDI3LjA3LjIwMjY6IEJlaW0gOTAtR3JhZC1Cb2dlbiBzYXNzIGRpZSBNYXNzemFobCAiUiIgYXVmIGhhbGJlciBTdHJlY2tlCiAgICogendpc2NoZW4gQm9nZW5taXR0ZWxwdW5rdCB1bmQgQm9nZW5taXR0ZSAtIGFsc28gZ2VuYXUgZG9ydCwgd28gZGllIE1hc3NrZXR0ZQogICAqIEwzL0wxIGxhZXVmdC4gQWIgRE4yNSB1ZWJlcmRlY2t0ZW4gc2ljaCBkaWUgYmVpZGVuIFRleHRrYWVzdGVuLiBEaWUgWmFobCBzdGVodAogICAqIGpldHp0IEFVU1NFUkhBTEIgZGVyIEJvZ2Vua29udHVyIGFtIEVuZGUgZWluZXMgSGlud2Vpc3N0cmljaHM7IGRpZSBNYXNzbGluaWUKICAgKiB6ZWlndCB3ZWl0ZXJoaW4gdm9tIE1pdHRlbHB1bmt0IGF1ZiBkaWUgQm9nZW5taXR0ZWxsaW5pZS4gRGVyIDQ1LUdyYWQtQm9nZW4KICAgKiAoYmlzaGVyIHVuYXVmZmFlbGxpZykgZm9sZ3QgZGVyc2VsYmVuIFJlZ2VsIHVuZCBibGVpYnQgZGFkdXJjaCBrb2xsaXNpb25zZnJlaS4gKi8KICBjb25zdCByTGFiZWxQdCA9IG9uQyhSYyArIFIgKyBNYXRoLm1heCg5LCBSICogMC44NSksIG1pZCk7CiAgY29uc3Qgb3V0ZXIgPSBbXS5jb25jYXQoW2luVGlwKFJjICsgUildKS5jb25jYXQoYXJjUHRzKDAsMCxSYytSLEEsQixzZWcpKS5jb25jYXQoW291dFRpcChSYytSKV0pLmNvbmNhdChbb3V0VGlwKFJjLVIpXSkuY29uY2F0KGFyY1B0cygwLDAsUmMtUixCLEEsc2VnKSkuY29uY2F0KFtpblRpcChSYy1SKV0pOwogIGNvbnN0IGJvcmUgPSBbXS5jb25jYXQoW2luVGlwKFJjICsgcmkpXSkuY29uY2F0KGFyY1B0cygwLDAsUmMrcmksQSxCLHNlZykpLmNvbmNhdChbb3V0VGlwKFJjK3JpKV0pLmNvbmNhdChbb3V0VGlwKFJjLXJpKV0pLmNvbmNhdChhcmNQdHMoMCwwLFJjLXJpLEIsQSxzZWcpKS5jb25jYXQoW2luVGlwKFJjLXJpKV0pOwogIGNvbnN0IGFsbFggPSBvdXRlci5tYXAocCA9PiBwWzBdKS5jb25jYXQoW2luVGlwKFJjKVswXSwgb3V0VGlwKFJjKVswXSwgckxhYmVsUHRbMF1dKTsKICBjb25zdCBhbGxZID0gb3V0ZXIubWFwKHAgPT4gcFsxXSkuY29uY2F0KFtpblRpcChSYylbMV0sIG91dFRpcChSYylbMV0sIHJMYWJlbFB0WzFdXSk7CiAgY29uc3QgUCA9IG1ha2VQcm9qKE1hdGgubWluKC4uLmFsbFgpLTYsIE1hdGgubWF4KC4uLmFsbFgpKzYsIE1hdGgubWluKC4uLmFsbFkpLTYsIE1hdGgubWF4KC4uLmFsbFkpKzYsIHZ3LCB2aCwgeyBsOjU4LCByOjU4LCB0OjUwLCBiOjYyIH0pOwogIGNvbnN0IGlkID0gdWlkKCk7IGNvbnN0IHByID0gYSA9PiBhLm1hcChwID0+IFAocFswXSwgcFsxXSkpOwoKICBsZXQgcyA9ICcnOwogIHMgKz0gYDxwYXRoIGNsYXNzPSJ3ei1ib3JlIiBkPSIke3BhdGhGcm9tKHByKGJvcmUpKX0gWiIvPmA7CiAgcyArPSBgPHBhdGggY2xhc3M9Ind6LWhhdGNoIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9IiR7cGF0aEZyb20ocHIob3V0ZXIpKX0gWiAke3BhdGhGcm9tKHByKGJvcmUpKX0gWiIvPmA7CiAgY29uc3QgY2xBcmMgPSBhcmNQdHMoMCwwLFJjLEEsQixzZWcpLm1hcChwID0+IFAocFswXSwgcFsxXSkpOwogIHMgKz0gYDxwb2x5bGluZSBjbGFzcz0id3otY2VudGVyIiBwb2ludHM9IiR7cG9seShbUCguLi5pblRpcChSYykpLCBQKC4uLm9uQyhSYywgQSkpXSl9Ii8+YDsKICBzICs9IGA8cG9seWxpbmUgY2xhc3M9Ind6LWNlbnRlciIgcG9pbnRzPSIke3BvbHkoY2xBcmMpfSIvPmA7CiAgcyArPSBgPHBvbHlsaW5lIGNsYXNzPSJ3ei1jZW50ZXIiIHBvaW50cz0iJHtwb2x5KFtQKC4uLm9uQyhSYywgQikpLCBQKC4uLm91dFRpcChSYykpXSl9Ii8+YDsKICBjb25zdCBjQyA9IFAoMCwgMCksIGNNaWQgPSBQKC4uLm9uQyhSYywgbWlkKSksIGNMYmwgPSBQKC4uLnJMYWJlbFB0KTsKICBjb25zdCByVHh0ID0gJ1IgJyArIChvLnByb3ZEaW1zID8gJ2ZvbGd0JyA6IGRlKFJjKSk7CiAgY29uc3QgckJveFcgPSBtZWFzdXJlKHJUeHQpICogMjsKICBzICs9IGA8bGluZSBjbGFzcz0id3otZGltIiB4MT0iJHtmeChjQ1swXSl9IiB5MT0iJHtmeChjQ1sxXSl9IiB4Mj0iJHtmeChjTWlkWzBdKX0iIHkyPSIke2Z4KGNNaWRbMV0pfSIgbWFya2VyLWVuZD0idXJsKCMke2lkfS1hcikiLz4KICAgICAgICA8bGluZSBjbGFzcz0id3otbGVhZCIgeDE9IiR7ZngoY01pZFswXSl9IiB5MT0iJHtmeChjTWlkWzFdKX0iIHgyPSIke2Z4KGNMYmxbMF0pfSIgeTI9IiR7ZngoY0xibFsxXSl9Ii8+CiAgICAgICAgPHJlY3QgY2xhc3M9Ind6LWJhZGdlLWJnIiB4PSIke2Z4KGNMYmxbMF0gLSByQm94VyAvIDIpfSIgeT0iJHtmeChjTGJsWzFdIC0gOSl9IiB3aWR0aD0iJHtmeChyQm94Vyl9IiBoZWlnaHQ9IjE2IiByeD0iMyIgb3BhY2l0eT0iMC45MiIvPgogICAgICAgIDx0ZXh0IGNsYXNzPSJ3ei1kaW10eHQiIHg9IiR7ZngoY0xibFswXSl9IiB5PSIke2Z4KGNMYmxbMV0gKyAxKX0iPiR7clR4dH08L3RleHQ+YDsKICBjb25zdCBleEluID0gaW5UaXAoUmMpOwogIHMgKz0gZGltVihpZCwgUC5zeChleEluWzBdKSAtIDgsIFAuc3kob25DKFJjLEEpWzFdKSAtIFIqUC5zY2FsZSwgUC5zeShvbkMoUmMsQSlbMV0pICsgUipQLnNjYWxlLCAn4oyAICcgKyBkZShvLm9kKSwgeyBleHQ6IFAuc3goZXhJblswXSkgfSk7CiAgcyArPSBkaW1IKGlkLCBQLnN4KGluVGlwKFJjKVswXSksIFAuc3gob25DKFJjLEEpWzBdKSwgUC5zeShvbkMoUmMsQSlbMV0pICsgUipQLnNjYWxlICsgMjQsIChvLmxlbmd0aExhYmVsIHx8ICdMMycpICsgJyAnICsgKG8ucHJvdkRpbXMgPyAnZm9sZ3QnIDogZGUoby5sZW5ndGgpKSwgeyBleHQ6IFAuc3kob25DKFJjLEEpWzFdICsgUikgfSk7CiAgaWYgKG8ub3ZlcmFsbExlbmd0aCAhPSBudWxsICYmIG8ub3ZlcmFsbExlbmd0aExhYmVsKSB7CiAgICBjb25zdCB4MSA9IFAuc3goaW5UaXAoUmMpWzBdKSwgeDIgPSB4MSArIG8ub3ZlcmFsbExlbmd0aCAqIFAuc2NhbGU7CiAgICBzICs9IGRpbUgoaWQsIHgxLCB4MiwgUC5zeShvbkMoUmMsQSlbMV0pICsgUipQLnNjYWxlICsgNDgsIG8ub3ZlcmFsbExlbmd0aExhYmVsICsgJyAnICsgZGUoby5vdmVyYWxsTGVuZ3RoKSwgeyBleHQ6IFAuc3kob25DKFJjLEEpWzFdICsgUikgfSk7CiAgfQogIHMgKz0gYDxyZWN0IGNsYXNzPSJ3ei1iYWRnZS1iZyIgeD0iJHtmeCh2dy8yLTcyKX0iIHk9IjE0IiB3aWR0aD0iMTQ0IiBoZWlnaHQ9IjIwIiByeD0iMTAiLz4KICAgICAgICA8dGV4dCBjbGFzcz0id3otYmFkZ2UtdHgiIHg9IiR7ZngodncvMil9IiB5PSIyOCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+Qm9nZW4gJHtkZWd9wrAgwrcgRE4gJHtvLmRufSDCtyBESU4gMTE4NjU8L3RleHQ+YDsKICByZXR1cm4gd3JhcFN2ZyhpZCwgdncsIHZoLCBvLmdDb2wsIHMsIGxlZ2VuZEJveChpZCwgdncsIHZoLCBvLCAnTMOkbmdzc2Nobml0dCAoQm9nZW4gJyArIGRlZyArICfCsCknKSk7Cn0KCi8qIC0tIDMpIFQtU3R1ZWNrIChnbGVpY2ggLyByZWR1emllcnQsIERJTiAxMTg2NSkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KZnVuY3Rpb24gZHJhd1RzdHVlY2sobywgdncsIHZoKSB7CiAgY29uc3QgUiA9IG8ub2RSLCByaSA9IG8uaW5uUiwgTCA9IG8ubGVuZ3RoOwogIGNvbnN0IGJSID0gby5icmFuY2hPZCAvIDIsIGJyaSA9IE1hdGgubWF4KDAuNSwgYlIgLSBvLndhbGwpOwogIC8qIERpZSBBYmdhbmdzbGFlbmdlIGlzdCBpbiBCRUlERU4gQmF1Zm9ybWVuIGVpbiBlY2h0ZXMgTWFzcyBhdXMgZGVyIEt1bmRlbnRhYmVsbGUKICAgKiAoRm9ybSBUOiBTcGFsdGUgTDIsIEZvcm0gVEs6IFNwYWx0ZSBMMSAtIEJlcm5kIDI3LjA3LjIwMjYpLiBvLmJyYW5jaExlbmd0aCBtaXNzdAogICAqIGFiIExhdWYtTWl0dGVsbGluaWU7IGdlemVpY2huZXQgd2lyZCBkaWUgSG9laGUgdWViZXIgZGVyIExhdWZrb250dXIuIERpZSBmcnVlaGVyCiAgICogZnVlciBUSyB2ZXJ3ZW5kZXRlIFNjaGFldHpsYWVuZ2UgKG9kKjAsNyBiencuIEwqMCwyMikgZW50ZmFlbGx0IGRhbWl0LiAqLwogIGNvbnN0IGJMID0gby5icmFuY2hMZW5ndGggIT0gbnVsbCA\\\/IE1hdGgubWF4KDEsIG8uYnJhbmNoTGVuZ3RoIC0gUikgOiBNYXRoLm1heChvLm9kLCBMICogMC40Mik7CiAgY29uc3QgeGMgPSBMIC8gMjsKICBjb25zdCBvdXRlciA9IFsgWzAsLVJdLCBbeGMtYlIsLVJdLCBbeGMtYlIsLVItYkxdLCBbeGMrYlIsLVItYkxdLCBbeGMrYlIsLVJdLCBbTCwtUl0sIFtMLFJdLCBbMCxSXSBdOwogIGNvbnN0IGJvcmUgID0gWyBbMCwtcmldLCBbeGMtYnJpLC1yaV0sIFt4Yy1icmksLVItYkxdLCBbeGMrYnJpLC1SLWJMXSwgW3hjK2JyaSwtcmldLCBbTCwtcmldLCBbTCxyaV0sIFswLHJpXSBdOwogIGNvbnN0IFAgPSBtYWtlUHJvaigwLCBMLCAtUiAtIGJMIC0gNiwgUiArIDYsIHZ3LCB2aCwgeyBsOjU4LCByOjY0LCB0OjgwLCBiOjY2IH0pOwogIGNvbnN0IGlkID0gdWlkKCk7IGNvbnN0IHByID0gYSA9PiBhLm1hcChwID0+IFAocFswXSwgcFsxXSkpOwogIGxldCBzID0gJyc7CiAgcyArPSBgPHBhdGggY2xhc3M9Ind6LWJvcmUiIGQ9IiR7cGF0aEZyb20ocHIoYm9yZSkpfSBaIi8+YDsKICBzICs9IGA8cGF0aCBjbGFzcz0id3otaGF0Y2giIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iJHtwYXRoRnJvbShwcihvdXRlcikpfSBaICR7cGF0aEZyb20ocHIoYm9yZSkpfSBaIi8+YDsKICBzICs9IGA8bGluZSBjbGFzcz0id3otY2VudGVyIiB4MT0iJHtmeChQLnN4KDApLTEwKX0iIHkxPSIke2Z4KFAuc3koMCkpfSIgeDI9IiR7ZngoUC5zeChMKSsxMCl9IiB5Mj0iJHtmeChQLnN5KDApKX0iLz5gOwogIHMgKz0gYDxsaW5lIGNsYXNzPSJ3ei1jZW50ZXIiIHgxPSIke2Z4KFAuc3goeGMpKX0iIHkxPSIke2Z4KFAuc3koLVItYkwpLTEwKX0iIHgyPSIke2Z4KFAuc3goeGMpKX0iIHkyPSIke2Z4KFAuc3koUikpfSIvPmA7CiAgLy8gQmVybmQgMjcuMDcuMjAyNjogRGFzIExhdWZtYXNzIGhlaXNzdCBudXIgbm9jaCAiTCIgKHZvcmhlciAiTGF1ZiIpLgogIHMgKz0gZGltSChpZCwgUC5zeCgwKSwgUC5zeChMKSwgUC5zeShSKSArIDI4LCAnTCAnICsgKG8ucHJvdkRpbXMgPyAnZm9sZ3QnIDogZGUoTCkpLCB7IGV4dDogUC5zeShSKSB9KTsKICAvKiBCZXJuZCAyOC4wNy4yMDI2OiBEZXIgQWJnYW5nIHN0YW1tdCBiZWkgRm9ybSBUSyBhdXMgU3BhbHRlIEwxLCB3dXJkZSBhYmVyIGF1Y2gKICAgKiBkb3J0IGFscyAiTDIiIGJlc2NocmlmdGV0IChiZWkgRE4xNSBUSyBzdGFuZCAiPkwyIDExPCIsIHdhZWhyZW5kIGRpZSBXZWlzcy1UYWJlbGxlCiAgICogaW4gU3BhbHRlIEwyIGRlbiBXZXJ0IDM1IGZ1ZWhydCkuIERhcyBLdWVyemVsIGZvbGd0IGpldHp0IGRlciBCYXVmb3JtIC0gRm9ybSBUCiAgICogYmVtYXNzdCBMMiwgRm9ybSBUSyBiZW1hc3N0IEwxLiBEZXIgV2VydCBzZWxic3QgYmxlaWJ0IHVudmVyYWVuZGVydDsgZXIga29tbXQKICAgKiB3ZWl0ZXJoaW4gYXVzIGFiZ2FuZ0wyKCkgaW4gYXBwLmpzIChGb3JtIFQ6IEwyLCBGb3JtIFRLOiBMMSkuICovCiAgY29uc3QgYWJnYW5nS3VlcnplbCA9IG8udGZvcm0gPT09ICdUSycgPyAnTDEnIDogJ0wyJzsKICBpZiAoby5icmFuY2hMZW5ndGggIT0gbnVsbCkgcyArPSBkaW1WKGlkLCBQLnN4KHhjICsgYlIpICsgMzQsIFAuc3koLW8uYnJhbmNoTGVuZ3RoKSwgUC5zeSgwKSwgYWJnYW5nS3VlcnplbCArICcgJyArIGRlKG8uYnJhbmNoTGVuZ3RoKSwgeyBleHQ6IFAuc3goeGMgKyBiUikgfSk7CiAgcyArPSBkaW1WKGlkLCBQLnN4KDApIC0gMzAsIFAuc3koLVIpLCBQLnN5KFIpLCAn4oyAICcgKyBkZShvLm9kKSwgeyBleHQ6IFAuc3goMCkgfSk7CiAgLyogQmVybmQgMjcuMDcuMjAyNjogRGVyIEFiZ2FuZ3Mt4oyAIHN0YW5kIGFscyBTRU5LUkVDSFRFUyBNYXNzIHJlY2h0cyBuZWJlbiBkZW0KICAgKiBBYmdhbmcgLSBkb3J0IG1pc3N0IGRpZSBNYXNzbGluaWUgYWJlciBkZXNzZW4gTGFlbmdlLCBuaWNodCBzZWluZW4gRHVyY2htZXNzZXIuCiAgICogRXIgZ2Vob2VydCBhbHMgUXVlcm1hc3MgdWViZXIgZGVuIEFiZ2FuZyAoRm9ybSBUIHdpZSBGb3JtIFQgcmVkdXppZXJ0KS4gKi8KICBzICs9IGRpbUgoaWQsIFAuc3goeGMgLSBiUiksIFAuc3goeGMgKyBiUiksIFAuc3koLVIgLSBiTCkgLSAyNiwgJ+KMgCAnICsgZGUoby5icmFuY2hPZCksIHsgZXh0OiBQLnN5KC1SIC0gYkwpIH0pOwogIC8vIFIzLTMvUjMtNDogQmF1Zm9ybSAoRm9ybSBUIC8gRm9ybSBUSykgbWl0IGltIEJhZGdlLgogIHMgKz0gYDxyZWN0IGNsYXNzPSJ3ei1iYWRnZS1iZyIgeD0iJHtmeCh2dy8yLTExNSl9IiB5PSIxNCIgd2lkdGg9IjIzMCIgaGVpZ2h0PSIyMCIgcng9IjEwIi8+CiAgICAgICAgPHRleHQgY2xhc3M9Ind6LWJhZGdlLXR4IiB4PSIke2Z4KHZ3LzIpfSIgeT0iMjgiIHRleHQtYW5jaG9yPSJtaWRkbGUiPlQtU3TDvGNrICR7by5icmFuY2hPZCA9PT0gby5vZCA\\\/ICdnbGVpY2gnIDogJ3JlZHV6aWVydCd9IMK3IEZvcm0gJHtvLnRmb3JtfSDCtyBETiAke28uZG59PC90ZXh0PmA7CiAgcmV0dXJuIHdyYXBTdmcoaWQsIHZ3LCB2aCwgby5nQ29sLCBzLCBsZWdlbmRCb3goaWQsIHZ3LCB2aCwgbywgJ0zDpG5nc3NjaG5pdHQgKFQtU3TDvGNrKScpKTsKfQoKLyogLS0gNCkgUmVkdXppZXJ1bmcgKGtvbnplbnRyaXNjaCAvIGV4emVudHJpc2NoLCBESU4gMTE4NjUpIC0tLS0tLS0tLS0tLS0tLSAqLwpmdW5jdGlvbiBkcmF3UmVkdXppZXJ1bmcobywgdncsIHZoKSB7CiAgY29uc3QgUiA9IG8ub2RSLCByaSA9IG8uaW5uUiwgTCA9IG8ubGVuZ3RoOwogIGNvbnN0IFIyID0gby5vZDIgLyAyLCByaTIgPSBNYXRoLm1heCgwLjUsIFIyIC0gby53YWxsMik7CiAgY29uc3QgZWNjID0gISFvLmVjY2VudHJpYywgb2ZmID0gZWNjID8gKFIgLSBSMikgOiAwOwogIGNvbnN0IG91dGVyID0gWyBbMCwtUl0sIFtMLC1SMitvZmZdLCBbTCxSMitvZmZdLCBbMCxSXSBdOwogIGNvbnN0IGJvcmUgID0gWyBbMCwtcmldLCBbTCwtcmkyK29mZl0sIFtMLHJpMitvZmZdLCBbMCxyaV0gXTsKICBjb25zdCBQID0gbWFrZVByb2ooMCwgTCwgLVIgLSA2LCBSICsgNiwgdncsIHZoLCB7IGw6NTgsIHI6NjQsIHQ6NDYsIGI6NjIgfSk7CiAgY29uc3QgaWQgPSB1aWQoKTsgY29uc3QgcHIgPSBhID0+IGEubWFwKHAgPT4gUChwWzBdLCBwWzFdKSk7CiAgbGV0IHMgPSAnJzsKICBzICs9IGA8cGF0aCBjbGFzcz0id3otYm9yZSIgZD0iJHtwYXRoRnJvbShwcihib3JlKSl9IFoiLz5gOwogIHMgKz0gYDxwYXRoIGNsYXNzPSJ3ei1oYXRjaCIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSIke3BhdGhGcm9tKHByKG91dGVyKSl9IFogJHtwYXRoRnJvbShwcihib3JlKSl9IFoiLz5gOwogIHMgKz0gYDxsaW5lIGNsYXNzPSJ3ei1jZW50ZXIiIHgxPSIke2Z4KFAuc3goMCktMTApfSIgeTE9IiR7ZngoUC5zeSgwKSl9IiB4Mj0iJHtmeChQLnN4KEwpKzEwKX0iIHkyPSIke2Z4KFAuc3koZWNjID8gb2ZmIDogMCkpfSIvPmA7CiAgcyArPSBkaW1IKGlkLCBQLnN4KDApLCBQLnN4KEwpLCBQLnN5KFIpICsgMjYsICdMICcgKyAoby5wcm92RGltcyA\\\/ICdmb2xndCcgOiBkZShMKSksIHsgZXh0OiBQLnN5KFIpIH0pOwogIHMgKz0gZGltVihpZCwgUC5zeCgwKSAtIDMwLCBQLnN5KC1SKSwgUC5zeShSKSwgJ+KMgCAnICsgZGUoby5vZCksIHsgZXh0OiBQLnN4KDApIH0pOwogIHMgKz0gZGltVihpZCwgUC5zeChMKSArIDM0LCBQLnN5KC1SMiArIG9mZiksIFAuc3koUjIgKyBvZmYpLCAn4oyAICcgKyAoby5vZDJQcm92ID8gZGUoby5vZDIpIDogJ2ZvbGd0JyksIHsgZXh0OiBQLnN4KEwpIH0pOwogIC8vIFIzLTI6IEJhdWZvcm0tS8O8cnplbCBGb3JtIFJLIChrb256ZW50cmlzY2gpIC8gRm9ybSBSRSAoZXh6ZW50cmlzY2gpIGluIGRlciBaZWljaG51bmcuCiAgY29uc3QgcmVkRm9ybSA9IGVjYyA\\\/ICdleHplbnRyaXNjaCAoRm9ybSBSRSknIDogJ2tvbnplbnRyaXNjaCAoRm9ybSBSSyknOwogIHMgKz0gYDxyZWN0IGNsYXNzPSJ3ei1iYWRnZS1iZyIgeD0iJHtmeCh2dy8yLTEyMCl9IiB5PSIxNCIgd2lkdGg9IjI0MCIgaGVpZ2h0PSIyMCIgcng9IjEwIi8+CiAgICAgICAgPHRleHQgY2xhc3M9Ind6LWJhZGdlLXR4IiB4PSIke2Z4KHZ3LzIpfSIgeT0iMjgiIHRleHQtYW5jaG9yPSJtaWRkbGUiPlJlZHV6aWVydW5nICR7cmVkRm9ybX0gwrcgJHtkZShvLm9kKX3ihpIke28ub2QyUHJvdiA\\\/IGRlKG8ub2QyKSA6ICdmb2xndCd9PC90ZXh0PmA7CiAgcmV0dXJuIHdyYXBTdmcoaWQsIHZ3LCB2aCwgby5nQ29sLCBzLCBsZWdlbmRCb3goaWQsIHZ3LCB2aCwgbywgJ0zDpG5nc3NjaG5pdHQgKFJlZHV6aWVydW5nKScpKTsKfQoKLyogLS0gNSkgS2xhbW1lciAvIFNwYW5ucmluZyAoRnJvbnRhbnNpY2h0LCBESU4gMzI2NzYpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBSdW5kZSA3IChXLTA1OSk6IGVjaHRlIE1hc3N6ZWljaG51bmcgbmFjaCBkZW4gZ2VsaWVmZXJ0ZW4gV2Vpc3MtVm9ybGFnZW4KICogKE1hc3N6ZWljaG51bmcgS0wxL0tMSC9LTExJLnN2ZywgMjIuMDcuMjAyNikuIEJlbWFzc3Qgd2VyZGVuIG51ciBiZWxlZ3RlCiAqIFdlcnRlOiBBID0gS2xhbW1lci1BdXNzZW4tw5ggKGtsYW1tZXJBIGF1cyAiTWFzc2UgS2xlbW1lbiwgQmxpbmRkZWNrZWwueGxzeCIpLAogKiBLbGVtbS3ijIAgPSBGbGFuc2NoLcOYIChmbGFuZ2VPZCkuIEZlaGx0IEEsIGJsZWlidCBkZXIgUGxhdHpoYWx0ZXIuCiAqIEtsYW1tZXJ0eXBlbiAoYmVsZWd0LCBCZXJuZCBSMi00KTogS0wxID0gMSBHZWxlbmsvMSBQaW4sIEtMTEkgPSAxIEdlbGVuay8KICogMiBQaW5zLCBLTEggPSBIb2NoZHJ1Y2trbGFtbWVyLCB6d2VpIEhhbGJzY2hhbGVuIG1pdCAyIEdlbGVua2VuLgogKiBNdXR0ZXIgKGJlbGVndCwgUjItNCk6IE0gPSBGbHVlZ2VsbXV0dGVyIChTdGFuZGFyZCksIFMgPSBTZWNoc2thbnRtdXR0ZXIuICovCmZ1bmN0aW9uIGRyYXdLbGFtbWVyKG8sIHZ3LCB2aCkgewogIGlmICghcG9zaXRpdmUoby5rbGFtbWVyQSkgfHwgIXBvc2l0aXZlKG8uZmxhbmdlT2QpIHx8IG8ua2xhbW1lckEgPD0gby5mbGFuZ2VPZCkgewogICAgcmV0dXJuIGRyYXdQbGF0emhhbHRlcihvLCB2dywgdmgpOwogIH0KICBjb25zdCByT3V0ID0gby5rbGFtbWVyQSAvIDIsIGZSID0gby5mbGFuZ2VPZCAvIDI7CiAgY29uc3QgYmFuZCA9IHJPdXQgLSBmUjsKICBjb25zdCBleHQgPSByT3V0ICsgMTQ7ICAgICAgICAgICAgICAgICAgICAvLyBSYW5kIGZ1ZXIgVmVyc2NobHVzcy9HZWxlbmsgb2Jlbit1bnRlbgogIGNvbnN0IFAgPSBtYWtlUHJvaigtZXh0LCBleHQsIC1leHQsIGV4dCwgdncsIHZoLCB7IGw6NzAsIHI6NTYsIHQ6NDQsIGI6ODYgfSk7CiAgY29uc3QgaWQgPSB1aWQoKTsKICBjb25zdCBjID0gUCgwLCAwKSwgc2MgPSBQLnNjYWxlOwogIGxldCBzID0gJyc7CiAgLy8gS2xhbW1lcmJhbmQgKFZvbGxyaW5nKSArIElubmVua2FudGUgYW0gS2xlbW0t4oyACiAgcyArPSBgPGNpcmNsZSBjeD0iJHtmeChjWzBdKX0iIGN5PSIke2Z4KGNbMV0pfSIgcj0iJHtmeCgoZlIgKyBiYW5kIC8gMikgKiBzYyl9IiBmaWxsPSJub25lIiBzdHJva2U9InZhcigtLXd6LWNsYW1wLCNjOWNlZDQpIiBzdHJva2Utd2lkdGg9IiR7ZngoYmFuZCAqIHNjKX0iLz5gOwogIHMgKz0gYDxjaXJjbGUgY3g9IiR7ZngoY1swXSl9IiBjeT0iJHtmeChjWzFdKX0iIHI9IiR7Zngock91dCAqIHNjKX0iIGNsYXNzPSJ3ei1lZGdlIi8+YDsKICBzICs9IGA8Y2lyY2xlIGN4PSIke2Z4KGNbMF0pfSIgY3k9IiR7ZngoY1sxXSl9IiByPSIke2Z4KGZSICogc2MpfSIgY2xhc3M9Ind6LWVkZ2UiLz5gOwogIC8vIEtMSDogendlaSBIYWxic2NoYWxlbiAtPiBUcmVubmZ1Z2VuIGxpbmtzL3JlY2h0cyAoZXJnaWJ0IGRpZSAyIEdlbGVua2UpCiAgaWYgKG8ua2xhbW1lclR5cCA9PT0gJ0tMSCcpIHsKICAgIFstMSwgMV0uZm9yRWFjaChzaWRlID0+IHsKICAgICAgcyArPSBgPGxpbmUgY2xhc3M9Ind6LWVkZ2UiIHgxPSIke2Z4KGNbMF0gKyBzaWRlICogZlIgKiBzYyl9IiB5MT0iJHtmeChjWzFdKX0iIHgyPSIke2Z4KGNbMF0gKyBzaWRlICogck91dCAqIHNjKX0iIHkyPSIke2Z4KGNbMV0pfSIgc3Ryb2tlLXdpZHRoPSIyIi8+YDsKICAgIH0pOwogIH0KICAvKiBWZXJzY2hsdXNzOiBMYXNjaGUgKyBNdXR0ZXIgKE0gPSBGbHVlZ2VsbXV0dGVyLCBTID0gU2VjaHNrYW50bXV0dGVyKS4KICAgKiBzZ24gPSAtMSB6ZWljaG5ldCBuYWNoIG9iZW4sIHNnbiA9ICsxIGV4YWt0IGdlc3BpZWdlbHQgbmFjaCB1bnRlbi4gKi8KICBjb25zdCB2ZXJzY2hsdXNzID0gKHlFZGdlLCBzZ24pID0+IHsKICAgIGxldCB0ID0gYDxyZWN0IGNsYXNzPSJ3ei1jbGFtcCIgeD0iJHtmeChjWzBdIC0gNyl9IiB5PSIke2Z4KHNnbiA8IDAgPyB5RWRnZSAtIDEzIDogeUVkZ2UgLSA0KX0iIHdpZHRoPSIxNCIgaGVpZ2h0PSIxNyIgcng9IjIiLz5gOwogICAgaWYgKG8ua2xhbW1lck11dHRlciA9PT0gJ1MnKSB7CiAgICAgIHJldHVybiB0ICsgYDxwb2x5Z29uIGNsYXNzPSJ3ei1jbGFtcCIgcG9pbnRzPSIke3BvbHkoWwogICAgICAgIFtjWzBdIC0gNywgeUVkZ2UgKyBzZ24gKiAxNV0sIFtjWzBdIC0gMy41LCB5RWRnZSArIHNnbiAqIDIyXSwgW2NbMF0gKyAzLjUsIHlFZGdlICsgc2duICogMjJdLAogICAgICAgIFtjWzBdICsgNywgeUVkZ2UgKyBzZ24gKiAxNV0sIFtjWzBdICsgMy41LCB5RWRnZSArIHNnbiAqIDhdLCBbY1swXSAtIDMuNSwgeUVkZ2UgKyBzZ24gKiA4XV0pfSIvPmA7CiAgICB9CiAgICBjb25zdCBleSA9IHlFZGdlICsgc2duICogMTYsIG55ID0geUVkZ2UgKyBzZ24gKiAxNTsKICAgIHJldHVybiB0ICsKICAgICAgYDxlbGxpcHNlIGNsYXNzPSJ3ei1jbGFtcCIgY3g9IiR7ZngoY1swXSAtIDkpfSIgY3k9IiR7ZngoZXkpfSIgcng9IjciIHJ5PSIzLjQiIHRyYW5zZm9ybT0icm90YXRlKCR7Zngoc2duICogLTI0KX0gJHtmeChjWzBdIC0gOSl9ICR7ZngoZXkpfSkiLz5gICsKICAgICAgYDxlbGxpcHNlIGNsYXNzPSJ3ei1jbGFtcCIgY3g9IiR7ZngoY1swXSArIDkpfSIgY3k9IiR7ZngoZXkpfSIgcng9IjciIHJ5PSIzLjQiIHRyYW5zZm9ybT0icm90YXRlKCR7Zngoc2duICogMjQpfSAke2Z4KGNbMF0gKyA5KX0gJHtmeChleSl9KSIvPmAgKwogICAgICBgPGNpcmNsZSBjbGFzcz0id3otY2xhbXAiIGN4PSIke2Z4KGNbMF0pfSIgY3k9IiR7ZngobnkpfSIgcj0iNC41Ii8+YDsKICB9OwogIGNvbnN0IHRvcFkgPSBjWzFdIC0gck91dCAqIHNjLCBib3RZID0gY1sxXSArIHJPdXQgKiBzYzsKICBzICs9IHZlcnNjaGx1c3ModG9wWSwgLTEpOwogIGlmIChvLmtsYW1tZXJUeXAgPT09ICdLTEgnKSB7CiAgICAvKiBCZXJuZCAyNy4wNy4yMDI2OiBEaWUgS0xIIGJlc3RlaHQgYXVzIHp3ZWkgSGFsYnNjaGFsZW4gbWl0IFpXRUkgbG9lc2JhcmVuCiAgICAgKiBWZXJiaW5kdW5nZW4uIFNpZSBiZWtvbW10IGRlc2hhbGIgdW50ZW4gZGVuc2VsYmVuIFZlcnNjaGx1c3Mgd2llIG9iZW4sCiAgICAgKiBnZXNwaWVnZWx0IC0gbmljaHQgZGFzIGVpbnplbG5lIEdlbGVuayBkZXIgS0wxLiAqLwogICAgcyArPSB2ZXJzY2hsdXNzKGJvdFksIDEpOwogIH0gZWxzZSB7CiAgICAvLyBHZWxlbmsgdW50ZW46IEtMMSBlaW4gUGluLCBLTExJIHp3ZWkgUGlucwogICAgcyArPSBgPHJlY3QgY2xhc3M9Ind6LWNsYW1wIiB4PSIke2Z4KGNbMF0gLSA3KX0iIHk9IiR7ZngoYm90WSAtIDQpfSIgd2lkdGg9IjE0IiBoZWlnaHQ9IjgiIHJ4PSIyIi8+YDsKICAgIGlmIChvLmtsYW1tZXJUeXAgPT09ICdLTExJJykgewogICAgICBzICs9IGA8Y2lyY2xlIGNsYXNzPSJ3ei1jbGFtcCIgY3g9IiR7ZngoY1swXSAtIDUpfSIgY3k9IiR7ZngoYm90WSArIDcpfSIgcj0iMy40Ii8+YDsKICAgICAgcyArPSBgPGNpcmNsZSBjbGFzcz0id3otY2xhbXAiIGN4PSIke2Z4KGNbMF0gKyA1KX0iIGN5PSIke2Z4KGJvdFkgKyA3KX0iIHI9IjMuNCIvPmA7CiAgICB9IGVsc2UgewogICAgICBzICs9IGA8Y2lyY2xlIGNsYXNzPSJ3ei1jbGFtcCIgY3g9IiR7ZngoY1swXSl9IiBjeT0iJHtmeChib3RZICsgNyl9IiByPSI0Ii8+YDsKICAgIH0KICB9CiAgLy8gQmVtYXNzdW5nOiBLbGVtbS3ijIAgKEZsYW5zY2gpIGxpbmtzLCBBIChBdXNzZW4t4oyAKSB1bnRlbiAtIHdpZSBpbiBkZXIgVm9ybGFnZS4KICBzICs9IGRpbVZSb3QoaWQsIGNbMF0gLSByT3V0ICogc2MgLSAyNCwgY1sxXSAtIGZSICogc2MsIGNbMV0gKyBmUiAqIHNjLCAn4oyAICcgKyBkZShvLmZsYW5nZU9kKSwgeyBleHQ6IGNbMF0gfSk7CiAgLy8gQmVpIGRlciBLTEggc2l0enQgdW50ZW4gamV0enQgZGVyIGdlc3BpZWdlbHRlIFZlcnNjaGx1c3MgLT4gQS1NYXNzIGV0d2FzIHRpZWZlci4KICBzICs9IGRpbUgoaWQsIGNbMF0gLSByT3V0ICogc2MsIGNbMF0gKyByT3V0ICogc2MsIGJvdFkgKyAoby5rbGFtbWVyVHlwID09PSAnS0xIJyA\\\/IDQ4IDogNDApLCAnQSDijIAgJyArIGRlKG8ua2xhbW1lckEpLCB7IGV4dDogY1sxXSArIHJPdXQgKiBzYyB9KTsKICBzICs9IGZpdHRpbmdCYWRnZSh2dywgJ0tsYW1tZXIgJyArIG8ua2xhbW1lclR5cCArICcgwrcgS2xlbW0t4oyAICcgKyBkZShvLmZsYW5nZU9kKSArICcgwrcgRElOIDMyNjc2Jyk7CiAgcmV0dXJuIHdyYXBTdmcoaWQsIHZ3LCB2aCwgby5nQ29sLCBzLCBsZWdlbmRCb3goaWQsIHZ3LCB2aCwgbywgJ0Zyb250YW5zaWNodCAoS2xhbW1lciAnICsgby5rbGFtbWVyVHlwICsgJyknKSk7Cn0KCi8qIC0tIDViKSBCbGluZGRlY2tlbCAoU2VpdGVuYW5zaWNodCwgRElOIDMyNjc2KSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIFJ1bmRlIDcgKFctMDU5KTogZWNodGUgTWFzc3plaWNobnVuZyBuYWNoIE1hc3N6ZWljaG51bmcgQmxpbmRkZWNrZWwuc3ZnCiAqICgyMi4wNy4yMDI2KS4gQmVsZWd0ZSBNYXNzZTogQSA9IEZsYW5zY2gtw5ggKGZsYW5nZU9kKSwgTCA9IERlY2tlbHN0YWVya2UKICogKGxlbmd0aCBhdXMgIk1hc3NlIEtsZW1tZW4sIEJsaW5kZGVja2VsLnhsc3giKS4gT2huZSBiZWxlZ3RlIERlY2tlbHN0YWVya2UKICogKDI4NiwxLzMxOS8zMzgpIGJsZWlidCBkZXIgUGxhdHpoYWx0ZXIgLSBlcyB3aXJkIGtlaW5lIERpY2tlIGdlcmF0ZW4uICovCmZ1bmN0aW9uIGRyYXdCbGluZGRlY2tlbChvLCB2dywgdmgpIHsKICBpZiAoIXBvc2l0aXZlKG8uZmxhbmdlT2QpIHx8ICFwb3NpdGl2ZShvLmxlbmd0aCkpIHJldHVybiBkcmF3UGxhdHpoYWx0ZXIobywgdncsIHZoKTsKICBjb25zdCBBID0gby5mbGFuZ2VPZCwgTCA9IG8ubGVuZ3RoLCByID0gQSAvIDI7CiAgY29uc3QgUCA9IG1ha2VQcm9qKDAsIEwsIC1yLCByLCB2dywgdmgsIHsgbDo3OCwgcjo1NiwgdDo0NCwgYjo3NiB9KTsKICBjb25zdCBpZCA9IHVpZCgpOwogIGxldCBzID0gJyc7CiAgLy8gR2VzY2hsb3NzZW5lIFNjaGVpYmUgaW0gVm9sbHNjaG5pdHQgKyBTdGlybnNlaXRlIHVuZCBNaXR0ZWxsaW5pZQogIHMgKz0gYDxyZWN0IGNsYXNzPSJ3ei1oYXRjaCIgeD0iJHtmeChQLnN4KDApKX0iIHk9IiR7ZngoUC5zeSgtcikpfSIgd2lkdGg9IiR7ZngoTCAqIFAuc2NhbGUpfSIgaGVpZ2h0PSIke2Z4KEEgKiBQLnNjYWxlKX0iLz5gOwogIHMgKz0gYDxsaW5lIGNsYXNzPSJ3ei1lZGdlIiB4MT0iJHtmeChQLnN4KEwpKX0iIHkxPSIke2Z4KFAuc3koLXIpKX0iIHgyPSIke2Z4KFAuc3goTCkpfSIgeTI9IiR7ZngoUC5zeShyKSl9IiBzdHJva2Utd2lkdGg9IjEuNiIvPmA7CiAgcyArPSBgPGxpbmUgY2xhc3M9Ind6LWNlbnRlciIgeDE9IiR7ZngoUC5zeCgwKSAtIDEwKX0iIHkxPSIke2Z4KFAuc3koMCkpfSIgeDI9IiR7ZngoUC5zeChMKSArIDEwKX0iIHkyPSIke2Z4KFAuc3koMCkpfSIvPmA7CiAgLy8gQmVtYXNzdW5nOiBBIChGbGFuc2NoLeKMgCkgbGlua3MgdmVydGlrYWwsIEwgKERlY2tlbHN0YWVya2UpIHVudGVuIC0gd2llIGluIGRlciBWb3JsYWdlLgogIHMgKz0gZGltVlJvdChpZCwgUC5zeCgwKSAtIDM0LCBQLnN5KC1yKSwgUC5zeShyKSwgJ0Eg4oyAICcgKyBkZShBKSwgeyBleHQ6IFAuc3goMCkgfSk7CiAgcyArPSBkaW1IKGlkLCBQLnN4KDApLCBQLnN4KEwpLCBQLnN5KHIpICsgMzIsICdMICcgKyBkZShMKSwgeyBleHQ6IFAuc3kocikgfSk7CiAgcyArPSBmaXR0aW5nQmFkZ2UodncsICdCbGluZGRlY2tlbCDCtyBGbGFuc2NoLeKMgCAnICsgZGUoQSkgKyAnIMK3IERJTiAzMjY3NicpOwogIHJldHVybiB3cmFwU3ZnKGlkLCB2dywgdmgsIG8uZ0NvbCwgcywgbGVnZW5kQm94KGlkLCB2dywgdmgsIG8sICdTZWl0ZW5hbnNpY2h0IChCbGluZGRlY2tlbCknKSk7Cn0KCi8qIC0tIDYpIENvbm5lY3QtRmxhbnNjaCAoQ0YpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogVmVyYmluZGxpY2hlIFBhcmFtZXRlcjogRGU9by5vZCwgRGk9by5pbm5lckRpYW1ldGVyLCBEZj1vLmZsYW5nZU9kLCBMPW8ubGVuZ3RoLgogKiBCZXJuZCAyNy4wNy4yMDI2OiBEaWUgZnJ1ZWhlcmVuIFNjaHJhdWJlbi0sIEtsZW1tLSB1bmQgUHVua3RkZXRhaWxzIHNpbmQKICogZW50ZmFsbGVuICgiZGllIERldGFpbHMgaW4gZGVpbmVyIFNraXp6ZSB2ZXJ3aXJyZW4gZWhlciAtIGtlZXAgaXQgc2ltcGxlIikuCiAqIEdlemVpY2huZXQgd2lyZCBqZXR6dCBlaW5lIGVpbmZhY2hlLCBzeW1tZXRyaXNjaGUgU2Nobml0dGZvcm06IEFuc2F0eiBtaXQgZGVtCiAqIEZsYW5zY2gt4oyAIERmLCBrb25pc2NoZXIgVWViZXJnYW5nIGF1ZiBkZW4gQXVzc2VuLeKMgCBEZSB1ZWJlciBkaWUgSG9laGUgTCwKICogZHVyY2hnZWhlbmRlIEJvaHJ1bmcgRGkuIEJlbWFzc3Qgd2VyZGVuIGF1c3NjaGxpZXNzbGljaCBkaWVzZSB2aWVyIFdlcnRlOwogKiBkaWUgSG9laGUgZGVzIEFuc2F0emVzIGlzdCBzY2hlbWF0aXNjaCB1bmQgdHJhZWd0IGRlc2hhbGIga2VpbmUgTWFzc3phaGwuICovCmZ1bmN0aW9uIGRyYXdDb25uZWN0ZmxhbnNjaChvLCB2dywgdmgpIHsKICBjb25zdCBEZSA9IG8ub2QsIERpID0gby5pbm5lckRpYW1ldGVyLCBEZiA9IG8uZmxhbmdlT2QsIEwgPSBvLmxlbmd0aDsKICBjb25zdCByRGUgPSBEZSAvIDIsIHJEaSA9IERpIC8gMiwgckRmID0gRGYgLyAyOwogIGNvbnN0IGJvc3NIID0gTWF0aC5tYXgoTCAqIDEuMiwgRGYgKiAwLjU1KTsKICBjb25zdCB0b3AgPSAtTCAtIGJvc3NIOwogIGNvbnN0IFAgPSBtYWtlUHJvaigtckRlLCByRGUsIHRvcCwgMCwgdncsIHZoLCB7IGw6ODgsIHI6OTQsIHQ6NjQsIGI6OTIgfSk7CiAgY29uc3QgaWQgPSB1aWQoKTsKCiAgY29uc3Qgb3V0ZXIgPSBbUCgtckRmLCB0b3ApLCBQKHJEZiwgdG9wKSwgUChyRGYsIC1MKSwgUChyRGUsIDApLCBQKC1yRGUsIDApLCBQKC1yRGYsIC1MKV07CiAgY29uc3QgYm9yZSA9IFtQKC1yRGksIHRvcCksIFAockRpLCB0b3ApLCBQKHJEaSwgMCksIFAoLXJEaSwgMCldOwogIGxldCBzID0gJyc7CiAgcyArPSBgPHBhdGggY2xhc3M9Ind6LWJvcmUiIGQ9IiR7cGF0aEZyb20oYm9yZSl9IFoiLz5gOwogIHMgKz0gYDxwYXRoIGNsYXNzPSJ3ei1oYXRjaCIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSIke3BhdGhGcm9tKG91dGVyKX0gWiAke3BhdGhGcm9tKGJvcmUpfSBaIi8+YDsKICBzICs9IGA8bGluZSBjbGFzcz0id3otY2VudGVyIiB4MT0iJHtmeChQLnN4KDApKX0iIHkxPSIke2Z4KFAuc3kodG9wKSAtIDEyKX0iIHgyPSIke2Z4KFAuc3goMCkpfSIgeTI9IiR7ZngoUC5zeSgwKSArIDEyKX0iLz5gOwoKICBzICs9IGRpbUgoaWQsIFAuc3goLXJEZiksIFAuc3gockRmKSwgUC5zeSh0b3ApIC0gMjQsICdEZiAnICsgZGUoRGYpLCB7IGV4dDogUC5zeSh0b3ApIH0pOwogIHMgKz0gZGltSChpZCwgUC5zeCgtckRpKSwgUC5zeChyRGkpLCBQLnN5KDApICsgMjYsICdEaSAnICsgZGUoRGkpLCB7IGV4dDogUC5zeSgwKSB9KTsKICBzICs9IGRpbUgoaWQsIFAuc3goLXJEZSksIFAuc3gockRlKSwgUC5zeSgwKSArIDUyLCAnRGUgJyArIGRlKERlKSwgeyBleHQ6IFAuc3koMCkgfSk7CiAgcyArPSBkaW1WKGlkLCBQLnN4KHJEZSkgKyAzNiwgUC5zeSgtTCksIFAuc3koMCksICdMICcgKyBkZShMKSwgeyBleHQ6IFAuc3gockRlKSB9KTsKICBzICs9IGZpdHRpbmdCYWRnZSh2dywgJ0Nvbm5lY3QtRmxhbnNjaCAoQ0YpIMK3ICcgKyBzaXplTGFiZWwobykpOwogIHJldHVybiB3cmFwU3ZnKGlkLCB2dywgdmgsIG8uZ0NvbCwgcywKICAgIGxlZ2VuZEJveChpZCwgdncsIHZoLCBvLCAnU2Nobml0dHNjaGVtYSAoQ29ubmVjdC1GbGFuc2NoIENGKScpKTsKfQoKLyogLS0gNykgQ29ubmVjdC1GbGFuc2NoIElubGluZSAvIENGSSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBWZXJiaW5kbGljaGUgUGFyYW1ldGVyOiBEZSwgRGksIEwsIFkgc293aWUgQW5zY2hsdXNzbWFzcyBBIChCVykgYnp3LiBUQy4KICogRGVyIG1pdHRsZXJlIFplcm8tRGVhZC1MZWctQXVmYmF1IGlzdCBlaW5lIHRlY2huaXNjaGUgU2NoZW1hZm9ybTsgc2VpbmUgbmljaHQKICogdWViZXJnZWJlbmVuIEVpbnplbG1hc3NlIHdlcmRlbiB3ZWRlciBiZXNjaHJpZnRldCBub2NoIGFscyBOb3Jtd2VydCBnZW51dHp0LiAqLwpmdW5jdGlvbiBkcmF3Q29ubmVjdGlubGluZShvLCB2dywgdmgpIHsKICBjb25zdCBEZSA9IG8ub2QsIERpID0gby5pbm5lckRpYW1ldGVyLCBMID0gby5sZW5ndGgsIFkgPSBvLmJyYW5jaEhlaWdodDsKICBjb25zdCBlbmRWYWx1ZSA9IG8uZW5kRGlhbWV0ZXIsIGlzVEMgPSBvLmVuZFR5cGUgPT09ICdUQyc7CiAgY29uc3QgdXBwZXJEZSA9IG8udXBwZXJPdXRlckRpYW1ldGVyLCB1cHBlckRpID0gby51cHBlcklubmVyRGlhbWV0ZXI7CiAgY29uc3QgckRlID0gRGUgLyAyLCByRGkgPSBEaSAvIDIsIHJFbmQgPSBpc1RDID8gZW5kVmFsdWUgLyAyIDogckRlOwogIGNvbnN0IHhjID0gTCAvIDI7CiAgY29uc3QgYmFzZUhhbGYgPSBNYXRoLm1pbihMICogMC4yNCwgTWF0aC5tYXgoMTAsIHVwcGVyRGUgKiAwLjU4KSk7CiAgY29uc3QgdXBwZXJMZWZ0ID0geGMgLSB1cHBlckRlIC8gMiwgdXBwZXJSaWdodCA9IHhjICsgdXBwZXJEZSAvIDI7CiAgY29uc3QgaW5uZXJMZWZ0ID0geGMgLSB1cHBlckRpIC8gMiwgaW5uZXJSaWdodCA9IHhjICsgdXBwZXJEaSAvIDI7CiAgY29uc3Qgc2VhbFkgPSAtWTsKICBjb25zdCBoZWFkSCA9IE1hdGgubWF4KDcsIHVwcGVyRGUgKiAwLjIpOwogIGNvbnN0IHRvcCA9IHNlYWxZIC0gaGVhZEg7CiAgY29uc3QgZmxhbmdlVCA9IGlzVEMgPyBNYXRoLm1heCgyLCBNYXRoLm1pbihMICogMC4wNDUsIERlICogMC4xMykpIDogMDsKICBjb25zdCBtaW5ZID0gTWF0aC5taW4odG9wIC0gaGVhZEggKiAwLjM4LCAtckVuZCk7CiAgY29uc3QgbWF4WSA9IE1hdGgubWF4KHJFbmQsIHJEZSk7CiAgY29uc3QgUCA9IG1ha2VQcm9qKDAsIEwsIG1pblksIG1heFksIHZ3LCB2aCwgeyBsOjEwNCwgcjo5NCwgdDo5MiwgYjo5MiB9KTsKICBjb25zdCBpZCA9IHVpZCgpOwogIGNvbnN0IHBpcGVYMCA9IGlzVEMgPyBmbGFuZ2VUIDogMCwgcGlwZVgxID0gaXNUQyA\\\/IEwgLSBmbGFuZ2VUIDogTDsKICBsZXQgcyA9ICcnOwoKICAvLyBSb2hyc2Nobml0dDogRGUgdW5kIERpIHNpbmQgZWNodGUgdWViZXJnZWJlbmUgRHVyY2htZXNzZXIuCiAgcyArPSBgPHJlY3QgY2xhc3M9Ind6LWhhdGNoIiB4PSIke2Z4KFAuc3gocGlwZVgwKSl9IiB5PSIke2Z4KFAuc3koLXJEZSkpfSIgd2lkdGg9IiR7ZngoKHBpcGVYMSAtIHBpcGVYMCkgKiBQLnNjYWxlKX0iIGhlaWdodD0iJHtmeChEZSAqIFAuc2NhbGUpfSIvPmA7CiAgcyArPSBgPHJlY3QgY2xhc3M9Ind6LWJvcmUiIHg9IiR7ZngoUC5zeChwaXBlWDApIC0gMSl9IiB5PSIke2Z4KFAuc3koLXJEaSkpfSIgd2lkdGg9IiR7ZngoKHBpcGVYMSAtIHBpcGVYMCkgKiBQLnNjYWxlICsgMil9IiBoZWlnaHQ9IiR7ZngoRGkgKiBQLnNjYWxlKX0iLz5gOwogIHMgKz0gYDxsaW5lIGNsYXNzPSJ3ei1lZGdlIiB4MT0iJHtmeChQLnN4KHBpcGVYMCkpfSIgeTE9IiR7ZngoUC5zeSgtckRpKSl9IiB4Mj0iJHtmeChQLnN4KHBpcGVYMSkpfSIgeTI9IiR7ZngoUC5zeSgtckRpKSl9Ii8+YDsKICBzICs9IGA8bGluZSBjbGFzcz0id3otZWRnZSIgeDE9IiR7ZngoUC5zeChwaXBlWDApKX0iIHkxPSIke2Z4KFAuc3kockRpKSl9IiB4Mj0iJHtmeChQLnN4KHBpcGVYMSkpfSIgeTI9IiR7ZngoUC5zeShyRGkpKX0iLz5gOwoKICBpZiAoaXNUQykgewogICAgLy8gVEMgd2lyZCBhbHMgdWViZXJnZWJlbmVyIEVuZGR1cmNobWVzc2VyIGdlemVpY2huZXQ7IEZsYW5zY2hkaWNrZSBibGVpYnQgc2NoZW1hdGlzY2guCiAgICBzICs9IGA8cmVjdCBjbGFzcz0id3otaGF0Y2giIHg9IiR7ZngoUC5zeCgwKSl9IiB5PSIke2Z4KFAuc3koLXJFbmQpKX0iIHdpZHRoPSIke2Z4KGZsYW5nZVQgKiBQLnNjYWxlKX0iIGhlaWdodD0iJHtmeCgyICogckVuZCAqIFAuc2NhbGUpfSIvPmA7CiAgICBzICs9IGA8cmVjdCBjbGFzcz0id3otaGF0Y2giIHg9IiR7ZngoUC5zeChMIC0gZmxhbmdlVCkpfSIgeT0iJHtmeChQLnN5KC1yRW5kKSl9IiB3aWR0aD0iJHtmeChmbGFuZ2VUICogUC5zY2FsZSl9IiBoZWlnaHQ9IiR7ZngoMiAqIHJFbmQgKiBQLnNjYWxlKX0iLz5gOwogICAgcyArPSBkaW1WUm90KGlkLCBQLnN4KDApIC0gNjIsIFAuc3koLXJFbmQpLCBQLnN5KHJFbmQpLCAnVEMg4oyAICcgKyBkZShlbmRWYWx1ZSksIHsgZXh0OiBQLnN4KDApIH0pOwogIH0gZWxzZSB7CiAgICAvLyBBIGlzdCBsYXV0IERhdGVuYmxhdHQgZWluIExhZW5nZW5tYXNzIGFtIEJ1dHQtV2VsZC1FbmRlLCBrZWluIER1cmNobWVzc2VyLgogICAgY29uc3QgYVggPSBNYXRoLm1pbihlbmRWYWx1ZSwgTCk7CiAgICBzICs9IGA8bGluZSBjbGFzcz0id3otZWRnZSIgeDE9IiR7ZngoUC5zeChhWCkpfSIgeTE9IiR7ZngoUC5zeSgtckRlKSl9IiB4Mj0iJHtmeChQLnN4KGFYKSl9IiB5Mj0iJHtmeChQLnN5KHJEZSkpfSIgc3Ryb2tlLWRhc2hhcnJheT0iMyAzIi8+YDsKICAgIHMgKz0gZGltSChpZCwgUC5zeCgwKSwgUC5zeChhWCksIFAuc3kockRlKSArIDI3LCAnQSAnICsgZGUoZW5kVmFsdWUpLCB7IGV4dDogUC5zeShyRGUpIH0pOwogIH0KCiAgLy8gTWl0dGxlcmVyIFplcm8tRGVhZC1MZWctQXVmYmF1LCBzY2hlbWF0aXNjaCBhbiBkZXIgRGF0ZW5ibGF0dGtvbnR1ciBvcmllbnRpZXJ0LgogIGNvbnN0IGxlZnQgPSB4YyAtIGJhc2VIYWxmLCByaWdodCA9IHhjICsgYmFzZUhhbGY7CiAgcyArPSBgPHBhdGggY2xhc3M9Ind6LWhhdGNoIiBkPSJNJHtmeChQLnN4KGxlZnQpKX0sJHtmeChQLnN5KC1yRGUpKX0KICAgIEwke2Z4KFAuc3godXBwZXJMZWZ0KSl9LCR7ZngoUC5zeShzZWFsWSkpfQogICAgTCR7ZngoUC5zeCh1cHBlclJpZ2h0KSl9LCR7ZngoUC5zeShzZWFsWSkpfQogICAgTCR7ZngoUC5zeChyaWdodCkpfSwke2Z4KFAuc3koLXJEZSkpfSBaIi8+YDsKICBzICs9IGA8cmVjdCBjbGFzcz0id3otaGF0Y2giIHg9IiR7ZngoUC5zeCh1cHBlckxlZnQpKX0iIHk9IiR7ZngoUC5zeSh0b3ApKX0iIHdpZHRoPSIke2Z4KHVwcGVyRGUgKiBQLnNjYWxlKX0iIGhlaWdodD0iJHtmeChoZWFkSCAqIFAuc2NhbGUpfSIvPmA7CiAgLy8gT2ZmZW5lciwgZ2VydW5kZXRlciBJbm5lbnJhdW06IGtlaW5lcmxlaSBuaWNodCB1ZWJlcmdlYmVuZXMgTWFzcyB3aXJkIGFuZ2VzY2hyaWViZW4uCiAgcyArPSBgPHBhdGggY2xhc3M9Ind6LWJvcmUiIGQ9Ik0ke2Z4KFAuc3goaW5uZXJMZWZ0KSl9LCR7ZngoUC5zeSh0b3ApIC0gMSl9CiAgICBMJHtmeChQLnN4KGlubmVyTGVmdCkpfSwke2Z4KFAuc3koLXJEZSAqIDAuMjIpKX0KICAgIFEke2Z4KFAuc3goeGMpKX0sJHtmeChQLnN5KHJEaSAqIDAuOTIpKX0gJHtmeChQLnN4KGlubmVyUmlnaHQpKX0sJHtmeChQLnN5KC1yRGUgKiAwLjIyKSl9CiAgICBMJHtmeChQLnN4KGlubmVyUmlnaHQpKX0sJHtmeChQLnN5KHRvcCkgLSAxKX0gWiIvPmA7CiAgcyArPSBgPHBhdGggY2xhc3M9Ind6LWVkZ2UiIGQ9Ik0ke2Z4KFAuc3goaW5uZXJMZWZ0KSl9LCR7ZngoUC5zeSh0b3ApKX0KICAgIEwke2Z4KFAuc3goaW5uZXJMZWZ0KSl9LCR7ZngoUC5zeSgtckRlICogMC4yMikpfQogICAgUSR7ZngoUC5zeCh4YykpfSwke2Z4KFAuc3kockRpICogMC45MikpfSAke2Z4KFAuc3goaW5uZXJSaWdodCkpfSwke2Z4KFAuc3koLXJEZSAqIDAuMjIpKX0KICAgIEwke2Z4KFAuc3goaW5uZXJSaWdodCkpfSwke2Z4KFAuc3kodG9wKSl9Ii8+YDsKICBbLTEsMV0uZm9yRWFjaChzaWRlID0+IHsKICAgIGNvbnN0IGJ4ID0geGMgKyBzaWRlICogdXBwZXJEZSAqIDAuNTY7CiAgICBjb25zdCBiciA9IE1hdGgubWF4KDEuOCwgdXBwZXJEZSAqIDAuMDU1KTsKICAgIHMgKz0gYDxyZWN0IGNsYXNzPSJ3ei1jbGFtcCIgeD0iJHtmeChQLnN4KGJ4IC0gYnIpKX0iIHk9IiR7ZngoUC5zeSh0b3AgKyBoZWFkSCAqIDAuMDgpKX0iIHdpZHRoPSIke2Z4KDIgKiBiciAqIFAuc2NhbGUpfSIgaGVpZ2h0PSIke2Z4KGhlYWRIICogMC44NiAqIFAuc2NhbGUpfSIgcng9IiR7ZngoYnIgKiBQLnNjYWxlICogMC4zNSl9Ii8+YDsKICAgIHMgKz0gYDxjaXJjbGUgY2xhc3M9Ind6LWNsYW1wIiBjeD0iJHtmeChQLnN4KGJ4KSl9IiBjeT0iJHtmeChQLnN5KHRvcCkpfSIgcj0iJHtmeChiciAqIFAuc2NhbGUpfSIvPmA7CiAgfSk7CiAgcyArPSBgPGxpbmUgY2xhc3M9Ind6LWNlbnRlciIgeDE9IiR7ZngoUC5zeCgwKSAtIDEwKX0iIHkxPSIke2Z4KFAuc3koMCkpfSIgeDI9IiR7ZngoUC5zeChMKSArIDEwKX0iIHkyPSIke2Z4KFAuc3koMCkpfSIvPmA7CiAgcyArPSBgPGxpbmUgY2xhc3M9Ind6LWNlbnRlciIgeDE9IiR7ZngoUC5zeCh4YykpfSIgeTE9IiR7ZngoUC5zeSh0b3ApIC0gMTApfSIgeDI9IiR7ZngoUC5zeCh4YykpfSIgeTI9IiR7ZngoUC5zeShyRGUpKX0iLz5gOwoKICBjb25zdCBsZWZ0RGltWCA9IFAuc3goMCkgLSAoaXNUQyA\\\/IDM4IDogNDIpOwogIHMgKz0gZGltVlJvdChpZCwgbGVmdERpbVgsIFAuc3koLXJEZSksIFAuc3kockRlKSwgJ0RlICcgKyBkZShEZSksIHsgZXh0OiBQLnN4KDApIH0pOwogIHMgKz0gZGltVlJvdChpZCwgUC5zeCgwKSAtIDE2LCBQLnN5KC1yRGkpLCBQLnN5KHJEaSksICdEaSAnICsgZGUoRGkpLCB7IGV4dDogUC5zeCgwKSB9KTsKICBzICs9IGRpbVZSb3QoaWQsIFAuc3gocmlnaHQpICsgMzgsIFAuc3koc2VhbFkpLCBQLnN5KDApLCAnWSAnICsgZGUoWSksIHsgZXh0OiBQLnN4KHJpZ2h0KSB9KTsKICBzICs9IGRpbUgoaWQsIFAuc3goMCksIFAuc3goTCksIFAuc3kobWF4WSkgKyA1NSwgJ0wgJyArIGRlKEwpLCB7IGV4dDogUC5zeShtYXhZKSB9KTsKICBzICs9IGRpbUgoaWQsIFAuc3godXBwZXJMZWZ0KSwgUC5zeCh1cHBlclJpZ2h0KSwgUC5zeSh0b3ApIC0gMjEsICdvYmVuIERlICcgKyBkZSh1cHBlckRlKSwgeyBleHQ6IFAuc3kodG9wKSB9KTsKICBzICs9IGRpbUgoaWQsIFAuc3goaW5uZXJMZWZ0KSwgUC5zeChpbm5lclJpZ2h0KSwgUC5zeSh0b3ApIC0gNDMsICdvYmVuIERpICcgKyBkZSh1cHBlckRpKSwgeyBleHQ6IFAuc3kodG9wKSB9KTsKICBzICs9IGZpdHRpbmdCYWRnZSh2dywgJ0Nvbm5lY3QtRmxhbnNjaCBJbmxpbmUgKENGSSkgwrcgJyArCiAgICAoaXNUQyA\\\/ICdUcmktQ2xhbXAnIDogJ0J1dHQgV2VsZCcpICsgJyDCtyAnICsgc2l6ZUxhYmVsKG8pKTsKICByZXR1cm4gd3JhcFN2ZyhpZCwgdncsIHZoLCBvLmdDb2wsIHMsCiAgICBsZWdlbmRCb3goaWQsIHZ3LCB2aCwgbywgJ1NjaG5pdHRzY2hlbWEgKENvbm5lY3QtRmxhbnNjaCBJbmxpbmUgQ0ZJKScpKTsKfQoKLyogLS0gOCkgRGljaHR1bmcgKEZyb250YW5zaWNodCArIFByb2ZpbCwgRElOIDMyNjc2KSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogUnVuZGUgNyAoVy0wNTkpOiBlY2h0ZSBaZWljaG51bmcgbmFjaCBkZW4gZ2VsaWVmZXJ0ZW4gUHJvZmlsYmlsZGVybgogKiAoIkRpY2h0dW5nIFR5cEkgb2huZSBMaXBwZS5qcGciIC8gIkRpY2h0dW5nIFR5cElJIG1pdCBMaXBwZS5qcGciLCAyMi4wNy4yMDI2KS4KICogQmVsZWd0ZSBNYXNzZSBhdXMgZGF0YS5qcyAoRElOMzI2NzYtWmVpbGVuKTogRSA9IEF1c3Nlbi3ijIAgKGdhc2tldE9kKSwKICogQyA9IElubmVuLeKMgCAoZ2Fza2V0SWQpLiBUeXAgSSA9IG9obmUgTGlwcGUsIFR5cCBJSSA9IG1pdCBMaXBwZSAoYmVsZWd0LAogKiBCZXJuZCBSMi0zKS4gRGFzIFByb2ZpbCByZWNodHMgaXN0IHNjaGVtYXRpc2NoIHVuZCB1bmJlbWFzc3Q7IGJlbWFzc3Qgd2VyZGVuCiAqIG51ciBFIHVuZCBDLiBGZWhsdCBlaW5lcyBkZXIgYmVpZGVuIE1hc3NlLCBibGVpYnQgZGVyIFBsYXR6aGFsdGVyLiAqLwpmdW5jdGlvbiBkcmF3RGljaHR1bmcobywgdncsIHZoKSB7CiAgaWYgKCFwb3NpdGl2ZShvLmdhc2tldE9kKSB8fCAhcG9zaXRpdmUoby5nYXNrZXRJZCkgfHwgby5nYXNrZXRJZCA+PSBvLmdhc2tldE9kKSB7CiAgICByZXR1cm4gZHJhd1BsYXR6aGFsdGVyKG8sIHZ3LCB2aCk7CiAgfQogIGNvbnN0IEUgPSBvLmdhc2tldE9kLCBDID0gby5nYXNrZXRJZCwgckUgPSBFIC8gMiwgckMgPSBDIC8gMjsKICBjb25zdCBsaXBwZSA9IG8uZ2Fza2V0VHlwZSA9PT0gJ0lJJzsKICAvLyBMYXlvdXQgaW4gbW06IFJpbmcgbWl0IE1pdHRlIGJlaSAoMCwwKSwgc2NoZW1hdGlzY2hlcyBQcm9maWwgcmVjaHRzIGRhbmViZW4uCiAgY29uc3QgcHJvZlcgPSAockUgLSByQykgKiAyLjIsIHByb2ZIID0gRSAqIDAuNDI7CiAgY29uc3QgcHJvZlgwID0gckUgKyBNYXRoLm1heCgxNCwgRSAqIDAuMjIpOwogIGNvbnN0IFAgPSBtYWtlUHJvaigtckUgLSA0LCBwcm9mWDAgKyBwcm9mVyArIDQsIC1yRSAtIDQsIHJFICsgNCwgdncsIHZoLCB7IGw6NTYsIHI6NTYsIHQ6NTYsIGI6NzggfSk7CiAgY29uc3QgaWQgPSB1aWQoKTsKICBjb25zdCBjID0gUCgwLCAwKSwgc2MgPSBQLnNjYWxlOwogIGxldCBzID0gJyc7CiAgLy8gUmluZyBpbiBEaWNodHVuZ3NmYXJiZSwgQm9ocnVuZyBmcmVpLCBNaXR0ZWxsaW5pZW4KICBzICs9IGA8Y2lyY2xlIGNsYXNzPSJ3ei1nYXNrZXQiIGN4PSIke2Z4KGNbMF0pfSIgY3k9IiR7ZngoY1sxXSl9IiByPSIke2Z4KHJFICogc2MpfSIvPmA7CiAgcyArPSBgPGNpcmNsZSBjbGFzcz0id3otYm9yZSIgY3g9IiR7ZngoY1swXSl9IiBjeT0iJHtmeChjWzFdKX0iIHI9IiR7ZngockMgKiBzYyl9IiBzdHJva2U9InZhcigtLXd6LWVkZ2UsIzFjMWMxYykiIHN0cm9rZS13aWR0aD0iMC44Ii8+YDsKICBzICs9IGA8bGluZSBjbGFzcz0id3otY2VudGVyIiB4MT0iJHtmeChjWzBdIC0gckUgKiBzYyAtIDgpfSIgeTE9IiR7ZngoY1sxXSl9IiB4Mj0iJHtmeChjWzBdICsgckUgKiBzYyArIDgpfSIgeTI9IiR7ZngoY1sxXSl9Ii8+YDsKICBzICs9IGA8bGluZSBjbGFzcz0id3otY2VudGVyIiB4MT0iJHtmeChjWzBdKX0iIHkxPSIke2Z4KGNbMV0gLSByRSAqIHNjIC0gOCl9IiB4Mj0iJHtmeChjWzBdKX0iIHkyPSIke2Z4KGNbMV0gKyByRSAqIHNjICsgOCl9Ii8+YDsKICAvLyBQcm9maWwgKHNjaGVtYXRpc2NoKTogVHlwIElJIG1pdCBMaXBwZSBhbSBBdXNzZW5yYW5kLCBUeXAgSSBnbGF0dAogIGNvbnN0IHB4MCA9IFAuc3gocHJvZlgwKSwgcHgxID0gUC5zeChwcm9mWDAgKyBwcm9mVyksIHB5MCA9IFAuc3koLXByb2ZIIC8gMiksIHB5MSA9IFAuc3kocHJvZkggLyAyKTsKICBzICs9IGA8cmVjdCBjbGFzcz0id3otZ2Fza2V0IiB4PSIke2Z4KHB4MCl9IiB5PSIke2Z4KHB5MCl9IiB3aWR0aD0iJHtmeChweDEgLSBweDApfSIgaGVpZ2h0PSIke2Z4KHB5MSAtIHB5MCl9Ii8+YDsKICBpZiAobGlwcGUpIHsKICAgIHZhciBsdyA9IE1hdGgubWF4KDQsIChweDEgLSBweDApICogMC4zMiksIGxoID0gTWF0aC5tYXgoMywgKHB5MSAtIHB5MCkgKiAwLjE2KTsKICAgIHMgKz0gYDxyZWN0IGNsYXNzPSJ3ei1nYXNrZXQiIHg9IiR7ZngocHgxIC0gbHcgLyAyKX0iIHk9IiR7ZngocHkwIC0gbGgpfSIgd2lkdGg9IiR7ZngobHcpfSIgaGVpZ2h0PSIke2Z4KGxoKX0iLz5gOwogICAgcyArPSBgPHJlY3QgY2xhc3M9Ind6LWdhc2tldCIgeD0iJHtmeChweDEgLSBsdyAvIDIpfSIgeT0iJHtmeChweTEpfSIgd2lkdGg9IiR7ZngobHcpfSIgaGVpZ2h0PSIke2Z4KGxoKX0iLz5gOwogIH0KICBzICs9IGA8bGluZSBjbGFzcz0id3otY2VudGVyIiB4MT0iJHtmeChweDAgLSA4KX0iIHkxPSIke2Z4KChweTAgKyBweTEpIC8gMil9IiB4Mj0iJHtmeChweDEgKyA4KX0iIHkyPSIke2Z4KChweTAgKyBweTEpIC8gMil9Ii8+YDsKICBzICs9IGA8dGV4dCBjbGFzcz0id3otbm90ZSIgeD0iJHtmeCgocHgwICsgcHgxKSAvIDIpfSIgeT0iJHtmeChweTEgKyAobGlwcGUgPyBNYXRoLm1heCgzLCAocHkxIC0gcHkwKSAqIDAuMTYpICsgMTYgOiAxOCkpfSIgdGV4dC1hbmNob3I9Im1pZGRsZSI+UHJvZmlsIChzY2hlbWF0aXNjaCkgwrcgJHtsaXBwZSA\\\/ICdUeXAgSUkgbWl0IExpcHBlJyA6ICdUeXAgSSBvaG5lIExpcHBlJ308L3RleHQ+YDsKICAvLyBCZW1hc3N1bmc6IEMgKElubmVuLeKMgCkgYWxzIER1cmNobWVzc2VyIHF1ZXIgZHVyY2ggZGllIEJvaHJ1bmcsIEUgKEF1c3Nlbi3ijIApIHVudGVuLgogIHMgKz0gZGltSChpZCwgY1swXSAtIHJDICogc2MsIGNbMF0gKyByQyAqIHNjLCBjWzFdLCAnQyDijIAgJyArIGRlKEMpKTsKICBzICs9IGRpbUgoaWQsIGNbMF0gLSByRSAqIHNjLCBjWzBdICsgckUgKiBzYywgY1sxXSArIHJFICogc2MgKyAzMiwgJ0Ug4oyAICcgKyBkZShFKSwgeyBleHQ6IGNbMV0gKyByRSAqIHNjIH0pOwogIGNvbnN0IG1hdCA9IEdBU0tFVF9MQUJFTFtvLmdhc2tldE1hdGVyaWFsXSB8fCBvLmdhc2tldE1hdGVyaWFsOwogIHMgKz0gZml0dGluZ0JhZGdlKHZ3LCAnRGljaHR1bmcgwrcgVHlwICcgKyBvLmdhc2tldFR5cGUgKyAobGlwcGUgPyAnIChtaXQgTGlwcGUpJyA6ICcgKG9obmUgTGlwcGUpJykgKyAnIMK3IEUg4oyAICcgKyBkZShFKSArICcgwrcgJyArIG1hdCk7CiAgcmV0dXJuIHdyYXBTdmcoaWQsIHZ3LCB2aCwgby5nQ29sLCBzLCBsZWdlbmRCb3goaWQsIHZ3LCB2aCwgbywgJ0Zyb250YW5zaWNodCArIFByb2ZpbCAoRGljaHR1bmcpJykpOwp9CgovKiAtLSBQbGF0emhhbHRlcjogdW5iZWthbm50ZXIgLyBuaWNodC16ZWljaGVuYmFyZXIgc3ZnVHlwZSAtLS0tLS0tLS0tLS0tLS0tLS0KICogRmFlbGx0IG51ciBub2NoIGFuLCB3ZW5uIGVpbiBiZWxlZ3RlcyBQZmxpY2h0bWFzcyBmZWhsdCAoei4gQi4gRGljaHR1bmcgb2huZQogKiBFL0MsIEtsYW1tZXIgb2huZSBBLCBCbGluZGRlY2tlbCBvaG5lIERlY2tlbHN0YWVya2UpIG9kZXIgZWluIHN2Z1R5cGUgZ2FuegogKiB1bmJla2FubnQgaXN0LiBOYWNocHJ1ZWYtQmVmdW5kIGIgKDE2LjA3LjIwMjYpOiBCaXMgaGllcmhlciBmaWVsIGRlcgogKiBkZWZhdWx0LVp3ZWlnIGF1ZiBkcmF3Q2xhbXBzdHV0emVuIHp1cnVlY2sgdW5kIHplaWd0ZSBzdGlsbCBlaW5lIGtvbXBsZXR0ZQogKiBDbGFtcHZlcmJpbmR1bmcsIGRpZSBlcyBmdWVyIGRlbiBUeXAgZ2FyIG5pY2h0IGdpYnQuIFN0YXR0IGVyZnVuZGVuZXIKICogR2VvbWV0cmllOiBlaW4ga2xhcmVyICJaZWljaG51bmcgZm9sZ3QiLUhpbndlaXMuIEVzIHdpcmQgQkVXVVNTVCBrZWluCiAqIEZpdHRpbmcgZ2V6ZWljaG5ldC4gKi8KZnVuY3Rpb24gZHJhd1BsYXR6aGFsdGVyKG8sIHZ3LCB2aCkgewogIGNvbnN0IGlkID0gdWlkKCk7CiAgY29uc3QgY3ggPSB2dyAvIDIsIGN5ID0gdmggLyAyOwogIGNvbnN0IGJ3ID0gTWF0aC5taW4oMzgwLCB2dyAtIDg4KSwgYmggPSAxMzI7CiAgbGV0IHMgPSAnJzsKICBzICs9IGA8cmVjdCB4PSIke2Z4KGN4IC0gYncgLyAyKX0iIHk9IiR7ZngoY3kgLSBiaCAvIDIgLSA2KX0iIHdpZHRoPSIke2Z4KGJ3KX0iIGhlaWdodD0iJHtmeChiaCl9IiByeD0iMTQiCiAgICAgICAgICBmaWxsPSJ2YXIoLS13ei1ib3JlLCNmNGY2ZjgpIiBzdHJva2U9InZhcigtLXd6LWRpbSwjOGE4Zjk2KSIgc3Ryb2tlLXdpZHRoPSIxLjIiIHN0cm9rZS1kYXNoYXJyYXk9IjcgNSIvPmA7CiAgcyArPSBgPHBhdGggZD0iTSR7ZngoY3ggLSAyNCl9LCR7ZngoY3kgLSAxMCl9IGwxNCwtMTQgMTAsMTAgMjAsLTIyIE0ke2Z4KGN4IC0gMjQpfSwke2Z4KGN5ICsgOCl9IGg1OCIKICAgICAgICAgIGZpbGw9Im5vbmUiIHN0cm9rZT0idmFyKC0td3otZWRnZSwjMWMxYzFjKSIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPmA7CiAgcyArPSBgPHRleHQgeD0iJHtmeChjeCl9IiB5PSIke2Z4KGN5ICsgMzQpfSIgdGV4dC1hbmNob3I9Im1pZGRsZSIKICAgICAgICAgIGZpbGw9InZhcigtLXd6LWluaywjMWMxYzFjKSIgZm9udC1zaXplPSIxNSIgZm9udC13ZWlnaHQ9IjYwMCIKICAgICAgICAgIGZvbnQtZmFtaWx5PSInUGx1cyBKYWthcnRhIFNhbnMnLCdLdW1iaCBTYW5zJyxzeXN0ZW0tdWksc2Fucy1zZXJpZiI+WmVpY2hudW5nIGZvbGd0PC90ZXh0PmA7CiAgcmV0dXJuIHdyYXBTdmcoaWQsIHZ3LCB2aCwgby5nQ29sLCBzLCBsZWdlbmRCb3goaWQsIHZ3LCB2aCwgbywgJ1plaWNobnVuZyBmb2xndCcpKTsKfQoKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBEaXNwYXRjaCAqLwpmdW5jdGlvbiByZW5kZXJGaXR0aW5nKHBhcmFtcywgb3B0cykgewogIG9wdHMgPSBvcHRzIHx8IHt9OwogIGNvbnN0IHZ3ID0gb3B0cy53aWR0aCB8fCA3NjAsIHZoID0gb3B0cy5oZWlnaHQgfHwgNDQwOwogIGNvbnN0IHJlcXVlc3RlZFR5cGUgPSBwYXJhbXMgJiYgcGFyYW1zLnR5cGU7CiAgY29uc3QgaW52YWxpZENvbm5lY3QgPSAocmVxdWVzdGVkVHlwZSA9PT0gJ2Nvbm5lY3RmbGFuc2NoJyAmJiAhdmFsaWRDb25uZWN0ZmxhbnNjaChwYXJhbXMpKSB8fAogICAgKHJlcXVlc3RlZFR5cGUgPT09ICdjb25uZWN0aW5saW5lJyAmJiAhdmFsaWRDb25uZWN0aW5saW5lKHBhcmFtcykpOwogIGNvbnN0IG8gPSBub3JtYWxpemUocGFyYW1zKTsKICBpZiAoaW52YWxpZENvbm5lY3QpIHJldHVybiBkcmF3UGxhdHpoYWx0ZXIobywgdncsIHZoKTsKICBzd2l0Y2ggKG8udHlwZSkgewogICAgY2FzZSAnY2xhbXBzdHV0emVuJzogcmV0dXJuIGRyYXdDbGFtcHN0dXR6ZW4obywgdncsIHZoLCBmYWxzZSk7CiAgICAvLyBFaW56ZWxuZXIgU3R1dHplbiAoVENEL1RDUyk6IGtlaW4gendlaXRlciBTdHV0emVuLCBrZWluZSBEaWNodHVuZywga2VpbmUgS2xhbW1lci4KICAgIGNhc2UgJ3N0dXR6ZW4nOiAgICAgIHJldHVybiBkcmF3Q2xhbXBzdHV0emVuKG8sIHZ3LCB2aCwgJ3NpbmdsZScpOwogICAgY2FzZSAnYmxpbmRrYXBwZSc6ICAgcmV0dXJuIGRyYXdDbGFtcHN0dXR6ZW4obywgdncsIHZoLCB0cnVlKTsKICAgIC8vIFJ1bmRlIDcgKFctMDU5KTogcmVpbmUgRmxhbnNjaC1aZWljaG51bmcgb2huZSBSb2hybWFzc2UgKFR5cCBCRCkuCiAgICBjYXNlICdibGluZGRlY2tlbCc6ICByZXR1cm4gZHJhd0JsaW5kZGVja2VsKG8sIHZ3LCB2aCk7CiAgICBjYXNlICdib2dlbjkwJzogICAgICByZXR1cm4gZHJhd0JvZ2VuKG8sIHZ3LCB2aCwgOTApOwogICAgY2FzZSAnYm9nZW40NSc6ICAgICAgcmV0dXJuIGRyYXdCb2dlbihvLCB2dywgdmgsIDQ1KTsKICAgIGNhc2UgJ3RzdHVlY2snOiAgICAgIHJldHVybiBkcmF3VHN0dWVjayhvLCB2dywgdmgpOwogICAgY2FzZSAncmVkdXppZXJ1bmcnOiAgcmV0dXJuIGRyYXdSZWR1emllcnVuZyhvLCB2dywgdmgpOwogICAgY2FzZSAna2xhbW1lcic6ICAgICAgcmV0dXJuIGRyYXdLbGFtbWVyKG8sIHZ3LCB2aCk7CiAgICBjYXNlICdjb25uZWN0ZmxhbnNjaCc6IHJldHVybiBkcmF3Q29ubmVjdGZsYW5zY2gobywgdncsIHZoKTsKICAgIGNhc2UgJ2Nvbm5lY3RpbmxpbmUnOiAgcmV0dXJuIGRyYXdDb25uZWN0aW5saW5lKG8sIHZ3LCB2aCk7CiAgICAvLyBUeXAgRCAnZGljaHR1bmcnOiBlY2h0ZSBaZWljaG51bmcgbWl0IGJlbGVndGVuIEUvQy1NYXNzZW47IG9obmUgc2llCiAgICAvLyBmYWVsbHQgZHJhd0RpY2h0dW5nIHNlbGJzdCBhdWYgZGVuIFBsYXR6aGFsdGVyIChOSUUgZHJhd0NsYW1wc3R1dHplbikuCiAgICBjYXNlICdkaWNodHVuZyc6ICAgICByZXR1cm4gZHJhd0RpY2h0dW5nKG8sIHZ3LCB2aCk7CiAgICAvLyBTaWNoZXJoZWl0c25ldHo6IGplZGVyIHVuYmVrYW5udGUgc3ZnVHlwZSBiZWtvbW10IGRlbiBQbGF0emhhbHRlciBzdGF0dCBzdGlsbAogICAgLy8gZWluZSBmYWxzY2hlIENsYW1wdmVyYmluZHVuZyAoTmFjaHBydWVmLUJlZnVuZCBiKS4KICAgIGRlZmF1bHQ6ICAgICAgICAgICAgIHJldHVybiBkcmF3UGxhdHpoYWx0ZXIobywgdncsIHZoKTsKICB9Cn0KCmNvbnN0IEFQSSA9IHsgcmVuZGVyRml0dGluZywgRklUVElOR19UWVBFUywgREVGQVVMVFMsIEdBU0tFVF9DT0xPUlMsIEdBU0tFVF9MQUJFTCB9OwppZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpIG1vZHVsZS5leHBvcnRzID0gQVBJOwppZiAocm9vdCkgcm9vdC5XZWlzc0ZpdHRpbmdTVkcgPSBBUEk7CgovKiAtLS0tLS0tLS0gTm9kZS1TZWxic3R0ZXN0OiBgbm9kZSBkcmF3LmpzYCBzY2hyZWlidCBCZWlzcGllbGUgbmFjaCAuL3FhIC0tLSAqLwppZiAodHlwZW9mIHJlcXVpcmUgIT09ICd1bmRlZmluZWQnICYmIHJlcXVpcmUubWFpbiA9PT0gbW9kdWxlKSB7CiAgY29uc3QgZnMgPSByZXF1aXJlKCdmcycpLCBwYXRoID0gcmVxdWlyZSgncGF0aCcpOwogIGNvbnN0IG91dCA9IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICdxYScpOyB0cnkgeyBmcy5ta2RpclN5bmMob3V0LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTsgfSBjYXRjaCAoZSkge30KICBjb25zdCBzYW1wbGVzID0gWwogICAgWydjbGFtcHN0dXR6ZW4nLHt0eXBlOidjbGFtcHN0dXR6ZW4nLGRuOjI1LG9kOjI5LHdhbGw6MS41LGxlbmd0aDoyMS41LGNsYW1wU2l6ZTonRE4yNScsZmxhbmdlT2Q6NTAuNSxnYXNrZXRNYXRlcmlhbDonRVBETScsc3VyZmFjZTonSDQnLHdlcmtzdG9mZjonMS40NDM1J31dLAogICAgWydibGluZGRlY2tlbCcsIHt0eXBlOidibGluZGRlY2tlbCcsZmxhbmdlT2Q6NTAuNSxsZW5ndGg6Ni4zNSxzdXJmYWNlOidINCcsd2Vya3N0b2ZmOicxLjQ0MDQnfV0sCiAgICBbJ2tsYW1tZXInLCAgICAge3R5cGU6J2tsYW1tZXInLGZsYW5nZU9kOjUwLjUsa2xhbW1lckE6NTMsa2xhbW1lclR5cDonS0wxJyxrbGFtbWVyTXV0dGVyOidNJyx3ZXJrc3RvZmY6JzEuNDMwOCcsc3VyZmFjZTonJ31dLAogICAgWydrbGFtbWVyLWtsaCcsIHt0eXBlOidrbGFtbWVyJyxmbGFuZ2VPZDo2NCxrbGFtbWVyQTo2NS41LGtsYW1tZXJUeXA6J0tMSCcsa2xhbW1lck11dHRlcjonUycsd2Vya3N0b2ZmOicxLjQzMDgnLHN1cmZhY2U6Jyd9XSwKICAgIFsnZGljaHR1bmctdDEnLCB7dHlwZTonZGljaHR1bmcnLGdhc2tldE9kOjIyLjAsZ2Fza2V0SWQ6OS43LGdhc2tldFR5cGU6J0knLGdhc2tldE1hdGVyaWFsOidFUERNJyx3ZXJrc3RvZmY6JzEuNDQwNCcsc3VyZmFjZTonJ31dLAogICAgWydkaWNodHVuZy10MicsIHt0eXBlOidkaWNodHVuZycsZ2Fza2V0T2Q6NTAuNSxnYXNrZXRJZDoyNy43LGdhc2tldFR5cGU6J0lJJyxnYXNrZXRNYXRlcmlhbDonVk1RJyx3ZXJrc3RvZmY6JzEuNDQwNCcsc3VyZmFjZTonJ31dLAogICAgWydib2dlbjkwJywgICAgIHt0eXBlOidib2dlbjkwJyxkbjoyNSxvZDoyOSx3YWxsOjEuNSxsZW5ndGg6NDAsYmVuZFJhZGl1czo1MCxzdXJmYWNlOidIMyd9XSwKICAgIFsnYm9nZW40NScsICAgICB7dHlwZTonYm9nZW40NScsZG46NDAsb2Q6NDEsd2FsbDoxLjUsbGVuZ3RoOjQwLGJlbmRSYWRpdXM6NjAsc3VyZmFjZTonSDQnfV0sCiAgICBbJ3RzdHVlY2snLCAgICAge3R5cGU6J3RzdHVlY2snLGRuOjQwLG9kOjQxLHdhbGw6MS41LGxlbmd0aDoxMjAsYnJhbmNoT2Q6NDEsc3VyZmFjZTonSDQnfV0sCiAgICBbJ3RzdHVlY2stcmVkJywge3R5cGU6J3RzdHVlY2snLGRuOjQwLG9kOjQxLHdhbGw6MS41LGxlbmd0aDoxMjAsYnJhbmNoT2Q6Mjksc3VyZmFjZTonSDQnfV0sCiAgICBbJ3JlZHV6aWVydW5nJywge3R5cGU6J3JlZHV6aWVydW5nJyxkbjo0MCxvZDo0MSx3YWxsOjEuNSxsZW5ndGg6NjAsb2QyOjI5LGVjY2VudHJpYzpmYWxzZSxzdXJmYWNlOidINCd9XSwKICAgIFsncmVkLWV4eicsICAgICB7dHlwZToncmVkdXppZXJ1bmcnLGRuOjUwLG9kOjUzLHdhbGw6MS41LGxlbmd0aDo3MCxvZDI6MjksZWNjZW50cmljOnRydWUsc3VyZmFjZTonSDMnfV0KICBdOwogIGNvbnN0IHBhZ2UgPSBbJzwhZG9jdHlwZSBodG1sPjxtZXRhIGNoYXJzZXQ9InV0Zi04Ij48dGl0bGU+V2Vpc3MgU1ZHIFFBPC90aXRsZT4nLAogICAgJzxzdHlsZT5ib2R5e2JhY2tncm91bmQ6I2ZmZjtmb250LWZhbWlseTpzeXN0ZW0tdWk7bWFyZ2luOjA7cGFkZGluZzoyMHB4fScsCiAgICAnLmNhcmR7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6NDIwcHg7bWFyZ2luOjhweDtib3JkZXI6MXB4IHNvbGlkICNlZWU7Ym9yZGVyLXJhZGl1czoxMnB4O3BhZGRpbmc6OHB4O3ZlcnRpY2FsLWFsaWduOnRvcH0nLAogICAgJy5jYXJkIGgze2ZvbnQ6NjAwIDEzcHggc3lzdGVtLXVpO2NvbG9yOiMxYzFjMWM7bWFyZ2luOjRweCA2cHh9c3Zne3dpZHRoOjEwMCU7aGVpZ2h0OmF1dG87YmFja2dyb3VuZDojZmZmfTwvc3R5bGU+J107CiAgc2FtcGxlcy5mb3JFYWNoKChbbmFtZSwgcF0pID0+IHsKICAgIGNvbnN0IHN2ZyA9IHJlbmRlckZpdHRpbmcocCk7CiAgICBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbihvdXQsICdkZW1vLScgKyBuYW1lICsgJy5zdmcnKSwgc3ZnKTsKICAgIHBhZ2UucHVzaChgPGRpdiBjbGFzcz0iY2FyZCI+PGgzPiR7bmFtZX08L2gzPiR7c3ZnfTwvZGl2PmApOwogICAgY29uc29sZS5sb2coJ29rICAnICsgbmFtZS5wYWRFbmQoMTQpICsgJyBieXRlcz0nICsgc3ZnLmxlbmd0aCk7CiAgfSk7CiAgZnMud3JpdGVGaWxlU3luYyhwYXRoLmpvaW4ob3V0LCAnaW5kZXguaHRtbCcpLCBwYWdlLmpvaW4oJ1xuJykpOwogIGNvbnNvbGUubG9nKCdcbmdlc2NocmllYmVuIG5hY2g6ICcgKyBvdXQpOwp9Cgp9KSh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA\\\/IHdpbmRvdyA6IG51bGwpOwoKPC9zY3JpcHQ+CiAgPHNjcmlwdD4KLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogV2Vpc3MgQXBwYXJhdGViYXUgLSBGaXR0aW5ncy1Lb25maWd1cmF0b3IKICogcmVuZGVyLmpzICAtICBGb3RvcmVhbGlzdGlzY2ggd2lya2VuZGUgUHJvZHVrdC1BbnNpY2h0IChFZGVsc3RhaGwtTG9vaywgU1ZHKQogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBad2VpdGUgRGFyc3RlbGx1bmcgbmViZW4gZGVyIERJTi1aZWljaG51bmcgKGRyYXcuanMpOiBnbGVpY2hlIHBhcmFtZXRyaXNjaGUKICogR2VvbWV0cmllLCBhYmVyIENocm9tLS9TYXRpbi1WZXJsYWV1ZmUsIEdsYW56a2FudGVuLCB3ZWljaGVyIFNjaGF0dGVuIC0KICogYW5nZWxlaG50IGFuIGRpZSBQcm9kdWt0cmVuZGVycyBhdWYgd2Vpc3MtYXBwYXJhdGViYXUuZGUuCiAqCiAqICAgV2Vpc3NGaXR0aW5nUmVuZGVyLnJlbmRlckZpdHRpbmcocGFyYW1zLCBvcHRzKSAtPiBTVkctU3RyaW5nCiAqICAgcGFyYW1zIHdpZSBkcmF3LmpzOiB7dHlwZSwgZG4sIG9kLCB3YWxsLCBsZW5ndGgsIG9kMiwgYnJhbmNoT2QsCiAqICAgICAgICAgICAgICAgICAgICAgICAgYmVuZFJhZGl1cywgZWNjZW50cmljLCBmbGFuZ2VPZCwgZ2Fza2V0TWF0ZXJpYWwsCiAqICAgICAgICAgICAgICAgICAgICAgICAgZ2Fza2V0Q29sb3IsIHN1cmZhY2UsIHdlcmtzdG9mZiwgY2xhbXBTaXplfQogKiAgIENGOiAgICAgICAgIHt0eXBlOidjb25uZWN0ZmxhbnNjaCcsIG9kOkRlLCBpbm5lckRpYW1ldGVyOkRpLAogKiAgICAgICAgICAgICAgICBmbGFuZ2VPZDpEZiwgbGVuZ3RoOkwsIHByb2R1Y3RTZXJpZXMsIGRufGxhYmVsfQogKiAgIENGSTogICAgICAgIHt0eXBlOidjb25uZWN0aW5saW5lJywgb2Q6RGUsIGlubmVyRGlhbWV0ZXI6RGksIGxlbmd0aDpMLAogKiAgICAgICAgICAgICAgICBicmFuY2hIZWlnaHQ6WSwgZW5kVHlwZTonQlcnfCdUQycsIGVuZERpYW1ldGVyOkF8VEMsCiAqICAgICAgICAgICAgICAgIHByb2R1Y3RTZXJpZXMsIGRufGxhYmVsfQogKgogKiBTdGF0aXNjaGVzIFNWRywga2VpbmUgRmlsdGVyIGF1ZiBmaXhlZC9zdGlja3kgRWJlbmVuIC0gVGFibGV0LXNpY2hlci4KICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KJ3VzZSBzdHJpY3QnOwooZnVuY3Rpb24gKHJvb3QpIHsKCi8qIE51ciBSdWVja2ZhbGwsIG8uZ2Fza2V0Q29sb3IgZ2V3aW5udC4gVlAgZXJnYWVuenQgYW0gMjEuMDguMjAyNiBtaXQgZGVtIFdlcnQKICogYXVzIGRhdGEuanMsIHNpZWhlIEtvbW1lbnRhciBpbiBkcmF3LmpzLiAqLwpjb25zdCBHQVNLRVRfQ09MT1JTID0geyBFUERNOicjMjMyODJjJywgVk1ROicjZTdlMmQ4JywgRktNOicjMmY3ZDNhJywgUFRGRTonI2Y0ZjRmNCcsIFZQOicjZWZlOWRmJyB9OwpsZXQgVUlEID0gMDsgY29uc3QgdWlkID0gKCkgPT4gJ3dyJyArICgrK1VJRCk7CmNvbnN0IGZ4ID0gbiA9PiBNYXRoLnJvdW5kKG4gKiAxMDApIC8gMTAwOwpjb25zdCBudW0gPSAodiwgZCkgPT4gKHR5cGVvZiB2ID09PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZSh2KSkgPyB2IDogZDsKY29uc3QgZXNjID0gcyA9PiBTdHJpbmcocyA9PSBudWxsID8gJycgOiBzKS5yZXBsYWNlKC9bJjw+IiddL2csIGMgPT4gKHsKICAnJic6JyZhbXA7JywgJzwnOicmbHQ7JywgJz4nOicmZ3Q7JywgJyInOicmcXVvdDsnLCAiJyI6JyYjMzk7Jwp9KVtjXSk7CmNvbnN0IHBvc2l0aXZlID0gdiA9PiB0eXBlb2YgdiA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUodikgJiYgdiA+IDA7Ci8qIFRDLUJ1bmQtSG9laGUuIE11c3MgWkVJQ0hFTkdMRUlDSCB6dSBkcmF3LmpzIHNlaW4gKGRvcnQgVENfQlVORCAvIHRjQnVuZEhvZWhlKSwKICogc29uc3QgemVpZ2VuIEFuc2ljaHQgdW5kIFplaWNobnVuZyBmdWVyIGRpZXNlbGJlIEtvbmZpZ3VyYXRpb24gdmVyc2NoaWVkZW4gaG9oZQogKiBCdW5kZSAtIGdlbmF1IGRhcyB3YXIgYW0gMjguMDcuMjAyNiBkZXIgRmFsbCAoYmlzIDQsMTAgbW0gVW50ZXJzY2hpZWQsIHouIEIuCiAqIEROMTAwIEtMOiBaZWljaG51bmcgOCw0MCBnZWdlbiBBbnNpY2h0IDEyLDUwKS4KICogQmV6dWcgaXN0IGRlciBGTEFOU0NILeKMgCwgd2VpbCBlciBhbHMgZWluemlnZXMgR3JvZXNzZW5tYXNzIGZ1ZXIgS0ssIEtMIHVuZCBkZW4KICogZGlja3dhbmRpZ2VuIFRhbmtzdHV0emVuIGlkZW50aXNjaCBpc3QgLSBnZW5hdSBkYXMgaGF0dGUgQmVybmQgdmVybGFuZ3QuCiAqIEJlaW0gQWVuZGVybiBJTU1FUiBiZWlkZSBEYXRlaWVuIGFuZmFzc2VuLiAqLwpjb25zdCBUQ19CVU5EID0geyBtaW46IDQuNSwgbWF4OiA4LjQsIHJlZkZsYW5zY2g6IDY0LCBtYXhBbnRlaWxMOiAwLjUgfTsKZnVuY3Rpb24gdGNCdW5kSG9laGUoZmxhbmdlT2QsIEwpIHsKICBjb25zdCByb2ggPSBwb3NpdGl2ZShmbGFuZ2VPZCkgPyBmbGFuZ2VPZCAvIFRDX0JVTkQucmVmRmxhbnNjaCAqIFRDX0JVTkQubWF4IDogVENfQlVORC5taW47CiAgY29uc3QgaCA9IE1hdGgubWluKFRDX0JVTkQubWF4LCBNYXRoLm1heChUQ19CVU5ELm1pbiwgcm9oKSk7CiAgcmV0dXJuIHBvc2l0aXZlKEwpID8gTWF0aC5taW4oaCwgTCAqIFRDX0JVTkQubWF4QW50ZWlsTCkgOiBoOwp9CmNvbnN0IHNlcmllc09rID0gdiA9PiBbJzEuNDQwNCcsJzEuNDQzNSddLmluY2x1ZGVzKFN0cmluZyh2IHx8ICcnKS50cmltKCkpOwpjb25zdCBoYXNTaXplTGFiZWwgPSBwID0+ICEhKHAgJiYgKCh0eXBlb2YgcC5sYWJlbCA9PT0gJ3N0cmluZycgJiYgcC5sYWJlbC50cmltKCkpIHx8IHAuZG4gIT0gbnVsbCkpOwpmdW5jdGlvbiB2YWxpZENvbm5lY3RmbGFuc2NoKHApIHsKICByZXR1cm4gISEocCAmJiBwb3NpdGl2ZShwLm9kKSAmJiBwb3NpdGl2ZShwLmlubmVyRGlhbWV0ZXIpICYmIHAuaW5uZXJEaWFtZXRlciA8IHAub2QgJiYKICAgIHBvc2l0aXZlKHAuZmxhbmdlT2QpICYmIHAuaW5uZXJEaWFtZXRlciA8IHAuZmxhbmdlT2QgJiYgcG9zaXRpdmUocC5sZW5ndGgpICYmCiAgICBzZXJpZXNPayhwLnByb2R1Y3RTZXJpZXMpICYmIGhhc1NpemVMYWJlbChwKSk7Cn0KZnVuY3Rpb24gdmFsaWRDb25uZWN0aW5saW5lKHApIHsKICBjb25zdCBlbmRUeXBlID0gU3RyaW5nKHAgJiYgcC5lbmRUeXBlIHx8ICcnKS50cmltKCkudG9VcHBlckNhc2UoKTsKICByZXR1cm4gISEocCAmJiBwb3NpdGl2ZShwLm9kKSAmJiBwb3NpdGl2ZShwLmlubmVyRGlhbWV0ZXIpICYmIHAuaW5uZXJEaWFtZXRlciA8IHAub2QgJiYKICAgIHBvc2l0aXZlKHAubGVuZ3RoKSAmJiBwb3NpdGl2ZShwLmJyYW5jaEhlaWdodCkgJiYgcG9zaXRpdmUocC5lbmREaWFtZXRlcikgJiYKICAgIHBvc2l0aXZlKHAudXBwZXJPdXRlckRpYW1ldGVyKSAmJiBwb3NpdGl2ZShwLnVwcGVySW5uZXJEaWFtZXRlcikgJiYgcC51cHBlcklubmVyRGlhbWV0ZXIgPCBwLnVwcGVyT3V0ZXJEaWFtZXRlciAmJgogICAgWydCVycsJ1RDJ10uaW5jbHVkZXMoZW5kVHlwZSkgJiYgc2VyaWVzT2socC5wcm9kdWN0U2VyaWVzKSAmJiBoYXNTaXplTGFiZWwocCkpOwp9CmZ1bmN0aW9uIHNpemVMYWJlbChvKSB7CiAgaWYgKHR5cGVvZiBvLmxhYmVsID09PSAnc3RyaW5nJyAmJiBvLmxhYmVsLnRyaW0oKSkgcmV0dXJuIG8ubGFiZWwudHJpbSgpOwogIGNvbnN0IGRuID0gU3RyaW5nKG8uZG4gPT0gbnVsbCA\\\/ICcnIDogby5kbikudHJpbSgpOwogIGlmICghZG4pIHJldHVybiAnJzsKICByZXR1cm4gL15ETlxzKi9pLnRlc3QoZG4pID8gZG4gOiAnRE4gJyArIGRuOwp9CgovKiBDaHJvbS1RdWVyc2Nobml0dCAoSGlnaGxpZ2h0IG1pdHRpZykgKyBTYXRpbiAoS2xhbW1lcikgKi8KY29uc3QgQ0hST01FID0gWwogIFswLjAwLCAnIzQ5NTU1ZSddLCBbMC4wOSwgJyM3ZThjOTYnXSwgWzAuMjYsICcjZDRkY2UyJ10sIFswLjQwLCAnI2Y5ZmJmYyddLAogIFswLjUwLCAnI2ZmZmZmZiddLCBbMC42MCwgJyNlYWVmZjMnXSwgWzAuNzQsICcjYjRiZmM3J10sIFswLjg4LCAnIzc2ODQ4ZSddLCBbMS4wMCwgJyMzZjRiNTQnXQpdOwpjb25zdCBTQVRJTiA9IFsKICBbMC4wMCwgJyM1YTY1NmUnXSwgWzAuMTUsICcjOGQ5OWEyJ10sIFswLjM4LCAnI2M4ZDFkNyddLCBbMC41MiwgJyNkZGU0ZTknXSwKICBbMC42NiwgJyNhYWI1YmQnXSwgWzAuODQsICcjN2I4NzkxJ10sIFsxLjAwLCAnIzUyNWQ2NiddCl07CmNvbnN0IE5BTUUgPSB7IGNsYW1wc3R1dHplbjonQ2xhbXAtVmVyYmluZHVuZycsIGJsaW5ka2FwcGU6J0JsaW5kZGVja2VsJywgYmxpbmRkZWNrZWw6J0JsaW5kZGVja2VsJywga2xhbW1lcjonS2xhbW1lcicsCiAgICAgICAgICAgICAgIGJvZ2VuOTA6J0JvZ2VuIDkwwrAnLCBib2dlbjQ1OidCb2dlbiA0NcKwJywgdHN0dWVjazonVC1TdMO8Y2snLCByZWR1emllcnVuZzonUmVkdXppZXJ1bmcnLAogICAgICAgICAgICAgICBkaWNodHVuZzonRGljaHR1bmcnLCBjb25uZWN0ZmxhbnNjaDonQ29ubmVjdC1GbGFuc2NoIChDRiknLCBjb25uZWN0aW5saW5lOidDb25uZWN0LUZsYW5zY2ggSW5saW5lIChDRkkpJyB9OwoKY29uc3Qgc3RvcHNTdmcgPSAoc3RvcHMsIHQwKSA9PiBzdG9wcy5tYXAoKFtvLCBjXSkgPT4KICBgPHN0b3Agb2Zmc2V0PSIke2Z4KCh0MCA9PSBudWxsID8gbyA6IHQwICsgbyAqICgxIC0gdDApKSAqIDEwMCl9JSIgc3RvcC1jb2xvcj0iJHtjfSIvPmApLmpvaW4oJycpOwpjb25zdCBsaW5HcmFkQUIgPSAoaWQsIHgxLCB5MSwgeDIsIHkyLCBzdG9wcykgPT4KICBgPGxpbmVhckdyYWRpZW50IGlkPSIke2lkfSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIke2Z4KHgxKX0iIHkxPSIke2Z4KHkxKX0iIHgyPSIke2Z4KHgyKX0iIHkyPSIke2Z4KHkyKX0iPiR7c3RvcHNTdmcoc3RvcHMpfTwvbGluZWFyR3JhZGllbnQ+YDsKY29uc3QgcmFkR3JhZCA9IChpZCwgY3gsIGN5LCByLCBzdG9wcywgdDApID0+CiAgYDxyYWRpYWxHcmFkaWVudCBpZD0iJHtpZH0iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiBjeD0iJHtmeChjeCl9IiBjeT0iJHtmeChjeSl9IiByPSIke2Z4KHIpfSI+JHtzdG9wc1N2ZyhzdG9wcywgdDApfTwvcmFkaWFsR3JhZGllbnQ+YDsKY29uc3Qgc2hhZG93R3JhZCA9IGlkID0+IGA8cmFkaWFsR3JhZGllbnQgaWQ9IiR7aWR9LXNoIiBjeD0iMC41IiBjeT0iMC41IiByPSIwLjUiPgogIDxzdG9wIG9mZnNldD0iMCUiIHN0b3AtY29sb3I9InJnYmEoMjgsMzIsMzYsMC4yOCkiLz48c3RvcCBvZmZzZXQ9IjcwJSIgc3RvcC1jb2xvcj0icmdiYSgyOCwzMiwzNiwwLjExKSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0icmdiYSgyOCwzMiwzNiwwKSIvPjwvcmFkaWFsR3JhZGllbnQ+YDsKY29uc3QgYmx1ckRlZiA9IChpZCwgcykgPT4gYDxmaWx0ZXIgaWQ9IiR7aWR9LWJsIiB4PSItNDAlIiB5PSItNDAlIiB3aWR0aD0iMTgwJSIgaGVpZ2h0PSIxODAlIj48ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIke2Z4KE1hdGgubWF4KDAuNiwgcykpfSIvPjwvZmlsdGVyPmA7CmNvbnN0IEVER0UgPSAnc3Ryb2tlPSIjMzk0MzRiIiBzdHJva2Utb3BhY2l0eT0iMC41IiBzdHJva2Utd2lkdGg9IjEiJzsKY29uc3QgRk9OVCA9ICJmb250LWZhbWlseT1cIidQbHVzIEpha2FydGEgU2FucycsJ0t1bWJoIFNhbnMnLHN5c3RlbS11aSxzYW5zLXNlcmlmXCIiOwoKZnVuY3Rpb24gbm9ybWFsaXplKHApIHsKICBjb25zdCBvID0gT2JqZWN0LmFzc2lnbih7IHR5cGU6J2NsYW1wc3R1dHplbicsIGRuOjI1LCBvZDoyOSwgd2FsbDoxLjUsIGxlbmd0aDo2MCwgY2xhbXBTaXplOidETjI1JywKICAgIGJlbmRSYWRpdXM6NTAsIG9kMjoyMCwgYnJhbmNoT2Q6bnVsbCwgZWNjZW50cmljOmZhbHNlLCBmbGFuZ2VPZDpudWxsLAogICAgZ2Fza2V0TWF0ZXJpYWw6J0VQRE0nLCBnYXNrZXRDb2xvcjpudWxsLCBzdXJmYWNlOidIMycsIHdlcmtzdG9mZjonMS40NDA0JyB9LCBwIHx8IHt9KTsKICBjb25zdCBjb25uZWN0VHlwZSA9IHAgJiYgKHAudHlwZSA9PT0gJ2Nvbm5lY3RmbGFuc2NoJyB8fCBwLnR5cGUgPT09ICdjb25uZWN0aW5saW5lJyk7CiAgby5vZCA9IE1hdGgubWF4KDQsIG51bShvLm9kLCAyOSkpOwogIG8ud2FsbCA9IE1hdGgubWluKG8ub2QgLyAyIC0gMC4yLCBNYXRoLm1heCgwLjMsIG51bShvLndhbGwsIDEuNSkpKTsKICAvLyBEZWNrZWxzdGFlcmtlIGRlcyBCbGluZGRlY2tlbHMgbGllZ3QgYmVpIDQsNzUtMTQgbW0gLSBkaWUgOC1tbS1VbnRlcmdyZW56ZQogIC8vIGRhcmYgc2llIG5pY2h0IHZlcmZhZWxzY2hlbi4gRGVyIFdlcnQgZGFyZiBOVVIgYXVzIGRlbSBBdWZydWYga29tbWVuOwogIC8vIGZlaGx0IGVyIC0+IG51bGwgLT4gUGxhdHpoYWx0ZXIgKGZhaWwtY2xvc2VkKS4KICBvLmxlbmd0aCA9IChwICYmIHAudHlwZSA9PT0gJ2JsaW5kZGVja2VsJykKICAgID8gKGlzRmluaXRlKHAubGVuZ3RoKSA\\\/IE51bWJlcihwLmxlbmd0aCkgOiBudWxsKQogICAgOiBNYXRoLm1heCg4LCBudW0oby5sZW5ndGgsIDYwKSk7CiAgLy8gb2QyIG51ciBhbHMgZWNodGVzIE1hc3MgZnVlaHJlbiwgd2VubiBkZXIgQXVmcnVmZXIgd2lya2xpY2ggZWluZW4gendlaXRlbiDDmCBnZWxpZWZlcnQKICAvLyBoYXQgKE5hY2hwcnVlZi1CZWZ1bmQgYSkuIE9obmUgZWNodGVuIHp3ZWl0ZW4gw5g6IG5ldXRyYWxlIEdlb21ldHJpZSwgQmVzY2hyaWZ0dW5nICJmb2xndCIuCiAgby5vZDJQcm92ID0gISEocCAmJiBpc0Zpbml0ZShwLm9kMikpOwogIG8ub2QyID0gby5vZDJQcm92ID8gTWF0aC5tYXgoNCwgTWF0aC5taW4oby5vZCAtIDAuNSwgcC5vZDIpKSA6IE1hdGgubWF4KDQsIE1hdGgubWluKG8ub2QgLSAwLjUsIG8ub2QgKiAwLjY2KSk7CiAgby5icmFuY2hPZCA9IG51bShvLmJyYW5jaE9kLCBvLm9kKTsKICBvLmJyYW5jaExlbmd0aCA9IHAgJiYgcG9zaXRpdmUocC5icmFuY2hMZW5ndGgpID8gTnVtYmVyKHAuYnJhbmNoTGVuZ3RoKSA6IG51bGw7CiAgby53YWxsMiA9IHAgJiYgcG9zaXRpdmUocC53YWxsMikgPyBOdW1iZXIocC53YWxsMikgOiBvLndhbGw7CiAgLy8gUjMtMy9SMy00OiBCYXVmb3JtIGRlcyBULVN0w7xja3MsIGV4YWt0IHdpZSBpbiBkcmF3LmpzIG5vcm1hbGlzaWVydCAtIG51ciAnVCcKICAvLyAoQWJnYW5nIGdsZWljaCBsYW5nKSBvZGVyICdUSycgKEFiZ2FuZyBrdXJ6KSwgYWxsZXMgYW5kZXJlIHdpcmQgenUgJ1QnLgogIC8vIERpZSBBbnNpY2h0IGJlc2NocmlmdGV0IGRhbWl0IG51cjsgZGllIEdlb21ldHJpZSBow6RuZ3Qgd2llIGluIGRlciBaZWljaG51bmcKICAvLyBhbGxlaW4gYW0gYmVsZWd0ZW4gQWJnYW5nc21hw58sIG5pY2h0IGFuIGRlciBCYXVmb3JtLgogIG8udGZvcm0gPSAoby50Zm9ybSA9PT0gJ1RLJykgPyAnVEsnIDogJ1QnOwogIG8uYmVuZFJhZGl1cyA9IE1hdGgubWF4KG8ub2QsIG51bShvLmJlbmRSYWRpdXMsIG8ub2QgKiAxLjUpKTsKICBvLmZsYW5nZU9kID0gbnVtKG8uZmxhbmdlT2QsIE1hdGgubWF4KG8ub2QgKyAyMiwgby5vZCAqIDEuMjUgKyA2KSk7CiAgby5pbm5lckRpYW1ldGVyID0gbnVtKG8uaW5uZXJEaWFtZXRlciwgbnVsbCk7CiAgby5icmFuY2hIZWlnaHQgPSBudW0oby5icmFuY2hIZWlnaHQsIG51bGwpOwogIG8uZW5kRGlhbWV0ZXIgPSBudW0oby5lbmREaWFtZXRlciwgbnVsbCk7CiAgby51cHBlck91dGVyRGlhbWV0ZXIgPSBudW0oby51cHBlck91dGVyRGlhbWV0ZXIsIG51bGwpOwogIG8udXBwZXJJbm5lckRpYW1ldGVyID0gbnVtKG8udXBwZXJJbm5lckRpYW1ldGVyLCBudWxsKTsKICBvLmVuZFR5cGUgPSBTdHJpbmcoby5lbmRUeXBlIHx8ICcnKS50cmltKCkudG9VcHBlckNhc2UoKTsKICBvLnByb2R1Y3RTZXJpZXMgPSBTdHJpbmcoby5wcm9kdWN0U2VyaWVzIHx8ICcnKS50cmltKCkudG9VcHBlckNhc2UoKTsKICBvLmxhYmVsID0gdHlwZW9mIG8ubGFiZWwgPT09ICdzdHJpbmcnID8gby5sYWJlbC50cmltKCkgOiAnJzsKICAvLyBSdW5kZSA3IChXLTA1OSk6IGJlbGVndGUgWnVzYXR6bWFzc2UgZnVlciBLbGFtbWVyIC8gQmxpbmRkZWNrZWwgLyBEaWNodHVuZy4KICAvLyBFcyBnaWx0IG51ciwgd2FzIGRlciBBdWZydWZlciBsaWVmZXJ0IC0gb2huZSBkaWVzZSBXZXJ0ZSBibGVpYnQgZGVyIFBsYXR6aGFsdGVyLgogIG8ua2xhbW1lckEgPSBudW0oby5rbGFtbWVyQSwgbnVsbCk7CiAgby5rbGFtbWVyVHlwID0gWydLTDEnLCdLTExJJywnS0xIJ10uaW5kZXhPZihTdHJpbmcoby5rbGFtbWVyVHlwIHx8ICcnKS50b1VwcGVyQ2FzZSgpKSA+PSAwCiAgICA\\\/IFN0cmluZyhvLmtsYW1tZXJUeXApLnRvVXBwZXJDYXNlKCkgOiAnS0wxJzsKICBvLmtsYW1tZXJNdXR0ZXIgPSBTdHJpbmcoby5rbGFtbWVyTXV0dGVyIHx8ICcnKS50b1VwcGVyQ2FzZSgpID09PSAnUycgPyAnUycgOiAnTSc7CiAgby5nYXNrZXRPZCA9IG51bShvLmdhc2tldE9kLCBudWxsKTsKICBvLmdhc2tldElkID0gbnVtKG8uZ2Fza2V0SWQsIG51bGwpOwogIG8uZ2Fza2V0VHlwZSA9IFN0cmluZyhvLmdhc2tldFR5cGUgfHwgJycpLnRvVXBwZXJDYXNlKCkgPT09ICdJJyA\\\/ICdJJyA6ICdJSSc7CiAgaWYgKGNvbm5lY3RUeXBlKSB7CiAgICBvLndlcmtzdG9mZiA9IHR5cGVvZiBwLndlcmtzdG9mZiA9PT0gJ3N0cmluZycgPyBwLndlcmtzdG9mZi50cmltKCkgOiAnJzsKICAgIG8uc3VyZmFjZSA9IHR5cGVvZiBwLnN1cmZhY2UgPT09ICdzdHJpbmcnID8gcC5zdXJmYWNlLnRyaW0oKSA6ICcnOwogIH0KICBvLm9kUiA9IG8ub2QgLyAyOyBvLmlublIgPSBvLm9kIC8gMiAtIG8ud2FsbDsKICBvLmdDb2wgPSBvLmdhc2tldENvbG9yIHx8IEdBU0tFVF9DT0xPUlNbby5nYXNrZXRNYXRlcmlhbF0gfHwgR0FTS0VUX0NPTE9SUy5FUERNOwogIHJldHVybiBvOwp9CgpmdW5jdGlvbiBmaXQobWluWCwgbWF4WCwgbWluWSwgbWF4WSwgdncsIHZoLCBwYWQpIHsKICBjb25zdCBzID0gTWF0aC5taW4oKHZ3IC0gcGFkICogMikgLyAobWF4WCAtIG1pblgpLCAodmggLSBwYWQgKiAyKSAvIChtYXhZIC0gbWluWSkpOwogIGNvbnN0IG94ID0gcGFkIC0gbWluWCAqIHMgKyAodncgLSBwYWQgKiAyIC0gKG1heFggLSBtaW5YKSAqIHMpIC8gMjsKICBjb25zdCBveSA9IHBhZCAtIG1pblkgKiBzICsgKHZoIC0gcGFkICogMiAtIChtYXhZIC0gbWluWSkgKiBzKSAvIDI7CiAgcmV0dXJuIHsgcywgWDogeCA9PiBveCArIHggKiBzLCBZOiB5ID0+IG95ICsgeSAqIHMgfTsKfQoKZnVuY3Rpb24gYmFkZ2UodncsIGxhYmVsKSB7CiAgY29uc3QgdyA9IE1hdGgubWluKHZ3IC0gMjgsIGxhYmVsLmxlbmd0aCAqIDYuNiArIDI2KTsKICBjb25zdCBmaXR0ZWQgPSBsYWJlbC5sZW5ndGggKiA2LjYgKyAyNiA+IHc7CiAgcmV0dXJuIGA8cmVjdCB4PSIke2Z4KHZ3IC8gMiAtIHcgLyAyKX0iIHk9IjE0IiB3aWR0aD0iJHtmeCh3KX0iIGhlaWdodD0iMjAiIHJ4PSIxMCIgZmlsbD0iI2VlZjFmNCIvPgogIDx0ZXh0IHg9IiR7ZngodncgLyAyKX0iIHk9IjI4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiAke0ZPTlR9IGZvbnQtc2l6ZT0iMTEiIGZvbnQtd2VpZ2h0PSI2MDAiIGZpbGw9IiMxYzFjMWMiJHtmaXR0ZWQgPyBgIHRleHRMZW5ndGg9IiR7ZngodyAtIDE4KX0iIGxlbmd0aEFkanVzdD0ic3BhY2luZ0FuZEdseXBocyJgIDogJyd9PiR7ZXNjKGxhYmVsKX08L3RleHQ+YDsKfQovKiBSYS1adXNhdHogLSBpZGVudGlzY2ggenUgZHJhdy5qczogbnVyIGJlc3RhZXRpZ3RlIFdlcnRlIGF1cyBkYXRhLmpzLCBzb25zdCBuaWNodHMuCiAqIERpZSBhbHRlIGhhcnRrb2RpZXJ0ZSBLZXR0ZSBoYXQgamVkZXIgT2JlcmZsYWVjaGUgYXVzc2VyIEgxL0gzIHBhdXNjaGFsICIoUmE8MCw0KSIKICogYW5nZWhhZW5ndCAtIGFsc28gYXVjaCBqZWRlciBrdWVuZnRpZ2VuIG9obmUgYmVzdGFldGlndGVuIFdlcnQuICovCmZ1bmN0aW9uIHJhU3VmZml4KHN1cmZhY2UpIHsKICBjb25zdCBsaXN0ID0gcm9vdCAmJiByb290LldFSVNTX0RBVEEgJiYgcm9vdC5XRUlTU19EQVRBLm9iZXJmbGFlY2hlbjsKICBpZiAoIWxpc3QpIHJldHVybiAnJzsKICBjb25zdCBvID0gbGlzdC5maW5kKHggPT4geC5pZCA9PT0gc3VyZmFjZSk7CiAgaWYgKCFvIHx8IG8ucmFJbm5lbiA9PSBudWxsKSByZXR1cm4gJyc7CiAgcmV0dXJuICcgKFJhJmx0OycgKyBTdHJpbmcoby5yYUlubmVuKS5yZXBsYWNlKCcuJywgJywnKSArICcpJzsKfQpmdW5jdGlvbiBsZWdlbmQodmgsIG8pIHsKICBjb25zdCBpdGVtcyA9IFtbJ0Fuc2ljaHQnLCAnUHJvZHVrdGRhcnN0ZWxsdW5nJ10sIFsnV2Vya3N0b2ZmJywgby53ZXJrc3RvZmZdLAogICAgWydPYmVyZmzDpGNoZScsIG8uc3VyZmFjZSArIHJhU3VmZml4KG8uc3VyZmFjZSldXS5maWx0ZXIoaXQgPT4gaXRbMV0pOwogIGNvbnN0IHkwID0gdmggLSAxNCAtIGl0ZW1zLmxlbmd0aCAqIDE1OyBsZXQgcm93cyA9ICcnOwogIGl0ZW1zLmZvckVhY2goKGl0LCBpKSA9PiB7CiAgICByb3dzICs9IGA8dGV4dCB4PSIxNCIgeT0iJHt5MCArIDEyICsgaSAqIDE1fSIgJHtGT05UfSBmb250LXNpemU9IjExIj4KICAgICAgPHRzcGFuIGZpbGw9IiM5OTkiPiR7aXRbMF19OjwvdHNwYW4+PHRzcGFuIGR4PSI0IiBmb250LXdlaWdodD0iNjAwIiBmaWxsPSIjMWMxYzFjIj4ke2l0WzFdfTwvdHNwYW4+PC90ZXh0PmA7CiAgfSk7CiAgcmV0dXJuIGA8ZyBvcGFjaXR5PSIwLjk1Ij4ke3Jvd3N9PC9nPmA7Cn0KY29uc3Qgc3ZnV3JhcCA9ICh2dywgdmgsIGRlZnMsIGJvZHksIGJkZywgbGdkKSA9PgogIGA8c3ZnIHZpZXdCb3g9IjAgMCAke3Z3fSAke3ZofSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiByb2xlPSJpbWciIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaWRZTWlkIG1lZXQiPgo8ZGVmcz4ke2RlZnN9PC9kZWZzPjxnPiR7Ym9keX08L2c+JHtiZGd9JHtsZ2R9PC9zdmc+YDsKCi8qIEZsdWVnZWxtdXR0ZXIgKEJvbHplbiArIDIgRmx1ZWdlbCArIEh1YiksIEdyb2Vzc2UgfiB1IChFaW5oZWl0IHB4KSAqLwpmdW5jdGlvbiB3aW5nTnV0KGlkYywgY3gsIHRvcFksIHUpIHsKICBsZXQgYiA9IGA8cmVjdCB4PSIke2Z4KGN4IC0gdSAqIDAuNCl9IiB5PSIke2Z4KHRvcFkgLSB1ICogMyl9IiB3aWR0aD0iJHtmeCh1ICogMC44KX0iIGhlaWdodD0iJHtmeCh1ICogMyl9IiByeD0iJHtmeCh1ICogMC4zKX0iIGZpbGw9InVybCgjJHtpZGN9KSIgJHtFREdFfS8+YDsKICBmb3IgKGxldCBpID0gMTsgaSA8PSAzOyBpKyspIGIgKz0gYDxsaW5lIHgxPSIke2Z4KGN4IC0gdSAqIDAuNCl9IiB5MT0iJHtmeCh0b3BZIC0gaSAqIHUgKiAwLjU1KX0iIHgyPSIke2Z4KGN4ICsgdSAqIDAuNCl9IiB5Mj0iJHtmeCh0b3BZIC0gaSAqIHUgKiAwLjU1KX0iIHN0cm9rZT0iIzVhNjU2ZSIgc3Ryb2tlLXdpZHRoPSIwLjgiIHN0cm9rZS1vcGFjaXR5PSIwLjciLz5gOwogIGNvbnN0IG55ID0gdG9wWSAtIHUgKiAyLjY7CiAgYiArPSBgPGVsbGlwc2UgY3g9IiR7ZngoY3ggLSB1ICogMS41NSl9IiBjeT0iJHtmeChueSl9IiByeD0iJHtmeCh1ICogMS41KX0iIHJ5PSIke2Z4KHUgKiAwLjcpfSIgdHJhbnNmb3JtPSJyb3RhdGUoLTI1ICR7ZngoY3ggLSB1ICogMS41NSl9ICR7ZngobnkpfSkiIGZpbGw9InVybCgjJHtpZGN9KSIgJHtFREdFfS8+YDsKICBiICs9IGA8ZWxsaXBzZSBjeD0iJHtmeChjeCArIHUgKiAxLjU1KX0iIGN5PSIke2Z4KG55KX0iIHJ4PSIke2Z4KHUgKiAxLjUpfSIgcnk9IiR7ZngodSAqIDAuNyl9IiB0cmFuc2Zvcm09InJvdGF0ZSgyNSAke2Z4KGN4ICsgdSAqIDEuNTUpfSAke2Z4KG55KX0pIiBmaWxsPSJ1cmwoIyR7aWRjfSkiICR7RURHRX0vPmA7CiAgYiArPSBgPGNpcmNsZSBjeD0iJHtmeChjeCl9IiBjeT0iJHtmeChueSl9IiByPSIke2Z4KHUgKiAwLjY4KX0iIGZpbGw9IiNkNmRkZTIiICR7RURHRX0vPmA7CiAgYiArPSBgPGNpcmNsZSBjeD0iJHtmeChjeCAtIHUgKiAwLjIpfSIgY3k9IiR7ZngobnkgLSB1ICogMC4yKX0iIHI9IiR7ZngodSAqIDAuMjIpfSIgZmlsbD0iI2ZmZiIgb3BhY2l0eT0iMC44Ii8+YDsKICByZXR1cm4gYjsKfQoKLyogLS0gMSkgQ2xhbXAtVmVyYmluZHVuZyAoQXNzZW1ibHkpIC8gQmxpbmRkZWNrZWwgLyBlaW56ZWxuZXIgU3R1dHplbiAtLS0tLS0tCiAqIG1vZGU6IGZhbHNlfCdhc3NlbWJseScgLT4ga29tcGxldHRlIFZlcmJpbmR1bmcgwrcgdHJ1ZXwnY2xvc2VkJyAtPiBCbGluZGRlY2tlbAogKiAgICAgICAnc2luZ2xlJyAgICAgICAgIC0+IEVJTiBTdHV0emVuIChUQ0QvVENTLCBCZXJuZCAxNi4wNy4yMDI2IFBrdC4gOS4yLzkuMyk6CiAqICAgICAgICAgICAgICAgICAgICAgICAgICAga2VpbiB6d2VpdGVzIFJvaHIsIGtlaW5lIERpY2h0dW5nLCBrZWluZSBLbGFtbWVyLgogKiBBbHRlIEJvb2xlYW4tQXVmcnVmZXIgYmxlaWJlbiBndWVsdGlnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCmZ1bmN0aW9uIHJDbGFtcChvLCB2dywgdmgsIG1vZGUpIHsKICBjb25zdCBjbG9zZWQgPSBtb2RlID09PSB0cnVlIHx8IG1vZGUgPT09ICdjbG9zZWQnOwogIGNvbnN0IHNpbmdsZSA9IG1vZGUgPT09ICdzaW5nbGUnOwogIGNvbnN0IGVpbnplbG4gPSBjbG9zZWQgfHwgc2luZ2xlOyAgIC8vIGJlaWRlIHplaWdlbiBudXIgZGVuIGxpbmtlbiBTdHV0emVuCiAgY29uc3QgaWQgPSB1aWQoKTsKICBjb25zdCBSID0gby5vZFIsIGZSID0gby5mbGFuZ2VPZCAvIDI7CiAgLyogVEMtQnVuZDogRUlORSBIb2VoZSBqZSBHcm9lc3NlLCBpZGVudGlzY2ggZnVlciBLSywgS0wgdW5kIGRlbiBkaWNrd2FuZGlnZW4KICAgKiBUYW5rc3R1dHplbiAoQmVybmQgMjcuMDcuMjAyNiwgV29yZC1BYnNjaG5pdHQgMykuIFJlZ2VsIHVuZCBIZXJsZWl0dW5nIHN0ZWhlbgogICAqIGJlaSBUQ19CVU5EIC8gdGNCdW5kSG9laGUgb2Jlbiwgd29ydGdsZWljaCB6dSBkcmF3LmpzLgogICAqIEZydWVoZXIgaGluZyBkZXIgQnVuZCBoaWVyIGFtIFJvaHIt4oyAIFVORCBhbiBkZXIgU3R1dHplbmxhZW5nZSAtIGRhZHVyY2ggd2FyIGVyCiAgICogamUgR3JvZXNzZSBmdWVyIEtLLCBLTCB1bmQgZGlja3dhbmRpZyB2ZXJzY2hpZWRlbiBob2NoLCB1bmQgZGllIEFuc2ljaHQgd2lkZXJzcHJhY2gKICAgKiBkZXIgWmVpY2hudW5nLiBBdWZ0ZWlsdW5nIDI6MSBpbiBCdW5kaG9laGUgdW5kIEZhc2Ugd2llIGluIGRyYXcuanMuCiAgICogQmV6dWdzbGFlbmdlIGlzdCBiZXd1c3N0IG8ubGVuZ3RoIChkYXMgYmVsZWd0ZSBLSy9LTC9oLU1hc3MpLCBOSUNIVCBkaWUgZnVlciBkaWUKICAgKiBCaWxkd2lya3VuZyBnZXN0cmVja3RlIFJvaHJsYWVuZ2UgdEwgLSBzb25zdCBsaWVmZSBkaWUgRGVja2VsdW5nIGlucyBMZWVyZS4KICAgKiBSZWluIHNjaGVtYXRpc2NoLCB0cmFlZ3QgaW4gZGVyIEFuc2ljaHQga2VpbmUgTWFzc3phaGwuICovCiAgY29uc3QgYnVuZEggPSB0Y0J1bmRIb2VoZShvLmZsYW5nZU9kLCBvLmxlbmd0aCk7CiAgY29uc3QgdEZsID0gYnVuZEggKiAyIC8gMzsKICBjb25zdCBjaCA9IGJ1bmRIIC8gMzsKICBjb25zdCBnVCA9IE1hdGgubWF4KDIuNCwgby5vZCAqIDAuMTIpOwogIGNvbnN0IGNsYW1wVCA9IE1hdGgubWF4KDQuNSwgby5vZCAqIDAuMik7CiAgY29uc3QgdEwgPSBNYXRoLm1heChvLmxlbmd0aCwgby5vZCAqIDAuOSk7CiAgLy8gJ3NpbmdsZSc6IERlciBTdHV0emVuIGVuZGV0IGFuIGRlciBGbGFuc2Noc3Rpcm4gKHhmKSAtIGtlaW4gRGVja2VsYXVmc2NobGFnIHdpZSBiZWltCiAgLy8gQmxpbmRkZWNrZWwsIGtlaW4gendlaXRlciBTY2hlbmtlbCB3aWUgYmVpIGRlciBWZXJiaW5kdW5nLgogIGNvbnN0IHgwID0gMCwgeGIgPSB0TCwgeGYgPSB4YiArIHRGbCArIGNoLCB4ZyA9IHhmICsgZ1QsIHhiMiA9IHhnICsgdEZsICsgY2gsCiAgICAgICAgeEVuZCA9IGNsb3NlZCA\\\/IHhmICsgdEZsICogMC45IDogc2luZ2xlID8geGYgOiB4YjIgKyB0TDsKICBjb25zdCBudXRVID0gTWF0aC5tYXgoMy4yLCBjbGFtcFQgKiAwLjYyKTsKICBjb25zdCBtaW5ZID0gLShmUiArIGNsYW1wVCkgLSBudXRVICogNC40LCBtYXhZID0gZlIgKyBjbGFtcFQgKyAxNDsKICBjb25zdCBGID0gZml0KC00LCB4RW5kICsgNCwgbWluWSwgbWF4WSwgdncsIHZoLCA0NCk7CiAgY29uc3QgeyBzLCBYLCBZIH0gPSBGOwoKICBjb25zdCBkZWZzID0KICAgIGxpbkdyYWRBQihpZCArICd0dScsIDAsIFkoLVIpLCAwLCBZKFIpLCBDSFJPTUUpICsKICAgIGxpbkdyYWRBQihpZCArICdmbCcsIDAsIFkoLWZSKSwgMCwgWShmUiksIENIUk9NRSkgKwogICAgbGluR3JhZEFCKGlkICsgJ2NsJywgMCwgWSgtKGZSICsgY2xhbXBUKSksIDAsIFkoZlIgKyBjbGFtcFQpLCBTQVRJTikgKwogICAgc2hhZG93R3JhZChpZCkgKyBibHVyRGVmKGlkLCBSICogcyAqIDAuMSk7CgogIGxldCBiID0gJyc7CiAgYiArPSBgPGVsbGlwc2UgY3g9IiR7ZngoWCh4RW5kIC8gMikpfSIgY3k9IiR7ZngoWShmUiArIGNsYW1wVCkgKyAxMil9IiByeD0iJHtmeCh4RW5kICogcyAqIDAuNTUpfSIgcnk9IiR7ZngoTWF0aC5tYXgoOCwgUiAqIHMgKiAwLjUpKX0iIGZpbGw9InVybCgjJHtpZH0tc2gpIi8+YDsKICAvLyBSb2hyIGxpbmtzICgrIHJlY2h0cyB3ZW5uIFZlcmJpbmR1bmcpCiAgYiArPSBgPHJlY3QgeD0iJHtmeChYKHgwKSl9IiB5PSIke2Z4KFkoLVIpKX0iIHdpZHRoPSIke2Z4KCh4YiArIGNoKSAqIHMpfSIgaGVpZ2h0PSIke2Z4KDIgKiBSICogcyl9IiBmaWxsPSJ1cmwoIyR7aWR9dHUpIiAke0VER0V9Lz5gOwogIGlmICghZWluemVsbikgYiArPSBgPHJlY3QgeD0iJHtmeChYKHhiMiAtIGNoKSl9IiB5PSIke2Z4KFkoLVIpKX0iIHdpZHRoPSIke2Z4KCh4RW5kIC0geGIyICsgY2gpICogcyl9IiBoZWlnaHQ9IiR7ZngoMiAqIFIgKiBzKX0iIGZpbGw9InVybCgjJHtpZH10dSkiICR7RURHRX0vPmA7CiAgLy8gRmxhbnNjaC1TY2h1bHRlcm4KICBjb25zdCBzaFgwID0geGIgLSAwLjUsIHNoWDEgPSBlaW56ZWxuID8geEVuZCA6IHhiMiArIDAuNTsKICBiICs9IGA8cmVjdCB4PSIke2Z4KFgoc2hYMCkpfSIgeT0iJHtmeChZKC1mUikpfSIgd2lkdGg9IiR7ZngoKHNoWDEgLSBzaFgwKSAqIHMpfSIgaGVpZ2h0PSIke2Z4KDIgKiBmUiAqIHMpfSIgcng9IiR7ZngoY2ggKiBzKX0iIGZpbGw9InVybCgjJHtpZH1mbCkiICR7RURHRX0vPmA7CiAgYiArPSBgPHJlY3QgeD0iJHtmeChYKHNoWDApIC0gMi41KX0iIHk9IiR7ZngoWSgtUikpfSIgd2lkdGg9IjMiIGhlaWdodD0iJHtmeCgyICogUiAqIHMpfSIgZmlsbD0iIzAwMCIgb3BhY2l0eT0iMC4xNiIvPmA7CiAgaWYgKCFlaW56ZWxuKSBiICs9IGA8cmVjdCB4PSIke2Z4KFgoc2hYMSkgLSAwLjUpfSIgeT0iJHtmeChZKC1SKSl9IiB3aWR0aD0iMyIgaGVpZ2h0PSIke2Z4KDIgKiBSICogcyl9IiBmaWxsPSIjMDAwIiBvcGFjaXR5PSIwLjE2Ii8+YDsKCiAgaWYgKGNsb3NlZCkgewogICAgLy8gQmxpbmRkZWNrZWw6IFN0aXJuZmxhZWNoZSBtaXQgaGVsbGVyIEthbnRlCiAgICBiICs9IGA8cmVjdCB4PSIke2Z4KFgoeEVuZCkgLSAzKX0iIHk9IiR7ZngoWSgtZlIpICsgMSl9IiB3aWR0aD0iMy41IiBoZWlnaHQ9IiR7ZngoMiAqIGZSICogcyAtIDIpfSIgcng9IjEuNiIgZmlsbD0iI2VlZjJmNSIgb3BhY2l0eT0iMC45Ii8+YDsKICB9IGVsc2UgaWYgKCFzaW5nbGUpIHsKICAgIC8vIEtsYW1tZXItQmFuZCArIFNpY2tlIChpbiBEaWNodHVuZ3NmYXJiZSBhbmdlZGV1dGV0KSArIEdsYW56LgogICAgLy8gQmVpbSBlaW56ZWxuZW4gU3R1dHplbiAoJ3NpbmdsZScpIGJld3Vzc3QgTklDSFQ6IEtsYW1tZXIgdW5kIERpY2h0dW5nIHNpbmQgZWlnZW5lCiAgICAvLyBBcnRpa2VsIHVuZCBnZWhvZXJlbiBuaWNodCBpbnMgQmlsZCBlaW5lcyBlaW56ZWxuZW4gU3R1dHplbnMgKEJlcm5kLCBQa3QuIDkuMi85LjMpLgogICAgY29uc3QgYngwID0geGIgKyBjaCwgYngxID0geGIyIC0gY2gsIGJ3ID0gKGJ4MSAtIGJ4MCkgKiBzLCBiaCA9IDIgKiAoZlIgKyBjbGFtcFQpICogczsKICAgIGIgKz0gYDxyZWN0IHg9IiR7ZngoWChieDApKX0iIHk9IiR7ZngoWSgtKGZSICsgY2xhbXBUKSkpfSIgd2lkdGg9IiR7ZngoYncpfSIgaGVpZ2h0PSIke2Z4KGJoKX0iIHJ4PSIke2Z4KGNsYW1wVCAqIHMgKiAwLjkpfSIgZmlsbD0idXJsKCMke2lkfWNsKSIgJHtFREdFfS8+YDsKICAgIGIgKz0gYDxsaW5lIHgxPSIke2Z4KFgoKGJ4MCArIGJ4MSkgLyAyKSl9IiB5MT0iJHtmeChZKC0oZlIgKyBjbGFtcFQgKiAwLjUpKSl9IiB4Mj0iJHtmeChYKChieDAgKyBieDEpIC8gMikpfSIgeTI9IiR7ZngoWShmUiArIGNsYW1wVCAqIDAuNSkpfSIgc3Ryb2tlPSIke28uZ0NvbH0iIHN0cm9rZS1vcGFjaXR5PSIwLjc1IiBzdHJva2Utd2lkdGg9IjIiLz5gOwogICAgYiArPSBgPHJlY3QgeD0iJHtmeChYKGJ4MCkgKyAyKX0iIHk9IiR7ZngoWSgtKGZSICsgY2xhbXBUICogMC4zNSkpKX0iIHdpZHRoPSIke2Z4KGJ3IC0gNCl9IiBoZWlnaHQ9IiR7ZngoY2xhbXBUICogMC42ICogcyl9IiBmaWxsPSIjZmZmIiBvcGFjaXR5PSIwLjM4IiByeD0iMyIgZmlsdGVyPSJ1cmwoIyR7aWR9LWJsKSIvPmA7CiAgICBiICs9IGA8cmVjdCB4PSIke2Z4KFgoYngwKSArIDIpfSIgeT0iJHtmeChZKGZSIC0gY2xhbXBUICogMC40KSl9IiB3aWR0aD0iJHtmeChidyAtIDQpfSIgaGVpZ2h0PSIke2Z4KGNsYW1wVCAqIDAuNSAqIHMpfSIgZmlsbD0iIzM4NDI0YSIgb3BhY2l0eT0iMC4zMiIgcng9IjMiIGZpbHRlcj0idXJsKCMke2lkfS1ibCkiLz5gOwogICAgYiArPSB3aW5nTnV0KGlkICsgJ2NsJywgWCgoYngwICsgYngxKSAvIDIpLCBZKC0oZlIgKyBjbGFtcFQpKSwgbnV0VSAqIHMgKiAwLjU1ICsgNCk7CiAgfQogIC8vIEdsYW56LVN0cmVpZmVuIFJvaHJlICsgU2Nod2Vpc3NlbmRlbgogIGIgKz0gYDxyZWN0IHg9IiR7ZngoWCh4MCkgKyAyKX0iIHk9IiR7ZngoWSgtUiAqIDAuMjUpKX0iIHdpZHRoPSIke2Z4KCh4YiArIGNoKSAqIHMgLSA0KX0iIGhlaWdodD0iJHtmeChNYXRoLm1heCgzLCBSICogMC4yOCAqIHMpKX0iIGZpbGw9IiNmZmYiIG9wYWNpdHk9IjAuNiIgcng9IjMiIGZpbHRlcj0idXJsKCMke2lkfS1ibCkiLz5gOwogIGlmICghZWluemVsbikgYiArPSBgPHJlY3QgeD0iJHtmeChYKHhiMiAtIGNoKSArIDIpfSIgeT0iJHtmeChZKC1SICogMC4yNSkpfSIgd2lkdGg9IiR7ZngoKHhFbmQgLSB4YjIgKyBjaCkgKiBzIC0gNCl9IiBoZWlnaHQ9IiR7ZngoTWF0aC5tYXgoMywgUiAqIDAuMjggKiBzKSl9IiBmaWxsPSIjZmZmIiBvcGFjaXR5PSIwLjYiIHJ4PSIzIiBmaWx0ZXI9InVybCgjJHtpZH0tYmwpIi8+YDsKICBiICs9IGA8cmVjdCB4PSIke2Z4KFgoeDApIC0gMil9IiB5PSIke2Z4KFkoLVIpKX0iIHdpZHRoPSIzIiBoZWlnaHQ9IiR7ZngoMiAqIFIgKiBzKX0iIGZpbGw9IiMyZjM5NDAiIG9wYWNpdHk9IjAuODUiIHJ4PSIxIi8+YDsKICBpZiAoIWVpbnplbG4pIGIgKz0gYDxyZWN0IHg9IiR7ZngoWCh4RW5kKSAtIDEpfSIgeT0iJHtmeChZKC1SKSl9IiB3aWR0aD0iMyIgaGVpZ2h0PSIke2Z4KDIgKiBSICogcyl9IiBmaWxsPSIjMmYzOTQwIiBvcGFjaXR5PSIwLjg1IiByeD0iMSIvPmA7CgogIGNvbnN0IGJkZyA9IGJhZGdlKHZ3LCAoY2xvc2VkID8gJ0JsaW5kZGVja2VsJyA6IHNpbmdsZSA\\\/ICdTdHV0emVuJyA6ICdDbGFtcC1WZXJiaW5kdW5nJykgKyAnIMK3IEROICcgKyBvLmRuICsgJyDCtyBESU4gMzI2NzYnKTsKICByZXR1cm4gc3ZnV3JhcCh2dywgdmgsIGRlZnMsIGIsIGJkZywgbGVnZW5kKHZoLCBvKSk7Cn0KCi8qIC0tIDIpIEtsYW1tZXIgKEZyb250YW5zaWNodCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBSdW5kZSA3IChXLTA1OSk6IG51dHp0IGRhcyBiZWxlZ3RlIEF1c3Nlbm1hc3Mga2xhbW1lckEgKCJNYXNzZSBLbGVtbWVuLAogKiBCbGluZGRlY2tlbC54bHN4IiksIHdlbm4gZXMgZGVyIEF1ZnJ1ZmVyIGxpZWZlcnQuIEtsYW1tZXJ0eXBlbiAoYmVsZWd0LAogKiBCZXJuZCBSMi00KTogS0wxID0gMSBHZWxlbmsvMSBQaW4sIEtMTEkgPSAxIEdlbGVuay8yIFBpbnMsIEtMSCA9IHp3ZWkKICogSGFsYnNjaGFsZW4gbWl0IDIgR2VsZW5rZW4gKHp1c2FldHpsaWNoZSBUcmVubmZ1Z2VuKS4gTXV0dGVyOiBNID0gRmx1ZWdlbCwKICogUyA9IFNlY2hza2FudC4gKi8KZnVuY3Rpb24gcktsYW1tZXIobywgdncsIHZoKSB7CiAgY29uc3QgaWQgPSB1aWQoKTsKICBjb25zdCBmUiA9IG8uZmxhbmdlT2QgLyAyOwogIGNvbnN0IGhhc0EgPSBwb3NpdGl2ZShvLmtsYW1tZXJBKSAmJiBvLmtsYW1tZXJBID4gby5mbGFuZ2VPZDsKICAvLyBGYWlsLWNsb3NlZDogb2huZSBiZWxlZ3RlcyBBdXNzZW5tYXNzIEEga2VpbmUgS2xhbW1lciB6ZWljaG5lbiAoUnVuZGUgNykuCiAgaWYgKCFoYXNBKSByZXR1cm4gclBsYXR6aGFsdGVyKG8sIHZ3LCB2aCk7CiAgY29uc3QgYmFuZCA9IG8ua2xhbW1lckEgLyAyIC0gZlI7CiAgLy8gSW5uZW5mbGFlY2hlIGJlZ3Jlbnplbjogb2huZSBSb2hyLeKMgCAocmVpbmUgRmxhbnNjaC1BdXN3YWhsKSBkYXJmIGRpZQogIC8vIEJvaHJ1bmcgZGllIERpY2h0c2l0ei1GbGFlY2hlIG5pY2h0IHVlYmVyZGVja2VuLgogIGNvbnN0IGJvcmUgPSBNYXRoLm1pbihNYXRoLm1heCgzLCBvLm9kUiAqIDAuOSksIGZSICogMC42KTsKICBjb25zdCBleHQgPSBmUiArIGJhbmQ7CiAgY29uc3QgRiA9IGZpdCgtZXh0IC0gMTQsIGV4dCArIDE0LCAtZXh0IC0gYmFuZCAqIDIuNiwgZXh0ICsgMTAsIHZ3LCB2aCwgNDYpOwogIGNvbnN0IHsgcyB9ID0gRjsgY29uc3QgY3ggPSBGLlgoMCksIGN5ID0gRi5ZKDApOwoKICBjb25zdCBkZWZzID0KICAgIGxpbkdyYWRBQihpZCArICdyaW5nJywgMCwgY3kgLSBleHQgKiBzLCAwLCBjeSArIGV4dCAqIHMsIFsKICAgICAgWzAsICcjZThlZGYxJ10sIFswLjI4LCAnI2MzY2RkNCddLCBbMC41NSwgJyM5YWE2YWYnXSwgWzAuODIsICcjNzg4NThmJ10sIFsxLCAnIzY2NzI3YyddXSkgKwogICAgbGluR3JhZEFCKGlkICsgJ2ZhY2UnLCAwLCBjeSAtIGZSICogcywgMCwgY3kgKyBmUiAqIHMsIFsKICAgICAgWzAsICcjZjJmNWY4J10sIFswLjQ1LCAnI2Q0ZGNlMiddLCBbMSwgJyNhMmFlYjcnXV0pICsKICAgIHJhZEdyYWQoaWQgKyAnYm9yZScsIGN4LCBjeSAtIGJvcmUgKiBzICogMC4yNSwgYm9yZSAqIHMgKiAxLjUsIFsKICAgICAgWzAsICcjZmZmZmZmJ10sIFswLjcsICcjZWVmMWY0J10sIFsxLCAnI2RkZTNlOCddXSkgKwogICAgc2hhZG93R3JhZChpZCkgKyBibHVyRGVmKGlkLCBiYW5kICogcyAqIDAuMTIpOwoKICBsZXQgYiA9ICcnOwogIGIgKz0gYDxlbGxpcHNlIGN4PSIke2Z4KGN4KX0iIGN5PSIke2Z4KGN5ICsgZXh0ICogcyArIDEyKX0iIHJ4PSIke2Z4KGV4dCAqIHMgKiAwLjkpfSIgcnk9IiR7ZngoZXh0ICogcyAqIDAuMTQpfSIgZmlsbD0idXJsKCMke2lkfS1zaCkiLz5gOwogIGIgKz0gYDxjaXJjbGUgY3g9IiR7ZngoY3gpfSIgY3k9IiR7ZngoY3kpfSIgcj0iJHtmeCgoZlIgKyBiYW5kIC8gMikgKiBzKX0iIGZpbGw9Im5vbmUiIHN0cm9rZT0idXJsKCMke2lkfXJpbmcpIiBzdHJva2Utd2lkdGg9IiR7ZngoYmFuZCAqIHMpfSIvPmA7CiAgYiArPSBgPGNpcmNsZSBjeD0iJHtmeChjeCl9IiBjeT0iJHtmeChjeSl9IiByPSIke2Z4KChmUiArIGJhbmQpICogcyl9IiBmaWxsPSJub25lIiAke0VER0V9Lz5gOwogIGIgKz0gYDxjaXJjbGUgY3g9IiR7ZngoY3gpfSIgY3k9IiR7ZngoY3kpfSIgcj0iJHtmeChmUiAqIHMpfSIgZmlsbD0ibm9uZSIgJHtFREdFfS8+YDsKICBiICs9IGA8cGF0aCBkPSJNICR7ZngoY3ggLSAoZlIgKyBiYW5kICogMC43OCkgKiBzICogMC43Nyl9ICR7ZngoY3kgLSAoZlIgKyBiYW5kICogMC43OCkgKiBzICogMC42NCl9IEEgJHtmeCgoZlIgKyBiYW5kICogMC43OCkgKiBzKX0gJHtmeCgoZlIgKyBiYW5kICogMC43OCkgKiBzKX0gMCAwIDEgJHtmeChjeCArIChmUiArIGJhbmQgKiAwLjc4KSAqIHMgKiAwLjc3KX0gJHtmeChjeSAtIChmUiArIGJhbmQgKiAwLjc4KSAqIHMgKiAwLjY0KX0iCiAgICAgICAgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utb3BhY2l0eT0iMC41NSIgc3Ryb2tlLXdpZHRoPSIke2Z4KGJhbmQgKiBzICogMC4xOCl9IiBzdHJva2UtbGluZWNhcD0icm91bmQiIGZpbHRlcj0idXJsKCMke2lkfS1ibCkiLz5gOwogIC8vIFNlZ21lbnQtRnVnZW46IEtMMS9LTExJIHp3ZWl0ZWlsaWcgKEZ1Z2VuIGxpbmtzL3JlY2h0cyArIExhc2NoZW4pLgogIFsxODAsIDBdLmZvckVhY2goYSA9PiB7CiAgICBjb25zdCBhciA9IGEgKiBNYXRoLlBJIC8gMTgwOwogICAgYiArPSBgPGxpbmUgeDE9IiR7ZngoY3ggKyBmUiAqIHMgKiBNYXRoLmNvcyhhcikpfSIgeTE9IiR7ZngoY3kgKyBmUiAqIHMgKiBNYXRoLnNpbihhcikpfSIgeDI9IiR7ZngoY3ggKyAoZlIgKyBiYW5kKSAqIHMgKiBNYXRoLmNvcyhhcikpfSIgeTI9IiR7ZngoY3kgKyAoZlIgKyBiYW5kKSAqIHMgKiBNYXRoLnNpbihhcikpfSIgc3Ryb2tlPSIjMzk0MzRiIiBzdHJva2Utb3BhY2l0eT0iMC42NSIgc3Ryb2tlLXdpZHRoPSIxLjYiLz5gOwogICAgY29uc3QgbHggPSBjeCArIChmUiArIGJhbmQpICogcyAqIE1hdGguY29zKGFyKSwgbHkgPSBjeSArIChmUiArIGJhbmQpICogcyAqIE1hdGguc2luKGFyKTsKICAgIGIgKz0gYDxyZWN0IHg9IiR7ZngobHggLSBiYW5kICogcyAqIDAuMzIpfSIgeT0iJHtmeChseSAtIGJhbmQgKiBzICogMC43NSl9IiB3aWR0aD0iJHtmeChiYW5kICogcyAqIDAuNjQpfSIgaGVpZ2h0PSIke2Z4KGJhbmQgKiBzICogMS41KX0iIHJ4PSIke2Z4KGJhbmQgKiBzICogMC4yMil9IiBmaWxsPSJ1cmwoIyR7aWR9cmluZykiICR7RURHRX0vPmA7CiAgfSk7CiAgLy8gS0xIOiB6d2VpIEhhbGJzY2hhbGVuIC0+IHp1c2FldHpsaWNoZSBGdWdlbiBvYmVuL3VudGVuICh6d2VpdGVzIEdlbGVua3BhYXIpCiAgaWYgKG8ua2xhbW1lclR5cCA9PT0gJ0tMSCcpIHsKICAgIFs5MCwgMjcwXS5mb3JFYWNoKGEgPT4gewogICAgICBjb25zdCBhciA9IGEgKiBNYXRoLlBJIC8gMTgwOwogICAgICBiICs9IGA8bGluZSB4MT0iJHtmeChjeCArIGZSICogcyAqIE1hdGguY29zKGFyKSl9IiB5MT0iJHtmeChjeSArIGZSICogcyAqIE1hdGguc2luKGFyKSl9IiB4Mj0iJHtmeChjeCArIChmUiArIGJhbmQpICogcyAqIE1hdGguY29zKGFyKSl9IiB5Mj0iJHtmeChjeSArIChmUiArIGJhbmQpICogcyAqIE1hdGguc2luKGFyKSl9IiBzdHJva2U9IiMzOTQzNGIiIHN0cm9rZS1vcGFjaXR5PSIwLjY1IiBzdHJva2Utd2lkdGg9IjEuNiIvPmA7CiAgICB9KTsKICB9CiAgLy8gRmxhbnNjaC1TY2hlaWJlICsgRGljaHRzaXR6ICsgQm9ocnVuZwogIGIgKz0gYDxjaXJjbGUgY3g9IiR7ZngoY3gpfSIgY3k9IiR7ZngoY3kpfSIgcj0iJHtmeChmUiAqIHMpfSIgZmlsbD0idXJsKCMke2lkfWZhY2UpIi8+YDsKICBiICs9IGA8Y2lyY2xlIGN4PSIke2Z4KGN4KX0iIGN5PSIke2Z4KGN5KX0iIHI9IiR7ZngoKGJvcmUgKyAoZlIgLSBib3JlKSAqIDAuNSkgKiBzKX0iIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzhkOTlhMiIgc3Ryb2tlLW9wYWNpdHk9IjAuNTUiIHN0cm9rZS13aWR0aD0iMS4xIi8+YDsKICBiICs9IGA8Y2lyY2xlIGN4PSIke2Z4KGN4KX0iIGN5PSIke2Z4KGN5KX0iIHI9IiR7ZngoYm9yZSAqIHMpfSIgZmlsbD0idXJsKCMke2lkfWJvcmUpIiAke0VER0V9Lz5gOwogIGIgKz0gYDxjaXJjbGUgY3g9IiR7ZngoY3gpfSIgY3k9IiR7ZngoY3kgLSAwLjgpfSIgcj0iJHtmeChNYXRoLm1heCgxLCBib3JlICogcyAtIDEuNikpfSIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjNWY2Yjc0IiBzdHJva2Utb3BhY2l0eT0iMC44IiBzdHJva2Utd2lkdGg9IjEuNiIvPmA7CiAgLy8gVmVyc2NobHVzcyBvYmVuOiBNID0gRmx1ZWdlbG11dHRlciwgUyA9IFNlY2hza2FudG11dHRlciAoYmVsZWd0LCBSMi00KQogIGlmIChvLmtsYW1tZXJNdXR0ZXIgPT09ICdTJykgewogICAgY29uc3QgaHcgPSBNYXRoLm1heCg0LCBiYW5kICogcyAqIDAuNSksIGh5ID0gY3kgLSAoZlIgKyBiYW5kKSAqIHMgLSBodyAqIDAuOTsKICAgIGIgKz0gYDxyZWN0IHg9IiR7ZngoY3ggLSBodyAqIDAuMzQpfSIgeT0iJHtmeChoeSl9IiB3aWR0aD0iJHtmeChodyAqIDAuNjgpfSIgaGVpZ2h0PSIke2Z4KGh3ICogMC45KX0iIGZpbGw9InVybCgjJHtpZH1yaW5nKSIgJHtFREdFfS8+YDsKICAgIGNvbnN0IGhleCA9IFtbY3ggLSBodywgaHldLFtjeCAtIGh3IC8gMiwgaHkgLSBodyAqIDAuNzJdLFtjeCArIGh3IC8gMiwgaHkgLSBodyAqIDAuNzJdLFtjeCArIGh3LCBoeV0sW2N4ICsgaHcgLyAyLCBoeSArIGh3ICogMC43Ml0sW2N4IC0gaHcgLyAyLCBoeSArIGh3ICogMC43Ml1dCiAgICAgIC5tYXAocHQgPT4gZngocHRbMF0pICsgJywnICsgZngocHRbMV0pKS5qb2luKCcgJyk7CiAgICBiICs9IGA8cG9seWdvbiBwb2ludHM9IiR7aGV4fSIgZmlsbD0idXJsKCMke2lkfXJpbmcpIiAke0VER0V9Lz5gOwogIH0gZWxzZSB7CiAgICBiICs9IHdpbmdOdXQoaWQgKyAncmluZycsIGN4LCBjeSAtIChmUiArIGJhbmQpICogcywgTWF0aC5tYXgoMy40LCBiYW5kICogcyAqIDAuNDIpKTsKICB9CiAgLy8gR2VsZW5rIHVudGVuOiBLTDEvS0xIIGVpbiBQaW4sIEtMTEkgendlaSBQaW5zCiAgY29uc3QgZ3kgPSBjeSArIChmUiArIGJhbmQpICogcyAtIDQ7CiAgYiArPSBgPHJlY3QgeD0iJHtmeChjeCAtIGJhbmQgKiBzICogMC41NSl9IiB5PSIke2Z4KGd5KX0iIHdpZHRoPSIke2Z4KGJhbmQgKiBzICogMS4xKX0iIGhlaWdodD0iJHtmeChiYW5kICogcyAqIDAuODUpfSIgcng9IiR7ZngoYmFuZCAqIHMgKiAwLjMpfSIgZmlsbD0idXJsKCMke2lkfXJpbmcpIiAke0VER0V9Lz5gOwogIGlmIChvLmtsYW1tZXJUeXAgPT09ICdLTExJJykgewogICAgYiArPSBgPGNpcmNsZSBjeD0iJHtmeChjeCAtIGJhbmQgKiBzICogMC4zKX0iIGN5PSIke2Z4KGd5ICsgYmFuZCAqIHMgKiAwLjQyKX0iIHI9IiR7ZngoTWF0aC5tYXgoMS42LCBiYW5kICogcyAqIDAuMTYpKX0iIGZpbGw9IiM0NTRmNTciLz5gOwogICAgYiArPSBgPGNpcmNsZSBjeD0iJHtmeChjeCArIGJhbmQgKiBzICogMC4zKX0iIGN5PSIke2Z4KGd5ICsgYmFuZCAqIHMgKiAwLjQyKX0iIHI9IiR7ZngoTWF0aC5tYXgoMS42LCBiYW5kICogcyAqIDAuMTYpKX0iIGZpbGw9IiM0NTRmNTciLz5gOwogIH0gZWxzZSB7CiAgICBiICs9IGA8Y2lyY2xlIGN4PSIke2Z4KGN4KX0iIGN5PSIke2Z4KGd5ICsgYmFuZCAqIHMgKiAwLjQyKX0iIHI9IiR7ZngoTWF0aC5tYXgoMS44LCBiYW5kICogcyAqIDAuMikpfSIgZmlsbD0iIzQ1NGY1NyIvPmA7CiAgfQogIGNvbnN0IGJkZyA9IGJhZGdlKHZ3LCAnS2xhbW1lciAnICsgby5rbGFtbWVyVHlwICsgJyDCtyBLbGVtbS3ijIAgJyArIFN0cmluZyhmeChvLmZsYW5nZU9kKSkucmVwbGFjZSgnLicsICcsJykgKyAnIMK3IERJTiAzMjY3NicpOwogIHJldHVybiBzdmdXcmFwKHZ3LCB2aCwgZGVmcywgYiwgYmRnLCBsZWdlbmQodmgsIG8pKTsKfQoKLyogLS0gMmIpIEJsaW5kZGVja2VsIChTZWl0ZW5hbnNpY2h0KSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIFJ1bmRlIDcgKFctMDU5KTogUHJvZHVrdC1EYXJzdGVsbHVuZyBuYWNoIE1hc3N6ZWljaG51bmcgQmxpbmRkZWNrZWwuc3ZnLgogKiBOdXIgYmVsZWd0ZSBNYXNzZTogQSA9IEZsYW5zY2gtw5ggKGZsYW5nZU9kKSwgTCA9IERlY2tlbHN0YWVya2UgKGxlbmd0aCkuCiAqIE9obmUgYmVsZWd0ZSBEZWNrZWxzdGFlcmtlIC0+IFBsYXR6aGFsdGVyIHN0YXR0IGdlcmF0ZW5lciBEaWNrZS4gKi8KZnVuY3Rpb24gckJsaW5kZGVja2VsKG8sIHZ3LCB2aCkgewogIGlmICghcG9zaXRpdmUoby5mbGFuZ2VPZCkgfHwgIXBvc2l0aXZlKG8ubGVuZ3RoKSkgcmV0dXJuIHJQbGF0emhhbHRlcihvLCB2dywgdmgpOwogIGNvbnN0IGlkID0gdWlkKCk7CiAgY29uc3QgQSA9IG8uZmxhbmdlT2QsIEwgPSBvLmxlbmd0aCwgciA9IEEgLyAyOwogIGNvbnN0IEYgPSBmaXQoLTIsIEwgKyAyLCAtciwgciArIDE0LCB2dywgdmgsIDYwKTsKICBjb25zdCB7IHMsIFgsIFkgfSA9IEY7CiAgY29uc3QgZGVmcyA9CiAgICBsaW5HcmFkQUIoaWQgKyAnY2FwJywgMCwgWSgtciksIDAsIFkociksIENIUk9NRSkgKwogICAgbGluR3JhZEFCKGlkICsgJ2ZhY2UnLCBYKDApLCAwLCBYKEwpLCAwLCBbCiAgICAgIFswLCAnIzdlOGM5NiddLCBbMC4zNSwgJyNkNGRjZTInXSwgWzAuNywgJyNmNGY3ZjknXSwgWzEsICcjOThhNGFkJ11dKSArCiAgICBzaGFkb3dHcmFkKGlkKSArIGJsdXJEZWYoaWQsIE1hdGgubWF4KDAuOCwgciAqIHMgKiAwLjA2KSk7CiAgbGV0IGIgPSAnJzsKICBiICs9IGA8ZWxsaXBzZSBjeD0iJHtmeChYKEwgLyAyKSl9IiBjeT0iJHtmeChZKHIpICsgMTIpfSIgcng9IiR7ZngoTWF0aC5tYXgoMTAsIEEgKiBzICogMC4yNCkpfSIgcnk9IiR7ZngoTWF0aC5tYXgoNiwgQSAqIHMgKiAwLjEpKX0iIGZpbGw9InVybCgjJHtpZH0tc2gpIi8+YDsKICAvLyBTY2hlaWJlIChDaHJvbSkgKyBTdGlybnNlaXRlIG1pdCBlaWdlbmVyIFNjaGF0dGllcnVuZwogIGIgKz0gYDxyZWN0IHg9IiR7ZngoWCgwKSl9IiB5PSIke2Z4KFkoLXIpKX0iIHdpZHRoPSIke2Z4KEwgKiBzKX0iIGhlaWdodD0iJHtmeChBICogcyl9IiBmaWxsPSJ1cmwoIyR7aWR9Y2FwKSIgJHtFREdFfS8+YDsKICBiICs9IGA8cmVjdCB4PSIke2Z4KFgoTCkgLSBNYXRoLm1heCgxLjUsIEwgKiBzICogMC4yOCkpfSIgeT0iJHtmeChZKC1yKSl9IiB3aWR0aD0iJHtmeChNYXRoLm1heCgxLjUsIEwgKiBzICogMC4yOCkpfSIgaGVpZ2h0PSIke2Z4KEEgKiBzKX0iIGZpbGw9InVybCgjJHtpZH1mYWNlKSIgJHtFREdFfS8+YDsKICAvLyBHbGFuei1TdHJlaWZlbiB1ZWJlciBkaWUgU3Rpcm5mbGFlY2hlCiAgYiArPSBgPHJlY3QgeD0iJHtmeChYKDApICsgMSl9IiB5PSIke2Z4KFkoLXIgKiAwLjU1KSl9IiB3aWR0aD0iJHtmeChMICogcyAtIDIpfSIgaGVpZ2h0PSIke2Z4KE1hdGgubWF4KDIsIEEgKiBzICogMC4xNCkpfSIgZmlsbD0iI2ZmZiIgb3BhY2l0eT0iMC40NSIgcng9IjIiIGZpbHRlcj0idXJsKCMke2lkfS1ibCkiLz5gOwogIGIgKz0gYDxyZWN0IHg9IiR7ZngoWCgwKSArIDEpfSIgeT0iJHtmeChZKHIgKiAwLjQ1KSl9IiB3aWR0aD0iJHtmeChMICogcyAtIDIpfSIgaGVpZ2h0PSIke2Z4KE1hdGgubWF4KDIsIEEgKiBzICogMC4xMikpfSIgZmlsbD0iIzM4NDI0YSIgb3BhY2l0eT0iMC4zIiByeD0iMiIgZmlsdGVyPSJ1cmwoIyR7aWR9LWJsKSIvPmA7CiAgY29uc3QgYmRnID0gYmFkZ2UodncsICdCbGluZGRlY2tlbCDCtyBGbGFuc2NoLeKMgCAnICsgU3RyaW5nKGZ4KEEpKS5yZXBsYWNlKCcuJywgJywnKSArICcgwrcgRElOIDMyNjc2Jyk7CiAgcmV0dXJuIHN2Z1dyYXAodncsIHZoLCBkZWZzLCBiLCBiZGcsIGxlZ2VuZCh2aCwgbykpOwp9CgovKiAtLSAyYykgRGljaHR1bmcgKFByb2R1a3QtRGFyc3RlbGx1bmcpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIFJ1bmRlIDcgKFctMDU5KTogUmluZyBpbiBEaWNodHVuZ3NmYXJiZSBuYWNoIGRlbiBnZWxpZWZlcnRlbiBQcm9maWxiaWxkZXJuCiAqIChUeXAgSSBvaG5lIExpcHBlIC8gVHlwIElJIG1pdCBMaXBwZSwgMjIuMDcuMjAyNikuIEJlbGVndGUgTWFzc2U6IEUgPQogKiBnYXNrZXRPZCwgQyA9IGdhc2tldElkLiBUeXAgSUkgdHJhZWd0IGVpbmUgZXJoYWJlbmUgTGlwcGUgYW0gQXVzc2VucmFuZCwKICogVHlwIEkgaXN0IGdsYXR0IC0gZGFkdXJjaCBzaW5kIGJlaWRlIHNpY2h0YmFyIHVudGVyc2NoZWlkYmFyLiBPaG5lIGJlbGVndGUKICogRS9DLU1hc3NlIC0+IFBsYXR6aGFsdGVyLiAqLwpmdW5jdGlvbiByRGljaHR1bmcobywgdncsIHZoKSB7CiAgaWYgKCFwb3NpdGl2ZShvLmdhc2tldE9kKSB8fCAhcG9zaXRpdmUoby5nYXNrZXRJZCkgfHwgby5nYXNrZXRJZCA+PSBvLmdhc2tldE9kKSB7CiAgICByZXR1cm4gclBsYXR6aGFsdGVyKG8sIHZ3LCB2aCk7CiAgfQogIGNvbnN0IGlkID0gdWlkKCk7CiAgY29uc3QgckUgPSBvLmdhc2tldE9kIC8gMiwgckMgPSBvLmdhc2tldElkIC8gMjsKICBjb25zdCBsaXBwZSA9IG8uZ2Fza2V0VHlwZSA9PT0gJ0lJJzsKICBjb25zdCBleHQgPSByRSAqIChsaXBwZSA\\\/IDEuMTQgOiAxKTsKICBjb25zdCBGID0gZml0KC1leHQgLSA4LCBleHQgKyA4LCAtZXh0IC0gMTAsIGV4dCArIDE2LCB2dywgdmgsIDUwKTsKICBjb25zdCB7IHMgfSA9IEY7IGNvbnN0IGN4ID0gRi5YKDApLCBjeSA9IEYuWSgwKTsKICBjb25zdCBzaGFkZSA9IChoZXgsIGYpID0+IHsKICAgIGNvbnN0IG4gPSBwYXJzZUludChoZXguc2xpY2UoMSksIDE2KTsKICAgIGNvbnN0IGNoID0gdiA9PiBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQodiAqIGYpKSk7CiAgICByZXR1cm4gJyMnICsgW2NoKChuID4+IDE2KSAmIDI1NSksIGNoKChuID4+IDgpICYgMjU1KSwgY2gobiAmIDI1NSldLm1hcCh2ID0+IHYudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJykpLmpvaW4oJycpOwogIH07CiAgY29uc3QgZGVmcyA9CiAgICByYWRHcmFkKGlkICsgJ3JpbmcnLCBjeCwgY3kgLSByRSAqIHMgKiAwLjM1LCByRSAqIHMgKiAxLjM1LCBbCiAgICAgIFswLCBzaGFkZShvLmdDb2wsIDEuNTUpXSwgWzAuNTUsIG8uZ0NvbF0sIFsxLCBzaGFkZShvLmdDb2wsIDAuNTUpXV0pICsKICAgIHJhZEdyYWQoaWQgKyAnYm9yZScsIGN4LCBjeSAtIHJDICogcyAqIDAuMiwgckMgKiBzICogMS40LCBbCiAgICAgIFswLCAnI2ZmZmZmZiddLCBbMC43LCAnI2VlZjFmNCddLCBbMSwgJyNkZGUzZTgnXV0pICsKICAgIHNoYWRvd0dyYWQoaWQpICsgYmx1ckRlZihpZCwgTWF0aC5tYXgoMC43LCByRSAqIHMgKiAwLjA1KSk7CiAgbGV0IGIgPSAnJzsKICBiICs9IGA8ZWxsaXBzZSBjeD0iJHtmeChjeCl9IiBjeT0iJHtmeChjeSArIGV4dCAqIHMgKyAxMil9IiByeD0iJHtmeChleHQgKiBzICogMC44OCl9IiByeT0iJHtmeChleHQgKiBzICogMC4xMyl9IiBmaWxsPSJ1cmwoIyR7aWR9LXNoKSIvPmA7CiAgaWYgKGxpcHBlKSB7CiAgICAvLyBFcmhhYmVuZSBMaXBwZTogVG9ydXMgYW0gQXVzc2VucmFuZCBtaXQgR2xhbnprYW50ZQogICAgYiArPSBgPGNpcmNsZSBjeD0iJHtmeChjeCl9IiBjeT0iJHtmeChjeSl9IiByPSIke2Z4KHJFICogcyAqIDEuMDUpfSIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIke3NoYWRlKG8uZ0NvbCwgMC42KX0iIHN0cm9rZS13aWR0aD0iJHtmeChyRSAqIHMgKiAwLjE0KX0iLz5gOwogICAgYiArPSBgPGNpcmNsZSBjeD0iJHtmeChjeCl9IiBjeT0iJHtmeChjeSl9IiByPSIke2Z4KHJFICogcyAqIDEuMTIpfSIgZmlsbD0ibm9uZSIgJHtFREdFfS8+YDsKICAgIGIgKz0gYDxwYXRoIGQ9Ik0gJHtmeChjeCAtIHJFICogcyAqIDAuODYpfSAke2Z4KGN5IC0gckUgKiBzICogMC42Mil9IEEgJHtmeChyRSAqIHMgKiAxLjA1KX0gJHtmeChyRSAqIHMgKiAxLjA1KX0gMCAwIDEgJHtmeChjeCArIHJFICogcyAqIDAuODYpfSAke2Z4KGN5IC0gckUgKiBzICogMC42Mil9IgogICAgICAgICAgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utb3BhY2l0eT0iMC42NSIgc3Ryb2tlLXdpZHRoPSIke2Z4KE1hdGgubWF4KDIsIHJFICogcyAqIDAuMDUpKX0iIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgZmlsdGVyPSJ1cmwoIyR7aWR9LWJsKSIvPmA7CiAgfQogIGIgKz0gYDxjaXJjbGUgY3g9IiR7ZngoY3gpfSIgY3k9IiR7ZngoY3kpfSIgcj0iJHtmeChyRSAqIHMpfSIgZmlsbD0idXJsKCMke2lkfXJpbmcpIiAke0VER0V9Lz5gOwogIGIgKz0gYDxjaXJjbGUgY3g9IiR7ZngoY3gpfSIgY3k9IiR7ZngoY3kpfSIgcj0iJHtmeChyQyAqIHMpfSIgZmlsbD0idXJsKCMke2lkfWJvcmUpIiAke0VER0V9Lz5gOwogIC8vIEdsYW56cHVua3QgYXVmIGRlbSBSaW5nCiAgYiArPSBgPGVsbGlwc2UgY3g9IiR7ZngoY3ggLSByRSAqIHMgKiAwLjQpfSIgY3k9IiR7ZngoY3kgLSByRSAqIHMgKiAwLjUyKX0iIHJ4PSIke2Z4KE1hdGgubWF4KDMsIHJFICogcyAqIDAuMikpfSIgcnk9IiR7ZngoTWF0aC5tYXgoMiwgckUgKiBzICogMC4xKSl9IiBmaWxsPSIjZmZmIiBvcGFjaXR5PSIwLjM1IiBmaWx0ZXI9InVybCgjJHtpZH0tYmwpIi8+YDsKICAvLyBWUCBlcmdhZW56dCAoMTEuMDguMjAyNiksIHNvbnN0IHN0YW5kIGluIGRlciBQcm9kdWt0ZGFyc3RlbGx1bmcgIlZQIiBzdGF0dCAiUFRGRS9GS00iLgogIGNvbnN0IG1hdE5hbWUgPSB7IEVQRE06J0VQRE0nLCBWTVE6J1NpbGlrb24gKFZNUSknLCBGS006J1ZpdG9uIChGS00pJywgUFRGRTonUFRGRScsIFZQOidQVEZFL0ZLTScgfVtvLmdhc2tldE1hdGVyaWFsXSB8fCBvLmdhc2tldE1hdGVyaWFsOwogIGNvbnN0IGJkZyA9IGJhZGdlKHZ3LCAnRGljaHR1bmcgwrcgVHlwICcgKyBvLmdhc2tldFR5cGUgKyAobGlwcGUgPyAnIChtaXQgTGlwcGUpJyA6ICcgKG9obmUgTGlwcGUpJykgKyAnIMK3ICcgKyBtYXROYW1lKTsKICByZXR1cm4gc3ZnV3JhcCh2dywgdmgsIGRlZnMsIGIsIGJkZywgbGVnZW5kKHZoLCBvKSk7Cn0KCi8qIC0tIDMpIEJvZ2VuIDkwLzQ1IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpmdW5jdGlvbiByQm9nZW4obywgdncsIHZoLCBkZWcpIHsKICBjb25zdCBpZCA9IHVpZCgpOwogIGNvbnN0IFIgPSBvLm9kUiwgUmMgPSBvLmJlbmRSYWRpdXMsIEwgPSBNYXRoLm1heChvLmxlbmd0aCwgby5vZCAqIDAuNyk7CiAgY29uc3QgYW5nID0gZGVnICogTWF0aC5QSSAvIDE4MCwgQSA9IC1NYXRoLlBJIC8gMiwgQiA9IEEgKyBhbmc7CiAgY29uc3Qgb25DID0gKHIsIGEpID0+IFtyICogTWF0aC5jb3MoYSksIHIgKiBNYXRoLnNpbihhKV07CiAgY29uc3QgdEIgPSBbLU1hdGguc2luKEIpLCBNYXRoLmNvcyhCKV07CiAgY29uc3QgZXhpdFAgPSAociwgdCkgPT4geyBjb25zdCBwID0gb25DKHIsIEIpOyByZXR1cm4gW3BbMF0gKyB0QlswXSAqIHQsIHBbMV0gKyB0QlsxXSAqIHRdOyB9OwogIC8vIEV4dGVudAogIGNvbnN0IHB0cyA9IFtbLUwsIC1SYyAtIFJdLCBbLUwsIC1SYyArIFJdLCBbMCwgLVJjIC0gUl0sIFswLCAtUmMgKyBSXSwKICAgIG9uQyhSYyArIFIsIEIpLCBvbkMoUmMgLSBSLCBCKSwgZXhpdFAoUmMgKyBSLCBMKSwgZXhpdFAoUmMgLSBSLCBMKSwKICAgIG9uQyhSYyArIFIsIChBICsgQikgLyAyKSwgWzAsIDBdXTsKICBjb25zdCB4cyA9IHB0cy5tYXAocCA9PiBwWzBdKSwgeXMgPSBwdHMubWFwKHAgPT4gcFsxXSk7CiAgY29uc3QgRiA9IGZpdChNYXRoLm1pbiguLi54cykgLSA2LCBNYXRoLm1heCguLi54cykgKyA2LCBNYXRoLm1pbiguLi55cykgLSA2LCBNYXRoLm1heCguLi55cykgKyAyMCwgdncsIHZoLCA0Nik7CiAgY29uc3QgeyBzLCBYLCBZIH0gPSBGOwogIGNvbnN0IFAgPSBwID0+IFtYKHBbMF0pLCBZKHBbMV0pXTsKCiAgY29uc3QgZW0gPSBleGl0UChSYyArIFIsIEwgLyAyKSwgZW0yID0gZXhpdFAoUmMgLSBSLCBMIC8gMik7CiAgY29uc3QgZGVmcyA9CiAgICBsaW5HcmFkQUIoaWQgKyAnZScsIDAsIFkoLVJjIC0gUiksIDAsIFkoLVJjICsgUiksIENIUk9NRSkgKwogICAgbGluR3JhZEFCKGlkICsgJ3gnLCBYKGVtWzBdKSwgWShlbVsxXSksIFgoZW0yWzBdKSwgWShlbTJbMV0pLCBDSFJPTUUpICsKICAgIHJhZEdyYWQoaWQgKyAndCcsIFgoMCksIFkoMCksIChSYyArIFIpICogcywgQ0hST01FLCAoUmMgLSBSKSAvIChSYyArIFIpKSArCiAgICBzaGFkb3dHcmFkKGlkKSArIGJsdXJEZWYoaWQsIFIgKiBzICogMC4xKTsKCiAgbGV0IGIgPSAnJzsKICBjb25zdCBsb3dZID0gTWF0aC5tYXgoLi4ueXMpOwogIGIgKz0gYDxlbGxpcHNlIGN4PSIke2Z4KFgoKE1hdGgubWluKC4uLnhzKSArIE1hdGgubWF4KC4uLnhzKSkgLyAyKSl9IiBjeT0iJHtmeChZKGxvd1kpICsgMTIpfSIgcng9IiR7ZngoKE1hdGgubWF4KC4uLnhzKSAtIE1hdGgubWluKC4uLnhzKSkgKiBzICogMC40NCl9IiByeT0iJHtmeChNYXRoLm1heCg5LCBSICogcyAqIDAuNSkpfSIgZmlsbD0idXJsKCMke2lkfS1zaCkiLz5gOwogIC8vIEZ1ZWxsdW5nZW4gT0hORSBLYW50ZW5saW5pZW4gKHNvbnN0IFF1ZXJuYWVodGUgYW4gZGVuIFRhbmdlbnRlbikgLi4uCiAgYiArPSBgPHJlY3QgeD0iJHtmeChYKC1MKSl9IiB5PSIke2Z4KFkoLVJjIC0gUikpfSIgd2lkdGg9IiR7ZngoTCAqIHMgKyAxKX0iIGhlaWdodD0iJHtmeCgyICogUiAqIHMpfSIgZmlsbD0idXJsKCMke2lkfWUpIi8+YDsKICBjb25zdCBxID0gW1Aob25DKFJjICsgUiwgQikpLCBQKGV4aXRQKFJjICsgUiwgTCkpLCBQKGV4aXRQKFJjIC0gUiwgTCkpLCBQKG9uQyhSYyAtIFIsIEIpKV07CiAgYiArPSBgPHBvbHlnb24gcG9pbnRzPSIke3EubWFwKHAgPT4gZngocFswXSkgKyAnLCcgKyBmeChwWzFdKSkuam9pbignICcpfSIgZmlsbD0idXJsKCMke2lkfXgpIi8+YDsKICBjb25zdCBSbyA9IChSYyArIFIpICogcywgUmkgPSAoUmMgLSBSKSAqIHM7CiAgY29uc3QgbzAgPSBQKG9uQyhSYyArIFIsIEEpKSwgbzEgPSBQKG9uQyhSYyArIFIsIEIpKSwgaTEgPSBQKG9uQyhSYyAtIFIsIEIpKSwgaTAgPSBQKG9uQyhSYyAtIFIsIEEpKTsKICBiICs9IGA8cGF0aCBkPSJNICR7ZngobzBbMF0pfSAke2Z4KG8wWzFdKX0gQSAke2Z4KFJvKX0gJHtmeChSbyl9IDAgMCAxICR7ZngobzFbMF0pfSAke2Z4KG8xWzFdKX0gTCAke2Z4KGkxWzBdKX0gJHtmeChpMVsxXSl9IEEgJHtmeChSaSl9ICR7ZngoUmkpfSAwIDAgMCAke2Z4KGkwWzBdKX0gJHtmeChpMFsxXSl9IFoiIGZpbGw9InVybCgjJHtpZH10KSIvPmA7CiAgLy8gLi4uIGRhZnVlciBFSU5FIGR1cmNoZ2VoZW5kZSBBdXNzZW5rb250dXIgdWViZXIgZGFzIGdhbnplIFRlaWwKICBjb25zdCBlMWMgPSBQKGV4aXRQKFJjICsgUiwgTCkpLCBlMmMgPSBQKGV4aXRQKFJjIC0gUiwgTCkpOwogIGIgKz0gYDxwYXRoIGQ9Ik0gJHtmeChYKC1MKSl9ICR7ZngoWSgtUmMgLSBSKSl9IEwgJHtmeChvMFswXSl9ICR7ZngobzBbMV0pfSBBICR7ZngoUm8pfSAke2Z4KFJvKX0gMCAwIDEgJHtmeChvMVswXSl9ICR7ZngobzFbMV0pfSBMICR7ZngoZTFjWzBdKX0gJHtmeChlMWNbMV0pfSBMICR7ZngoZTJjWzBdKX0gJHtmeChlMmNbMV0pfSBMICR7ZngoaTFbMF0pfSAke2Z4KGkxWzFdKX0gQSAke2Z4KFJpKX0gJHtmeChSaSl9IDAgMCAwICR7ZngoaTBbMF0pfSAke2Z4KGkwWzFdKX0gTCAke2Z4KFgoLUwpKX0gJHtmeChZKC1SYyArIFIpKX0gWiIgZmlsbD0ibm9uZSIgJHtFREdFfS8+YDsKICAvLyBHbGFuei1TdHJlaWZlbiAoRWludHJpdHQgLT4gVG9ydXMgLT4gQXVzdHJpdHQpCiAgY29uc3QgaFIgPSAoUmMgKyBSICogMC4xMikgKiBzOwogIGNvbnN0IGgwID0gUChvbkMoUmMgKyBSICogMC4xMiwgQSkpLCBoMSA9IFAob25DKFJjICsgUiAqIDAuMTIsIEIpKSwgaEUgPSBQKGV4aXRQKFJjICsgUiAqIDAuMTIsIEwgKiAwLjkpKTsKICBiICs9IGA8cGF0aCBkPSJNICR7ZngoWCgtTCAqIDAuOTIpKX0gJHtmeChoMFsxXSl9IEwgJHtmeChoMFswXSl9ICR7ZngoaDBbMV0pfSBBICR7ZngoaFIpfSAke2Z4KGhSKX0gMCAwIDEgJHtmeChoMVswXSl9ICR7ZngoaDFbMV0pfSBMICR7ZngoaEVbMF0pfSAke2Z4KGhFWzFdKX0iCiAgICBmaWxsPSJub25lIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS1vcGFjaXR5PSIwLjcyIiBzdHJva2Utd2lkdGg9IiR7ZngoTWF0aC5tYXgoMywgUiAqIHMgKiAwLjI2KSl9IiBzdHJva2UtbGluZWNhcD0icm91bmQiIGZpbHRlcj0idXJsKCMke2lkfS1ibCkiLz5gOwogIC8vIFNjaHdlaXNzZW5kZW4gKHNlbmtyZWNodCB6dXIgamV3ZWlsaWdlbiBBY2hzZSkKICBiICs9IGA8bGluZSB4MT0iJHtmeChYKC1MKSl9IiB5MT0iJHtmeChZKC1SYyAtIFIpICsgMSl9IiB4Mj0iJHtmeChYKC1MKSl9IiB5Mj0iJHtmeChZKC1SYyArIFIpIC0gMSl9IiBzdHJva2U9IiMyZjM5NDAiIHN0cm9rZS1vcGFjaXR5PSIwLjg1IiBzdHJva2Utd2lkdGg9IjMiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPmA7CiAgY29uc3QgZTEgPSBQKGV4aXRQKFJjICsgUiwgTCkpLCBlMiA9IFAoZXhpdFAoUmMgLSBSLCBMKSk7CiAgYiArPSBgPGxpbmUgeDE9IiR7ZngoZTFbMF0pfSIgeTE9IiR7ZngoZTFbMV0pfSIgeDI9IiR7ZngoZTJbMF0pfSIgeTI9IiR7ZngoZTJbMV0pfSIgc3Ryb2tlPSIjMmYzOTQwIiBzdHJva2Utb3BhY2l0eT0iMC44NSIgc3Ryb2tlLXdpZHRoPSIzIiBzdHJva2UtbGluZWNhcD0icm91bmQiLz5gOwogIGNvbnN0IGJkZyA9IGJhZGdlKHZ3LCAnQm9nZW4gJyArIGRlZyArICfCsCDCtyBETiAnICsgby5kbiArICcgwrcgRElOIDExODY1Jyk7CiAgcmV0dXJuIHN2Z1dyYXAodncsIHZoLCBkZWZzLCBiLCBiZGcsIGxlZ2VuZCh2aCwgbykpOwp9CgovKiAtLSA0KSBULVN0dWVjayAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KZnVuY3Rpb24gclRzdHVlY2sobywgdncsIHZoKSB7CiAgY29uc3QgaWQgPSB1aWQoKTsKICBjb25zdCBSID0gby5vZFIsIEwgPSBNYXRoLm1heChvLmxlbmd0aCwgby5vZCAqIDIpLCBiUiA9IG8uYnJhbmNoT2QgLyAyOwogIC8qIEFiZ2FuZ3Nsw6RuZ2U6IG8uYnJhbmNoTGVuZ3RoIGlzdCBkYXMgYmVsZWd0ZSBNYcOfIGF1cyBkZXIgS3VuZGVudGFiZWxsZQogICAqIChGb3JtIFQ6IFNwYWx0ZSBMMiwgRm9ybSBUSzogU3BhbHRlIEwxIC0gQmVybmQgMjcuMDcuMjAyNiksIGdlbWVzc2VuIGFiCiAgICogTGF1Zi1NaXR0ZWxsaW5pZTsgZ2V6ZWljaG5ldCB3aXJkIGRpZSBIw7ZoZSDDvGJlciBkZXIgTGF1ZmtvbnR1ci4KICAgKiBBQ0hUVU5HIC0gb2ZmZW5lciBQdW5rdCwgYmV3dXNzdCBOSUNIVCBlaWdlbm3DpGNodGlnIGdlw6RuZGVydDogRmVobHQKICAgKiBicmFuY2hMZW5ndGgsIGdyZWlmdCBoaWVyIGRpZXNlbGJlIFNjaMOkdHpwcm9wb3J0aW9uIHdpZSBpbiBkcmF3LmpzOjQzOQogICAqIChNYXRoLm1heChvZCwgTCowLDQyKSkuIFNpZSBpc3QgS0VJTiBiZWxlZ3RlcyBNYcOfLiBTaWUgc3RlaHQgaGllciBudXIsIGRhbWl0CiAgICogQW5zaWNodCB1bmQgWmVpY2hudW5nIG5pY2h0IGF1c2VpbmFuZGVybGF1ZmVuOyBkaWUgQW5zaWNodCB0csOkZ3Qgb2huZWhpbiBrZWluZQogICAqIE1hw596YWhsLCBiZWhhdXB0ZXQgYWxzbyBrZWluIE1hw58uIEVpbmUgVW1zdGVsbHVuZyBhdWYgZmFpbC1jbG9zZWQKICAgKiAoUGxhdHpoYWx0ZXIgc3RhdHQgU2Now6R0enVuZykgbXVzcyBpbiBCRUlERU4gU2NoaWNodGVuIGdlbWVpbnNhbSBwYXNzaWVyZW4gLQogICAqIHNpZWhlIEJlZnVuZCBCIGltIMOcYmVyZ2FiZWJlcmljaHQuICovCiAgY29uc3QgYkwgPSBvLmJyYW5jaExlbmd0aCAhPSBudWxsID8gTWF0aC5tYXgoMSwgby5icmFuY2hMZW5ndGggLSBSKSA6IE1hdGgubWF4KG8ub2QsIEwgKiAwLjQyKSwgeGMgPSBMIC8gMjsKICBjb25zdCBGID0gZml0KC0zLCBMICsgMywgLVIgLSBiTCAtIDgsIFIgKyAxNiwgdncsIHZoLCA0Nik7CiAgY29uc3QgeyBzLCBYLCBZIH0gPSBGOwogIGNvbnN0IGRlZnMgPQogICAgbGluR3JhZEFCKGlkICsgJ3J1bicsIDAsIFkoLVIpLCAwLCBZKFIpLCBDSFJPTUUpICsKICAgIGxpbkdyYWRBQihpZCArICdicicsIFgoeGMgLSBiUiksIDAsIFgoeGMgKyBiUiksIDAsIENIUk9NRSkgKwogICAgc2hhZG93R3JhZChpZCkgKyBibHVyRGVmKGlkLCBSICogcyAqIDAuMSk7CiAgbGV0IGIgPSAnJzsKICBiICs9IGA8ZWxsaXBzZSBjeD0iJHtmeChYKEwgLyAyKSl9IiBjeT0iJHtmeChZKFIpICsgMTIpfSIgcng9IiR7ZngoTCAqIHMgKiAwLjUyKX0iIHJ5PSIke2Z4KE1hdGgubWF4KDksIFIgKiBzICogMC41KSl9IiBmaWxsPSJ1cmwoIyR7aWR9LXNoKSIvPmA7CiAgLy8gQWJ6d2VpZyAoaGludGVyIGRlbSBMYXVmKQogIGIgKz0gYDxyZWN0IHg9IiR7ZngoWCh4YyAtIGJSKSl9IiB5PSIke2Z4KFkoLVIgLSBiTCkpfSIgd2lkdGg9IiR7ZngoMiAqIGJSICogcyl9IiBoZWlnaHQ9IiR7ZngoKGJMICsgUikgKiBzKX0iIGZpbGw9InVybCgjJHtpZH1icikiICR7RURHRX0vPmA7CiAgLy8gTGF1ZgogIGIgKz0gYDxyZWN0IHg9IiR7ZngoWCgwKSl9IiB5PSIke2Z4KFkoLVIpKX0iIHdpZHRoPSIke2Z4KEwgKiBzKX0iIGhlaWdodD0iJHtmeCgyICogUiAqIHMpfSIgZmlsbD0idXJsKCMke2lkfXJ1bikiICR7RURHRX0vPmA7CiAgLy8gQU8gYW4gZGVyIEVpbm11ZW5kdW5nCiAgYiArPSBgPGVsbGlwc2UgY3g9IiR7ZngoWCh4YykpfSIgY3k9IiR7ZngoWSgtUikpfSIgcng9IiR7ZngoYlIgKiBzICogMS4yNSl9IiByeT0iJHtmeChNYXRoLm1heCgyLjUsIFIgKiBzICogMC4xNikpfSIgZmlsbD0iIzAwMCIgb3BhY2l0eT0iMC4xNiIgZmlsdGVyPSJ1cmwoIyR7aWR9LWJsKSIvPmA7CiAgLy8gR2xhbnotU3RyZWlmZW4KICBiICs9IGA8cmVjdCB4PSIke2Z4KFgoMCkgKyAyKX0iIHk9IiR7ZngoWSgtUiAqIDAuMjUpKX0iIHdpZHRoPSIke2Z4KEwgKiBzIC0gNCl9IiBoZWlnaHQ9IiR7ZngoTWF0aC5tYXgoMywgUiAqIDAuMjggKiBzKSl9IiBmaWxsPSIjZmZmIiBvcGFjaXR5PSIwLjYiIHJ4PSIzIiBmaWx0ZXI9InVybCgjJHtpZH0tYmwpIi8+YDsKICBiICs9IGA8cmVjdCB4PSIke2Z4KFgoeGMgLSBiUiAqIDAuMzUpKX0iIHk9IiR7ZngoWSgtUiAtIGJMKSArIDIpfSIgd2lkdGg9IiR7ZngoTWF0aC5tYXgoMywgYlIgKiAwLjMgKiBzKSl9IiBoZWlnaHQ9IiR7ZngoYkwgKiBzICogMC44NSl9IiBmaWxsPSIjZmZmIiBvcGFjaXR5PSIwLjU1IiByeD0iMyIgZmlsdGVyPSJ1cmwoIyR7aWR9LWJsKSIvPmA7CiAgLy8gU2Nod2Vpc3NlbmRlbgogIGIgKz0gYDxsaW5lIHgxPSIke2Z4KFgoMCkpfSIgeTE9IiR7ZngoWSgtUikgKyAxKX0iIHgyPSIke2Z4KFgoMCkpfSIgeTI9IiR7ZngoWShSKSAtIDEpfSIgc3Ryb2tlPSIjMmYzOTQwIiBzdHJva2Utb3BhY2l0eT0iMC44NSIgc3Ryb2tlLXdpZHRoPSIzIiBzdHJva2UtbGluZWNhcD0icm91bmQiLz5gOwogIGIgKz0gYDxsaW5lIHgxPSIke2Z4KFgoTCkpfSIgeTE9IiR7ZngoWSgtUikgKyAxKX0iIHgyPSIke2Z4KFgoTCkpfSIgeTI9IiR7ZngoWShSKSAtIDEpfSIgc3Ryb2tlPSIjMmYzOTQwIiBzdHJva2Utb3BhY2l0eT0iMC44NSIgc3Ryb2tlLXdpZHRoPSIzIiBzdHJva2UtbGluZWNhcD0icm91bmQiLz5gOwogIGIgKz0gYDxsaW5lIHgxPSIke2Z4KFgoeGMgLSBiUikgKyAxKX0iIHkxPSIke2Z4KFkoLVIgLSBiTCkpfSIgeDI9IiR7ZngoWCh4YyArIGJSKSAtIDEpfSIgeTI9IiR7ZngoWSgtUiAtIGJMKSl9IiBzdHJva2U9IiMyZjM5NDAiIHN0cm9rZS1vcGFjaXR5PSIwLjg1IiBzdHJva2Utd2lkdGg9IjMiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPmA7CiAgY29uc3QgcmVkID0gby5icmFuY2hPZCAhPT0gby5vZDsKICAvKiBSMy0zL1IzLTQ6IEJhdWZvcm0gbWl0IGlucyBCYWRnZSAtIHZvcmhlciBzdGFuZCBpbiBkZXIgQW5zaWNodCBudXIKICAgKiAiVC1TdMO8Y2sgZ2xlaWNoIMK3IEROIDE1IMK3IERJTiAxMTg2NSIsIEZvcm0gVCB1bmQgRm9ybSBUSyB3YXJlbiBhbHNvIG5pY2h0CiAgICogdW50ZXJzY2hlaWRiYXIsIG9id29obCBkaWUgWmVpY2hudW5nIHNpZSBhdXN3ZWlzdC4gU2NocmVpYndlaXNlIHdpZSBiZWkgZGVyCiAgICogUmVkdXppZXJ1bmcgZGFydW50ZXIgKCIoRm9ybSBSSykiIC8gIihGb3JtIFJFKSIpLCBpbmhhbHRsaWNoIGlkZW50aXNjaCB6dW0KICAgKiBaZWljaG51bmdzLUJhZGdlIGluIGRyYXcuanMgKCLCtyBGb3JtIFQgwrciKS4gKi8KICBjb25zdCBiZGcgPSBiYWRnZSh2dywgJ1QtU3TDvGNrICcgKyAocmVkID8gJ3JlZHV6aWVydCcgOiAnZ2xlaWNoJykgKwogICAgJyAoRm9ybSAnICsgby50Zm9ybSArICcpIMK3IEROICcgKyBvLmRuICsgJyDCtyBESU4gMTE4NjUnKTsKICByZXR1cm4gc3ZnV3JhcCh2dywgdmgsIGRlZnMsIGIsIGJkZywgbGVnZW5kKHZoLCBvKSk7Cn0KCi8qIC0tIDUpIFJlZHV6aWVydW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KZnVuY3Rpb24gclJlZHV6aWVydW5nKG8sIHZ3LCB2aCkgewogIGNvbnN0IGlkID0gdWlkKCk7CiAgY29uc3QgUiA9IG8ub2RSLCBSMiA9IG8ub2QyIC8gMiwgTCA9IE1hdGgubWF4KG8ubGVuZ3RoLCAoby5vZCAtIG8ub2QyKSAqIDIuMiwgby5vZCAqIDAuOSk7CiAgY29uc3QgZWNjID0gISFvLmVjY2VudHJpYywgb2ZmID0gZWNjID8gKFIgLSBSMikgOiAwOwogIGNvbnN0IEYgPSBmaXQoLTMsIEwgKyAzLCAtUiAtIDgsIFIgKyAxNiwgdncsIHZoLCA1MCk7CiAgY29uc3QgeyBzLCBYLCBZIH0gPSBGOwogIGNvbnN0IGRlZnMgPQogICAgbGluR3JhZEFCKGlkICsgJ2snLCAwLCBZKC1SKSwgMCwgWShSKSwgQ0hST01FKSArCiAgICBzaGFkb3dHcmFkKGlkKSArIGJsdXJEZWYoaWQsIFIgKiBzICogMC4xKTsKICBsZXQgYiA9ICcnOwogIGIgKz0gYDxlbGxpcHNlIGN4PSIke2Z4KFgoTCAvIDIpKX0iIGN5PSIke2Z4KFkoUikgKyAxMil9IiByeD0iJHtmeChMICogcyAqIDAuNTUpfSIgcnk9IiR7ZngoTWF0aC5tYXgoOSwgUiAqIHMgKiAwLjUpKX0iIGZpbGw9InVybCgjJHtpZH0tc2gpIi8+YDsKICBiICs9IGA8cG9seWdvbiBwb2ludHM9IiR7ZngoWCgwKSl9LCR7ZngoWSgtUikpfSAke2Z4KFgoTCkpfSwke2Z4KFkoLVIyICsgb2ZmKSl9ICR7ZngoWChMKSl9LCR7ZngoWShSMiArIG9mZikpfSAke2Z4KFgoMCkpfSwke2Z4KFkoUikpfSIgZmlsbD0idXJsKCMke2lkfWspIiAke0VER0V9Lz5gOwogIC8vIEdsYW56LVN0cmVpZmVuIGVudGxhbmcgZGVyIChnZ2YuIGdlbmVpZ3RlbikgTWl0dGUKICBjb25zdCB5MCA9IFkoLVIgKiAwLjI1KSwgeTEgPSBZKC1SMiAqIDAuMjUgKyBvZmYpOwogIGIgKz0gYDxwYXRoIGQ9Ik0gJHtmeChYKDApICsgMyl9ICR7ZngoeTApfSBMICR7ZngoWChMKSAtIDMpfSAke2Z4KHkxKX0iIHN0cm9rZT0iI2ZmZiIgc3Ryb2tlLW9wYWNpdHk9IjAuNjIiIHN0cm9rZS13aWR0aD0iJHtmeChNYXRoLm1heCgzLCBSICogcyAqIDAuMjYpKX0iIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgZmlsbD0ibm9uZSIgZmlsdGVyPSJ1cmwoIyR7aWR9LWJsKSIvPmA7CiAgLy8gU2Nod2Vpc3NlbmRlbgogIGIgKz0gYDxsaW5lIHgxPSIke2Z4KFgoMCkpfSIgeTE9IiR7ZngoWSgtUikgKyAxKX0iIHgyPSIke2Z4KFgoMCkpfSIgeTI9IiR7ZngoWShSKSAtIDEpfSIgc3Ryb2tlPSIjMmYzOTQwIiBzdHJva2Utb3BhY2l0eT0iMC44NSIgc3Ryb2tlLXdpZHRoPSIzIiBzdHJva2UtbGluZWNhcD0icm91bmQiLz5gOwogIGIgKz0gYDxsaW5lIHgxPSIke2Z4KFgoTCkpfSIgeTE9IiR7ZngoWSgtUjIgKyBvZmYpICsgMSl9IiB4Mj0iJHtmeChYKEwpKX0iIHkyPSIke2Z4KFkoUjIgKyBvZmYpIC0gMSl9IiBzdHJva2U9IiMyZjM5NDAiIHN0cm9rZS1vcGFjaXR5PSIwLjg1IiBzdHJva2Utd2lkdGg9IjMiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPmA7CiAgY29uc3QgZGUgPSBuID0+IFN0cmluZyhmeChuKSkucmVwbGFjZSgnLicsICcsJyk7CiAgLy8gUjMtMjoga29uemVudHJpc2NoID0gRm9ybSBSSywgZXh6ZW50cmlzY2ggPSBGb3JtIFJFIChnbGVpY2hlIEJlc2NocmlmdHVuZyB3aWUgZGllIFplaWNobnVuZykuCiAgY29uc3QgYmRnID0gYmFkZ2UodncsICdSZWR1emllcnVuZyAnICsgKGVjYyA\\\/ICdleHplbnRyaXNjaCAoRm9ybSBSRSknIDogJ2tvbnplbnRyaXNjaCAoRm9ybSBSSyknKSArICcgwrcgJyArIGRlKG8ub2QpICsgJ+KGkicgKyAoby5vZDJQcm92ID8gZGUoby5vZDIpIDogJ2ZvbGd0JykgKyAnIMK3IERJTiAxMTg2NScpOwogIHJldHVybiBzdmdXcmFwKHZ3LCB2aCwgZGVmcywgYiwgYmRnLCBsZWdlbmQodmgsIG8pKTsKfQoKLyogLS0gNikgQ29ubmVjdC1GbGFuc2NoIC8gQ0YgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIFByb2R1a3RkYXJzdGVsbHVuZyBkZXMgRGF0ZW5ibGF0dC1TY2huaXR0cy4gTnVyIERlLCBEaSwgRGYgdW5kIEwgc3RldWVybgogKiBwcm9wb3J0aW9uc3JlbGV2YW50ZSBHZW9tZXRyaWU7IEhhcmR3YXJlZGV0YWlscyBibGVpYmVuIGJld3Vzc3Qgc2NoZW1hdGlzY2guICovCmZ1bmN0aW9uIHJDb25uZWN0ZmxhbnNjaChvLCB2dywgdmgpIHsKICBjb25zdCBpZCA9IHVpZCgpOwogIGNvbnN0IERlID0gby5vZCwgRGkgPSBvLmlubmVyRGlhbWV0ZXIsIERmID0gby5mbGFuZ2VPZCwgTCA9IG8ubGVuZ3RoOwogIGNvbnN0IHJEZSA9IERlIC8gMiwgckRpID0gRGkgLyAyLCByRGYgPSBEZiAvIDI7CiAgY29uc3QgYm9zc0ggPSBNYXRoLm1heChMICogMS4yLCBEZiAqIDAuNTgpOwogIGNvbnN0IHRvcCA9IC1MIC0gYm9zc0g7CiAgY29uc3QgYm9sdFggPSBNYXRoLm1pbihyRGUgKiAwLjc4LCByRGYgKyBNYXRoLm1heCg0LCAockRlIC0gckRmKSAqIDAuNDIpKTsKICBjb25zdCBib2x0UiA9IE1hdGgubWF4KDIuMiwgTWF0aC5taW4oRGYsIERlKSAqIDAuMDkpOwogIGNvbnN0IEYgPSBmaXQoLXJEZSAtIGJvbHRSLCByRGUgKyBib2x0UiwgdG9wIC0gYm9sdFIgKiAxLjgsIDAsIHZ3LCB2aCwgNTIpOwogIGNvbnN0IHsgcywgWCwgWSB9ID0gRjsKICBjb25zdCBkZWZzID0KICAgIGxpbkdyYWRBQihpZCArICdib2R5JywgMCwgWSh0b3ApLCAwLCBZKDApLCBDSFJPTUUpICsKICAgIGxpbkdyYWRBQihpZCArICdib3NzJywgWCgtckRmKSwgMCwgWChyRGYpLCAwLCBDSFJPTUUpICsKICAgIGxpbkdyYWRBQihpZCArICdib2x0JywgMCwgWSh0b3ApLCAwLCBZKC1MKSwgU0FUSU4pICsKICAgIGxpbkdyYWRBQihpZCArICdib3JlJywgWCgtckRpKSwgMCwgWChyRGkpLCAwLCBbCiAgICAgIFswLCcjMTExODIwJ10sIFswLjM1LCcjMzU0MTRhJ10sIFswLjU1LCcjNjI2Zjc4J10sIFsxLCcjMTgyMTI5J11dKSArCiAgICBzaGFkb3dHcmFkKGlkKSArIGJsdXJEZWYoaWQsIE1hdGgubWF4KDAuOCwgckRpICogcyAqIDAuMDgpKTsKCiAgbGV0IGIgPSAnJzsKICBiICs9IGA8ZWxsaXBzZSBjeD0iJHtmeChYKDApKX0iIGN5PSIke2Z4KFkoMCkgKyAxMyl9IiByeD0iJHtmeChyRGUgKiBzICogMS4wNCl9IiByeT0iJHtmeChNYXRoLm1heCg4LCBMICogcyAqIDAuMzQpKX0iIGZpbGw9InVybCgjJHtpZH0tc2gpIi8+YDsKICBiICs9IGA8cG9seWdvbiBwb2ludHM9IiR7ZngoWCgtckRlKSl9LCR7ZngoWSgwKSl9ICR7ZngoWCgtckRpKSl9LCR7ZngoWSgwKSl9ICR7ZngoWCgtckRpKSl9LCR7ZngoWSgtTCkpfSAke2Z4KFgoLXJEZikpfSwke2Z4KFkoLUwpKX0iIGZpbGw9InVybCgjJHtpZH1ib2R5KSIgJHtFREdFfS8+YDsKICBiICs9IGA8cG9seWdvbiBwb2ludHM9IiR7ZngoWChyRGYpKX0sJHtmeChZKC1MKSl9ICR7ZngoWChyRGkpKX0sJHtmeChZKC1MKSl9ICR7ZngoWChyRGkpKX0sJHtmeChZKDApKX0gJHtmeChYKHJEZSkpfSwke2Z4KFkoMCkpfSIgZmlsbD0idXJsKCMke2lkfWJvZHkpIiAke0VER0V9Lz5gOwogIGIgKz0gYDxyZWN0IHg9IiR7ZngoWCgtckRmKSl9IiB5PSIke2Z4KFkodG9wKSl9IiB3aWR0aD0iJHtmeChEZiAqIHMpfSIgaGVpZ2h0PSIke2Z4KGJvc3NIICogcyl9IiByeD0iJHtmeChNYXRoLm1heCgxLjUsIHMgKiAwLjgpKX0iIGZpbGw9InVybCgjJHtpZH1ib3NzKSIgJHtFREdFfS8+YDsKICBiICs9IGA8cmVjdCB4PSIke2Z4KFgoLXJEaSkpfSIgeT0iJHtmeChZKHRvcCkgLSAxKX0iIHdpZHRoPSIke2Z4KERpICogcyl9IiBoZWlnaHQ9IiR7ZngoKC10b3ApICogcyArIDIpfSIgZmlsbD0idXJsKCMke2lkfWJvcmUpIi8+YDsKICBiICs9IGA8cmVjdCB4PSIke2Z4KFgoLXJEaSkgKyAxLjUpfSIgeT0iJHtmeChZKHRvcCkgKyAyKX0iIHdpZHRoPSIke2Z4KE1hdGgubWF4KDIsIERpICogcyAqIDAuMTYpKX0iIGhlaWdodD0iJHtmeCgoLXRvcCkgKiBzIC0gNCl9IiBmaWxsPSIjZmZmIiBvcGFjaXR5PSIwLjE4IiByeD0iMiIgZmlsdGVyPSJ1cmwoIyR7aWR9LWJsKSIvPmA7CgogIFstMSwxXS5mb3JFYWNoKHNpZGUgPT4gewogICAgY29uc3QgeCA9IHNpZGUgKiBib2x0WDsKICAgIGNvbnN0IHNob3VsZGVyWCA9IHNpZGUgPiAwID8gckRmIDogLXJEZjsKICAgIGIgKz0gYDxwYXRoIGQ9Ik0ke2Z4KFgoeCAtIHNpZGUgKiBib2x0UiAqIDEuNykpfSwke2Z4KFkoLUwgKiAwLjc0KSl9IEwke2Z4KFgoc2hvdWxkZXJYKSl9LCR7ZngoWSgtTCkpfSIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjNGI1ODYxIiBzdHJva2Utd2lkdGg9IiR7ZngoTWF0aC5tYXgoMi4yLCBib2x0UiAqIHMgKiAwLjQ1KSl9IiBzdHJva2UtbGluZWNhcD0icm91bmQiLz5gOwogICAgYiArPSBgPHJlY3QgeD0iJHtmeChYKHggLSBib2x0UikpfSIgeT0iJHtmeChZKHRvcCArIGJvc3NIICogMC4xKSl9IiB3aWR0aD0iJHtmeCgyICogYm9sdFIgKiBzKX0iIGhlaWdodD0iJHtmeChib3NzSCAqIDAuNjIgKiBzKX0iIHJ4PSIke2Z4KGJvbHRSICogcyAqIDAuMzUpfSIgZmlsbD0idXJsKCMke2lkfWJvbHQpIiAke0VER0V9Lz5gOwogICAgYiArPSBgPGVsbGlwc2UgY3g9IiR7ZngoWCh4KSl9IiBjeT0iJHtmeChZKHRvcCArIGJvc3NIICogMC4wOCkpfSIgcng9IiR7ZngoYm9sdFIgKiAxLjI1ICogcyl9IiByeT0iJHtmeChib2x0UiAqIDAuNzIgKiBzKX0iIGZpbGw9InVybCgjJHtpZH1ib2x0KSIgJHtFREdFfS8+YDsKICB9KTsKICBiICs9IGA8bGluZSB4MT0iJHtmeChYKC1yRGYpKX0iIHkxPSIke2Z4KFkoLUwpKX0iIHgyPSIke2Z4KFgockRmKSl9IiB5Mj0iJHtmeChZKC1MKSl9IiBzdHJva2U9IiMxNTFjMjIiIHN0cm9rZS13aWR0aD0iMi4yIiBvcGFjaXR5PSIwLjgyIi8+YDsKICBiICs9IGA8cGF0aCBkPSJNJHtmeChYKC1yRGUgKiAwLjkpKX0sJHtmeChZKC1MICogMC4xMikpfSBRJHtmeChYKDApKX0sJHtmeChZKC1MICogMC43KSl9ICR7ZngoWChyRGUgKiAwLjkpKX0sJHtmeChZKC1MICogMC4xMikpfSIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZmIiBzdHJva2Utd2lkdGg9IiR7ZngoTWF0aC5tYXgoMi41LCBMICogcyAqIDAuMTgpKX0iIHN0cm9rZS1vcGFjaXR5PSIwLjI4IiBzdHJva2UtbGluZWNhcD0icm91bmQiIGZpbHRlcj0idXJsKCMke2lkfS1ibCkiLz5gOwoKICByZXR1cm4gc3ZnV3JhcCh2dywgdmgsIGRlZnMsIGIsCiAgICBiYWRnZSh2dywgJ0Nvbm5lY3QtRmxhbnNjaCAoQ0YpIMK3ICcgKyBzaXplTGFiZWwobykpLCBsZWdlbmQodmgsIG8pKTsKfQoKLyogLS0gNykgQ29ubmVjdC1GbGFuc2NoIElubGluZSAvIENGSSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBUZWNobmlzY2hlciBDaHJvbS1TY2huaXR0OiBEZSwgRGksIEwsIFkgdW5kIEEvVEMga29tbWVuIGF1c3NjaGxpZXNzbGljaAogKiBhdXMgZGVtIEF1ZnJ1ZmVyLiBOaWNodCBnZWxpZWZlcnRlIEVpbnplbG1hc3NlIGJsZWliZW4gdW5iZXNjaHJpZnRldGUKICogU2NoZW1hZWxlbWVudGUgdW5kIHdlcmRlbiBuaWNodCBhbHMgdGVjaG5pc2NoZSBXZXJ0ZSBhdXNnZWdlYmVuLiAqLwpmdW5jdGlvbiByQ29ubmVjdGlubGluZShvLCB2dywgdmgpIHsKICBjb25zdCBpZCA9IHVpZCgpOwogIGNvbnN0IERlID0gby5vZCwgRGkgPSBvLmlubmVyRGlhbWV0ZXIsIEwgPSBvLmxlbmd0aCwgWWggPSBvLmJyYW5jaEhlaWdodDsKICBjb25zdCBlbmRWYWx1ZSA9IG8uZW5kRGlhbWV0ZXIsIGlzVEMgPSBvLmVuZFR5cGUgPT09ICdUQyc7CiAgY29uc3QgdXBwZXJEZSA9IG8udXBwZXJPdXRlckRpYW1ldGVyLCB1cHBlckRpID0gby51cHBlcklubmVyRGlhbWV0ZXI7CiAgY29uc3QgckRlID0gRGUgLyAyLCByRGkgPSBEaSAvIDIsIHJFbmQgPSBpc1RDID8gZW5kVmFsdWUgLyAyIDogckRlOwogIGNvbnN0IHhjID0gTCAvIDI7CiAgY29uc3QgYmFzZUhhbGYgPSBNYXRoLm1pbihMICogMC4yNCwgTWF0aC5tYXgoMTAsIHVwcGVyRGUgKiAwLjU4KSk7CiAgY29uc3QgdXBwZXJMZWZ0ID0geGMgLSB1cHBlckRlIC8gMiwgdXBwZXJSaWdodCA9IHhjICsgdXBwZXJEZSAvIDI7CiAgY29uc3QgaW5uZXJMZWZ0ID0geGMgLSB1cHBlckRpIC8gMiwgaW5uZXJSaWdodCA9IHhjICsgdXBwZXJEaSAvIDI7CiAgY29uc3Qgc2VhbFkgPSAtWWg7CiAgY29uc3QgaGVhZEggPSBNYXRoLm1heCg3LCB1cHBlckRlICogMC4yKTsKICBjb25zdCB0b3AgPSBzZWFsWSAtIGhlYWRIOwogIGNvbnN0IGZsYW5nZVQgPSBpc1RDID8gTWF0aC5tYXgoMiwgTWF0aC5taW4oTCAqIDAuMDQ1LCBEZSAqIDAuMTMpKSA6IDA7CiAgY29uc3QgbWluWSA9IE1hdGgubWluKHRvcCAtIGhlYWRIICogMC4zNCwgLXJFbmQpLCBtYXhZID0gTWF0aC5tYXgockVuZCwgckRlKTsKICBjb25zdCBGID0gZml0KDAsIEwsIG1pblksIG1heFksIHZ3LCB2aCwgNTQpOwogIGNvbnN0IHsgcywgWCwgWSB9ID0gRjsKICBjb25zdCBwaXBlWDAgPSBpc1RDID8gZmxhbmdlVCA6IDAsIHBpcGVYMSA9IGlzVEMgPyBMIC0gZmxhbmdlVCA6IEw7CiAgY29uc3QgZGVmcyA9CiAgICBsaW5HcmFkQUIoaWQgKyAncGlwZScsIDAsIFkoLXJEZSksIDAsIFkockRlKSwgQ0hST01FKSArCiAgICBsaW5HcmFkQUIoaWQgKyAnaGVhZCcsIFgodXBwZXJMZWZ0KSwgMCwgWCh1cHBlclJpZ2h0KSwgMCwgQ0hST01FKSArCiAgICBsaW5HcmFkQUIoaWQgKyAnZW5kJywgMCwgWSgtckVuZCksIDAsIFkockVuZCksIFNBVElOKSArCiAgICBsaW5HcmFkQUIoaWQgKyAnYm9yZScsIDAsIFkoLXJEaSksIDAsIFkockRpKSwgWwogICAgICBbMCwnIzI2MzEzYSddLCBbMC4zNSwnIzRiNTk2MyddLCBbMC41MiwnIzY1NzM3ZCddLCBbMSwnIzFkMjYyZCddXSkgKwogICAgc2hhZG93R3JhZChpZCkgKyBibHVyRGVmKGlkLCBNYXRoLm1heCgwLjgsIHJEZSAqIHMgKiAwLjA4KSk7CgogIGxldCBiID0gJyc7CiAgYiArPSBgPGVsbGlwc2UgY3g9IiR7ZngoWCh4YykpfSIgY3k9IiR7ZngoWShtYXhZKSArIDE0KX0iIHJ4PSIke2Z4KEwgKiBzICogMC40OCl9IiByeT0iJHtmeChNYXRoLm1heCg4LCByRGUgKiBzICogMC41KSl9IiBmaWxsPSJ1cmwoIyR7aWR9LXNoKSIvPmA7CiAgYiArPSBgPHJlY3QgeD0iJHtmeChYKHBpcGVYMCkpfSIgeT0iJHtmeChZKC1yRGUpKX0iIHdpZHRoPSIke2Z4KChwaXBlWDEgLSBwaXBlWDApICogcyl9IiBoZWlnaHQ9IiR7ZngoRGUgKiBzKX0iIHJ4PSIke2Z4KE1hdGgubWF4KDEsIHJEZSAqIHMgKiAwLjA4KSl9IiBmaWxsPSJ1cmwoIyR7aWR9cGlwZSkiICR7RURHRX0vPmA7CiAgYiArPSBgPHJlY3QgeD0iJHtmeChYKHBpcGVYMCkgLSAxKX0iIHk9IiR7ZngoWSgtckRpKSl9IiB3aWR0aD0iJHtmeCgocGlwZVgxIC0gcGlwZVgwKSAqIHMgKyAyKX0iIGhlaWdodD0iJHtmeChEaSAqIHMpfSIgZmlsbD0idXJsKCMke2lkfWJvcmUpIi8+YDsKICBiICs9IGA8cmVjdCB4PSIke2Z4KFgocGlwZVgwKSArIDMpfSIgeT0iJHtmeChZKC1yRGUgKiAwLjQyKSl9IiB3aWR0aD0iJHtmeChNYXRoLm1heCg1LCAocGlwZVgxIC0gcGlwZVgwKSAqIHMgLSA2KSl9IiBoZWlnaHQ9IiR7ZngoTWF0aC5tYXgoMi41LCByRGUgKiBzICogMC4yMikpfSIgZmlsbD0iI2ZmZiIgb3BhY2l0eT0iMC40MiIgcng9IjMiIGZpbHRlcj0idXJsKCMke2lkfS1ibCkiLz5gOwoKICBpZiAoaXNUQykgewogICAgYiArPSBgPHJlY3QgeD0iJHtmeChYKDApKX0iIHk9IiR7ZngoWSgtckVuZCkpfSIgd2lkdGg9IiR7ZngoZmxhbmdlVCAqIHMpfSIgaGVpZ2h0PSIke2Z4KDIgKiByRW5kICogcyl9IiByeD0iJHtmeChNYXRoLm1heCgxLjIsIGZsYW5nZVQgKiBzICogMC4yNSkpfSIgZmlsbD0idXJsKCMke2lkfWVuZCkiICR7RURHRX0vPmA7CiAgICBiICs9IGA8cmVjdCB4PSIke2Z4KFgoTCAtIGZsYW5nZVQpKX0iIHk9IiR7ZngoWSgtckVuZCkpfSIgd2lkdGg9IiR7ZngoZmxhbmdlVCAqIHMpfSIgaGVpZ2h0PSIke2Z4KDIgKiByRW5kICogcyl9IiByeD0iJHtmeChNYXRoLm1heCgxLjIsIGZsYW5nZVQgKiBzICogMC4yNSkpfSIgZmlsbD0idXJsKCMke2lkfWVuZCkiICR7RURHRX0vPmA7CiAgfSBlbHNlIHsKICAgIGNvbnN0IGEgPSBNYXRoLm1pbihlbmRWYWx1ZSwgTCk7CiAgICBbYSwgTCAtIGFdLmZvckVhY2goeCA9PiB7CiAgICAgIGIgKz0gYDxsaW5lIHgxPSIke2Z4KFgoeCkpfSIgeTE9IiR7ZngoWSgtckRlKSArIDEpfSIgeDI9IiR7ZngoWCh4KSl9IiB5Mj0iJHtmeChZKHJEZSkgLSAxKX0iIHN0cm9rZT0iIzJmMzk0MCIgc3Ryb2tlLW9wYWNpdHk9IjAuODIiIHN0cm9rZS13aWR0aD0iMiIvPmA7CiAgICB9KTsKICB9CgogIGNvbnN0IGxlZnQgPSB4YyAtIGJhc2VIYWxmLCByaWdodCA9IHhjICsgYmFzZUhhbGY7CiAgYiArPSBgPHBhdGggZD0iTSR7ZngoWChsZWZ0KSl9LCR7ZngoWSgtckRlKSl9IEwke2Z4KFgodXBwZXJMZWZ0KSl9LCR7ZngoWShzZWFsWSkpfSBMJHtmeChYKHVwcGVyUmlnaHQpKX0sJHtmeChZKHNlYWxZKSl9IEwke2Z4KFgocmlnaHQpKX0sJHtmeChZKC1yRGUpKX0gWiIgZmlsbD0idXJsKCMke2lkfWhlYWQpIiAke0VER0V9Lz5gOwogIGIgKz0gYDxyZWN0IHg9IiR7ZngoWCh1cHBlckxlZnQpKX0iIHk9IiR7ZngoWSh0b3ApKX0iIHdpZHRoPSIke2Z4KHVwcGVyRGUgKiBzKX0iIGhlaWdodD0iJHtmeChoZWFkSCAqIHMpfSIgcng9IiR7ZngoTWF0aC5tYXgoMS40LCBoZWFkSCAqIHMgKiAwLjA4KSl9IiBmaWxsPSJ1cmwoIyR7aWR9aGVhZCkiICR7RURHRX0vPmA7CiAgYiArPSBgPHBhdGggZD0iTSR7ZngoWChpbm5lckxlZnQpKX0sJHtmeChZKHRvcCkgLSAxKX0gTCR7ZngoWChpbm5lckxlZnQpKX0sJHtmeChZKC1yRGUgKiAwLjIyKSl9CiAgICBRJHtmeChYKHhjKSl9LCR7ZngoWShyRGkgKiAwLjkyKSl9ICR7ZngoWChpbm5lclJpZ2h0KSl9LCR7ZngoWSgtckRlICogMC4yMikpfQogICAgTCR7ZngoWChpbm5lclJpZ2h0KSl9LCR7ZngoWSh0b3ApIC0gMSl9IFoiIGZpbGw9InVybCgjJHtpZH1ib3JlKSIgJHtFREdFfS8+YDsKICBbLTEsMV0uZm9yRWFjaChzaWRlID0+IHsKICAgIGNvbnN0IGJ4ID0geGMgKyBzaWRlICogdXBwZXJEZSAqIDAuNTYsIGJyID0gTWF0aC5tYXgoMS44LCB1cHBlckRlICogMC4wNTUpOwogICAgYiArPSBgPHJlY3QgeD0iJHtmeChYKGJ4IC0gYnIpKX0iIHk9IiR7ZngoWSh0b3AgKyBoZWFkSCAqIDAuMDgpKX0iIHdpZHRoPSIke2Z4KDIgKiBiciAqIHMpfSIgaGVpZ2h0PSIke2Z4KGhlYWRIICogMC44NiAqIHMpfSIgcng9IiR7ZngoYnIgKiBzICogMC4zNSl9IiBmaWxsPSJ1cmwoIyR7aWR9ZW5kKSIgJHtFREdFfS8+YDsKICAgIGIgKz0gYDxlbGxpcHNlIGN4PSIke2Z4KFgoYngpKX0iIGN5PSIke2Z4KFkodG9wKSl9IiByeD0iJHtmeChiciAqIDEuMjUgKiBzKX0iIHJ5PSIke2Z4KGJyICogMC43NSAqIHMpfSIgZmlsbD0idXJsKCMke2lkfWVuZCkiICR7RURHRX0vPmA7CiAgfSk7CiAgYiArPSBgPGxpbmUgeDE9IiR7ZngoWCh1cHBlckxlZnQpKX0iIHkxPSIke2Z4KFkoc2VhbFkpKX0iIHgyPSIke2Z4KFgodXBwZXJSaWdodCkpfSIgeTI9IiR7ZngoWShzZWFsWSkpfSIgc3Ryb2tlPSIjMTUxYzIyIiBzdHJva2Utd2lkdGg9IjIiIG9wYWNpdHk9IjAuODIiLz5gOwoKICByZXR1cm4gc3ZnV3JhcCh2dywgdmgsIGRlZnMsIGIsCiAgICBiYWRnZSh2dywgJ0Nvbm5lY3QtRmxhbnNjaCBJbmxpbmUgKENGSSkgwrcgJyArCiAgICAgIChpc1RDID8gJ1RyaS1DbGFtcCcgOiAnQnV0dCBXZWxkJykgKyAnIMK3ICcgKyBzaXplTGFiZWwobykpLCBsZWdlbmQodmgsIG8pKTsKfQoKLyogLS0gUGxhdHpoYWx0ZXI6IHVuYmVrYW5udGVyIC8gbmljaHQtemVpY2hlbmJhcmVyIHN2Z1R5cGUgKE5hY2hwcnVlZi1CZWZ1bmQgYikgLS0KICogRmFlbGx0IG51ciBub2NoIGFuLCB3ZW5uIGVpbiBiZWxlZ3RlcyBQZmxpY2h0bWFzcyBmZWhsdCAoei4gQi4gRGljaHR1bmcgb2huZQogKiBFL0MsIEJsaW5kZGVja2VsIG9obmUgRGVja2Vsc3RhZXJrZSkgb2RlciBlaW4gc3ZnVHlwZSBnYW56IHVuYmVrYW5udCBpc3QuCiAqIFN0YXR0IHN0aWxsIGVpbmUgZmFsc2NoZSBDbGFtcHZlcmJpbmR1bmcgKGZydWVoZXI6IGRlZmF1bHQgLT4gckNsYW1wKSB6dQogKiByZW5kZXJuLCBlaW4ga2xhcmVyICJaZWljaG51bmcgZm9sZ3QiLUhpbndlaXMuIEVzIHdpcmQgQkVXVVNTVCBrZWluIEZpdHRpbmcKICogZ2V6ZWljaG5ldC4gKi8KZnVuY3Rpb24gclBsYXR6aGFsdGVyKG8sIHZ3LCB2aCkgewogIGNvbnN0IGN4ID0gdncgLyAyLCBjeSA9IHZoIC8gMjsKICBjb25zdCBidyA9IE1hdGgubWluKDM4MCwgdncgLSA4OCksIGJoID0gMTMyOwogIGxldCBiID0gJyc7CiAgYiArPSBgPHJlY3QgeD0iJHtmeChjeCAtIGJ3IC8gMil9IiB5PSIke2Z4KGN5IC0gYmggLyAyIC0gNil9IiB3aWR0aD0iJHtmeChidyl9IiBoZWlnaHQ9IiR7ZngoYmgpfSIgcng9IjE0IiBmaWxsPSIjZjRmNmY4IiBzdHJva2U9IiM4YThmOTYiIHN0cm9rZS13aWR0aD0iMS4yIiBzdHJva2UtZGFzaGFycmF5PSI3IDUiLz5gOwogIGIgKz0gYDxwYXRoIGQ9Ik0ke2Z4KGN4IC0gMjQpfSwke2Z4KGN5IC0gMTApfSBsMTQsLTE0IDEwLDEwIDIwLC0yMiBNJHtmeChjeCAtIDI0KX0sJHtmeChjeSArIDgpfSBoNTgiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzFjMWMxYyIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPmA7CiAgYiArPSBgPHRleHQgeD0iJHtmeChjeCl9IiB5PSIke2Z4KGN5ICsgMzQpfSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgJHtGT05UfSBmb250LXNpemU9IjE1IiBmb250LXdlaWdodD0iNjAwIiBmaWxsPSIjMWMxYzFjIj5aZWljaG51bmcgZm9sZ3Q8L3RleHQ+YDsKICByZXR1cm4gc3ZnV3JhcCh2dywgdmgsICcnLCBiLCBiYWRnZSh2dywgJ1plaWNobnVuZyBmb2xndCcpLCBsZWdlbmQodmgsIG8pKTsKfQoKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBEaXNwYXRjaCAqLwpmdW5jdGlvbiByZW5kZXJGaXR0aW5nKHBhcmFtcywgb3B0cykgewogIG9wdHMgPSBvcHRzIHx8IHt9OwogIGNvbnN0IHZ3ID0gb3B0cy53aWR0aCB8fCA3NjAsIHZoID0gb3B0cy5oZWlnaHQgfHwgNDQwOwogIGNvbnN0IHJlcXVlc3RlZFR5cGUgPSBwYXJhbXMgJiYgcGFyYW1zLnR5cGU7CiAgY29uc3QgaW52YWxpZENvbm5lY3QgPSAocmVxdWVzdGVkVHlwZSA9PT0gJ2Nvbm5lY3RmbGFuc2NoJyAmJiAhdmFsaWRDb25uZWN0ZmxhbnNjaChwYXJhbXMpKSB8fAogICAgKHJlcXVlc3RlZFR5cGUgPT09ICdjb25uZWN0aW5saW5lJyAmJiAhdmFsaWRDb25uZWN0aW5saW5lKHBhcmFtcykpOwogIGNvbnN0IG8gPSBub3JtYWxpemUocGFyYW1zKTsKICBpZiAoaW52YWxpZENvbm5lY3QpIHJldHVybiByUGxhdHpoYWx0ZXIobywgdncsIHZoKTsKICBzd2l0Y2ggKG8udHlwZSkgewogICAgY2FzZSAnY2xhbXBzdHV0emVuJzogcmV0dXJuIHJDbGFtcChvLCB2dywgdmgsIGZhbHNlKTsKICAgIC8vIEVpbnplbG5lciBTdHV0emVuIChUQ0QvVENTKToga2VpbiB6d2VpdGVzIFJvaHIsIGtlaW5lIERpY2h0dW5nLCBrZWluZSBLbGFtbWVyLgogICAgY2FzZSAnc3R1dHplbic6ICAgICAgcmV0dXJuIHJDbGFtcChvLCB2dywgdmgsICdzaW5nbGUnKTsKICAgIGNhc2UgJ2JsaW5ka2FwcGUnOiAgIHJldHVybiByQ2xhbXAobywgdncsIHZoLCB0cnVlKTsKICAgIC8vIFJ1bmRlIDcgKFctMDU5KTogcmVpbmUgRmxhbnNjaC1EYXJzdGVsbHVuZyBvaG5lIFJvaHJtYXNzZSAoVHlwIEJEKS4KICAgIGNhc2UgJ2JsaW5kZGVja2VsJzogIHJldHVybiByQmxpbmRkZWNrZWwobywgdncsIHZoKTsKICAgIGNhc2UgJ2tsYW1tZXInOiAgICAgIHJldHVybiByS2xhbW1lcihvLCB2dywgdmgpOwogICAgY2FzZSAnYm9nZW45MCc6ICAgICAgcmV0dXJuIHJCb2dlbihvLCB2dywgdmgsIDkwKTsKICAgIGNhc2UgJ2JvZ2VuNDUnOiAgICAgIHJldHVybiByQm9nZW4obywgdncsIHZoLCA0NSk7CiAgICBjYXNlICd0c3R1ZWNrJzogICAgICByZXR1cm4gclRzdHVlY2sobywgdncsIHZoKTsKICAgIGNhc2UgJ3JlZHV6aWVydW5nJzogIHJldHVybiByUmVkdXppZXJ1bmcobywgdncsIHZoKTsKICAgIGNhc2UgJ2Nvbm5lY3RmbGFuc2NoJzogcmV0dXJuIHJDb25uZWN0ZmxhbnNjaChvLCB2dywgdmgpOwogICAgY2FzZSAnY29ubmVjdGlubGluZSc6ICByZXR1cm4gckNvbm5lY3RpbmxpbmUobywgdncsIHZoKTsKICAgIC8vIFR5cCBEICdkaWNodHVuZyc6IGVjaHRlIERhcnN0ZWxsdW5nIG1pdCBiZWxlZ3RlbiBFL0MtTWFzc2VuOyBvaG5lIHNpZQogICAgLy8gZmFlbGx0IHJEaWNodHVuZyBzZWxic3QgYXVmIGRlbiBQbGF0emhhbHRlciAoTklFIHJDbGFtcCkuCiAgICBjYXNlICdkaWNodHVuZyc6ICAgICByZXR1cm4gckRpY2h0dW5nKG8sIHZ3LCB2aCk7CiAgICAvLyBTaWNoZXJoZWl0c25ldHo6IGplZGVyIHVuYmVrYW5udGUgc3ZnVHlwZSBiZWtvbW10IGRlbiBQbGF0emhhbHRlciAoTmFjaHBydWVmLUJlZnVuZCBiKS4KICAgIGRlZmF1bHQ6ICAgICAgICAgICAgIHJldHVybiByUGxhdHpoYWx0ZXIobywgdncsIHZoKTsKICB9Cn0KCmNvbnN0IEFQSSA9IHsgcmVuZGVyRml0dGluZywgTkFNRSB9OwppZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpIG1vZHVsZS5leHBvcnRzID0gQVBJOwppZiAocm9vdCkgcm9vdC5XZWlzc0ZpdHRpbmdSZW5kZXIgPSBBUEk7CgovKiAtLS0tLS0tLS0gTm9kZS1TZWxic3R0ZXN0OiBgbm9kZSByZW5kZXIuanNgIC0+IHFhL3JlbmRlci12aWV3LSouc3ZnIC0tLS0tLSAqLwppZiAodHlwZW9mIHJlcXVpcmUgIT09ICd1bmRlZmluZWQnICYmIHJlcXVpcmUubWFpbiA9PT0gbW9kdWxlKSB7CiAgY29uc3QgZnMgPSByZXF1aXJlKCdmcycpLCBwYXRoID0gcmVxdWlyZSgncGF0aCcpOwogIGNvbnN0IG91dCA9IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICdxYScpOyB0cnkgeyBmcy5ta2RpclN5bmMob3V0LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTsgfSBjYXRjaCAoZSkge30KICBjb25zdCBzYW1wbGVzID0gWwogICAgWydjbGFtcCcsICAgIHsgdHlwZTonY2xhbXBzdHV0emVuJywgZG46MjUsIG9kOjI5LCB3YWxsOjEuNSwgbGVuZ3RoOjM2LCBmbGFuZ2VPZDo1MC41LCBnYXNrZXRNYXRlcmlhbDonUFRGRScsIHN1cmZhY2U6J0g0Jywgd2Vya3N0b2ZmOicxLjQ0MzUnIH1dLAogICAgWydibGluZCcsICAgIHsgdHlwZTonYmxpbmRkZWNrZWwnLCBmbGFuZ2VPZDo1MC41LCBsZW5ndGg6Ni4zNSwgc3VyZmFjZTonSDMnLCB3ZXJrc3RvZmY6JzEuNDQwNCcgfV0sCiAgICBbJ2tsYW1tZXInLCAgeyB0eXBlOidrbGFtbWVyJywgZmxhbmdlT2Q6NjQsIGtsYW1tZXJBOjY2LjUsIGtsYW1tZXJUeXA6J0tMTEknLCBrbGFtbWVyTXV0dGVyOidTJywgc3VyZmFjZTonJywgd2Vya3N0b2ZmOicxLjQzMDgnIH1dLAogICAgWydkaWNodHVuZycsIHsgdHlwZTonZGljaHR1bmcnLCBnYXNrZXRPZDo1MC41LCBnYXNrZXRJZDoyNy43LCBnYXNrZXRUeXBlOidJSScsIGdhc2tldE1hdGVyaWFsOidFUERNJywgc3VyZmFjZTonJywgd2Vya3N0b2ZmOicxLjQ0MDQnIH1dLAogICAgWydib2dlbjkwJywgIHsgdHlwZTonYm9nZW45MCcsIGRuOjUwLCBvZDo1Mywgd2FsbDoxLjUsIGxlbmd0aDo0MCwgYmVuZFJhZGl1czo3MCwgc3VyZmFjZTonSDQnIH1dLAogICAgWydib2dlbjQ1JywgIHsgdHlwZTonYm9nZW40NScsIGRuOjQwLCBvZDo0MSwgd2FsbDoxLjUsIGxlbmd0aDo0MCwgYmVuZFJhZGl1czo2MCwgc3VyZmFjZTonSDMnIH1dLAogICAgWyd0c3R1ZWNrJywgIHsgdHlwZTondHN0dWVjaycsIGRuOjQwLCBvZDo0MSwgd2FsbDoxLjUsIGxlbmd0aDoxMjAsIGJyYW5jaE9kOjI5LCBzdXJmYWNlOidINCcgfV0sCiAgICBbJ3JlZHV6JywgICAgeyB0eXBlOidyZWR1emllcnVuZycsIGRuOjUwLCBvZDo1Mywgd2FsbDoxLjUsIGxlbmd0aDo2Miwgb2QyOjI5LCBlY2NlbnRyaWM6dHJ1ZSwgc3VyZmFjZTonSDMnIH1dCiAgXTsKICBjb25zdCBwYWdlID0gWyc8IWRvY3R5cGUgaHRtbD48bWV0YSBjaGFyc2V0PSJ1dGYtOCI+PHRpdGxlPlJlbmRlci1BbnNpY2h0IFFBPC90aXRsZT4nLAogICAgJzxzdHlsZT5ib2R5e21hcmdpbjowO3BhZGRpbmc6MjBweDtiYWNrZ3JvdW5kOiNlY2VlZjA7Zm9udC1mYW1pbHk6c3lzdGVtLXVpfScsCiAgICAnLmNhcmR7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6NDgwcHg7bWFyZ2luOjhweDtiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCgxNjBkZWcsI2ZhZmJmYywjZThlYmVlKTtib3JkZXItcmFkaXVzOjE0cHg7cGFkZGluZzo4cHg7dmVydGljYWwtYWxpZ246dG9wfScsCiAgICAnaDN7Zm9udDo2MDAgMTNweCBzeXN0ZW0tdWk7bWFyZ2luOjRweCA2cHg7Y29sb3I6IzIyMn08L3N0eWxlPiddOwogIHNhbXBsZXMuZm9yRWFjaCgoW24sIHBdKSA9PiB7CiAgICBjb25zdCBzdmcgPSByZW5kZXJGaXR0aW5nKHApOwogICAgZnMud3JpdGVGaWxlU3luYyhwYXRoLmpvaW4ob3V0LCAncmVuZGVyLXZpZXctJyArIG4gKyAnLnN2ZycpLCBzdmcpOwogICAgcGFnZS5wdXNoKGA8ZGl2IGNsYXNzPSJjYXJkIj48aDM+JHtufTwvaDM+JHtzdmd9PC9kaXY+YCk7CiAgICBjb25zb2xlLmxvZygnb2sgJyArIG4ucGFkRW5kKDEwKSArICcgYnl0ZXM9JyArIHN2Zy5sZW5ndGgpOwogIH0pOwogIGZzLndyaXRlRmlsZVN5bmMocGF0aC5qb2luKG91dCwgJ3JlbmRlci12aWV3Lmh0bWwnKSwgcGFnZS5qb2luKCdcbicpKTsKICBjb25zb2xlLmxvZygnLT4gJyArIHBhdGguam9pbihvdXQsICdyZW5kZXItdmlldy5odG1sJykpOwp9Cgp9KSh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA\\\/IHdpbmRvdyA6IG51bGwpOwoKPC9zY3JpcHQ+CiAgPHNjcmlwdD4KLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogV2Vpc3MgQXBwYXJhdGViYXUgLSBGaXR0aW5ncy1Lb25maWd1cmF0b3IgIMK3ICBhcHAuanMKICogU3RhdGUsIEJlcmF0ZXItRmxvdywgTGl2ZS1aZWljaG51bmcsIExpdmUtUHJlaXMsIENvbnN0cmFpbnRzLCBUeXBlbnNjaGx1ZXNzZWwsCiAqIFJGUSAobWFpbHRvKSwgVGVpbGVuLUxpbmssIFBERi1FeHBvcnQuIFZhbmlsbGEsIGVpbiBXaWRnZXQsIGlGcmFtZS10YXVnbGljaC4KICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KJ3VzZSBzdHJpY3QnOwooZnVuY3Rpb24gKCkgewogIGNvbnN0IEQgPSB3aW5kb3cuV0VJU1NfREFUQSwgU1ZHID0gd2luZG93LldlaXNzRml0dGluZ1NWRzsKICBpZiAoIUQgfHwgIVNWRykgeyBjb25zb2xlLmVycm9yKCdXRUlTUzogZGF0YS5qcy9kcmF3LmpzIGZlaGxlbicpOyByZXR1cm47IH0KCiAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVdGlsaXRpZXMgKi8KICBjb25zdCAkID0gcyA9PiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHMpOwogIGNvbnN0IGVzYyA9IHMgPT4gU3RyaW5nKHMgPT0gbnVsbCA\\\/ICcnIDogcykucmVwbGFjZSgvWyY8PiJdL2csIGMgPT4gKHsgJyYnOicmYW1wOycsJzwnOicmbHQ7JywnPic6JyZndDsnLCciJzonJnF1b3Q7JyB9W2NdKSk7CiAgY29uc3QgZXVyID0gdiA9PiB2LnRvTG9jYWxlU3RyaW5nKCdkZS1ERScsIHsgbWluaW11bUZyYWN0aW9uRGlnaXRzOiAyLCBtYXhpbXVtRnJhY3Rpb25EaWdpdHM6IDIgfSk7CgogIGZ1bmN0aW9uIHJlbmRlclByaWNlSGludCgpIHsKICAgIGNvbnN0IGJveCA9ICQoJyN3ei1wcmljZS1oaW50Jyk7CiAgICBpZiAoIWJveCkgcmV0dXJuOwogICAgY29uc3QgbGFiZWwgPSBELnByZWlzZSAmJiBELnByZWlzZS5ncnVwcGUgPT09ICdvZW0nID8gJ09FTS1QcmVpc2UnIDogJ0VuZGt1bmRlbnByZWlzZSc7CiAgICBjb25zdCBsaXZlID0gaWQgPT4gewogICAgICBjb25zdCBuID0gRC5ub3JtZW4uZmluZCh4ID0+IHguaWQgPT09IGlkKTsKICAgICAgcmV0dXJuICEhKG4gJiYgbi5wcmVpc01vZHVzID09PSAnbGl2ZScgJiYgRC5wcmVpc2UgJiYgRC5wcmVpc2UuZnJlaWdlZ2ViZW4gPT09IHRydWUpOwogICAgfTsKICAgIGlmIChELnByZWlzZSAmJiBELnByZWlzZS5ncnVwcGUpIHsKICAgICAgYm94LmlubmVySFRNTCA9IGA8Yj4ke2xhYmVsfTwvYj4gwrcgRElOIDMyNjc2ICR7bGl2ZSgnZGluMzI2NzYnKSA\\\/ICdtaXQgUHJlaXNlbicgOiAnYXVmIEFuZnJhZ2UnfSDCtyBESU4gMTE4NjUgJHtsaXZlKCdkaW4xMTg2NScpID8gJ21pdCBQcmVpc2VuJyA6ICdhdWYgQW5mcmFnZSd9YDsKICAgIH0KICB9CgogIGNvbnN0IElDT04gPSB7CiAgICBwaGFybWE6JzxwYXRoIGQ9Ik05IDNoNk0xMCAzdjZsLTUgOGEyIDIgMCAwIDAgMS44IDNoMTAuNEEyIDIgMCAwIDAgMTkgMTdsLTUtOFYzTTcuNSAxNGg5IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIxLjciIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPicsCiAgICBzdGVyaWx0ZWNobmlrOic8cGF0aCBkPSJNMTIgM2w3IDN2NWMwIDQuNC0zIDcuNy03IDktNC0xLjMtNy00LjYtNy05VjZsNy0zek05IDEybDIgMiA0LTQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjEuNyIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+JywKICAgIGNoZW1pZTonPHBhdGggZD0iTTEwIDN2NWwtNC41IDlBMiAyIDAgMCAwIDcuMyAyMGg5LjRhMiAyIDAgMCAwIDEuOC0zTDE0IDhWM005IDNoNk02LjUgMTVoMTEiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjEuNyIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+JywKICAgIGxlYmVuc21pdHRlbDonPHBhdGggZD0iTTYgM3Y3YTMgMyAwIDAgMCA2IDBWM005IDN2MThNMTcgM2MtMS41IDEuNS0yIDMtMiA1djRoM1YzTTE4IDEydjkiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjEuNyIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+JywKICAgIGluZm86JzxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjkiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjEuNyIvPjxwYXRoIGQ9Ik0xMiAxMXY1TTEyIDhoLjAxIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIxLjciIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPicsCiAgICBjb3B5Oic8cmVjdCB4PSI5IiB5PSI5IiB3aWR0aD0iMTEiIGhlaWdodD0iMTEiIHJ4PSIyIiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIxLjciLz48cGF0aCBkPSJNNSAxNVY1YTIgMiAwIDAgMSAyLTJoMTAiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjEuNyIvPicsCiAgICBjaGVjazonPHBhdGggZD0iTTUgMTJsNCA0IDEwLTEwIiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4nLAogICAgYXJyb3dSOic8cGF0aCBkPSJNNSAxMmgxNE0xMyA2bDYgNi02IDYiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjEuOSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+JywKICAgIGFycm93TDonPHBhdGggZD0iTTE5IDEySDVNMTEgNmwtNiA2IDYgNiIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMS45IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4nLAogICAgcGRmOic8cGF0aCBkPSJNMTQgM0g3YTIgMiAwIDAgMC0yIDJ2MTRhMiAyIDAgMCAwIDIgMmgxMGEyIDIgMCAwIDAgMi0yVjhsLTUtNXpNMTQgM3Y1aDUiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjEuNyIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPicsCiAgICBzaGFyZTonPHBhdGggZD0iTTQgMTJ2N2ExIDEgMCAwIDAgMSAxaDE0YTEgMSAwIDAgMCAxLTF2LTdNMTIgMTVWM004IDdsNC00IDQgNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMS43IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4nLAogICAgcGx1czonPHBhdGggZD0iTTEyIDV2MTRNNSAxMmgxNCIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMS45IiBzdHJva2UtbGluZWNhcD0icm91bmQiLz4nLAogICAgZHJhdzonPHBhdGggZD0iTTQgMTdsNi02IDQgNCA2LThNNCAyMWgxNiIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMS42IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4nLAogICAgZXhwYW5kOic8cGF0aCBkPSJNNCA5VjRoNU0yMCA5VjRoLTVNNCAxNXY1aDVNMjAgMTV2NWgtNSIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMS44IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4nLAogICAgY2xvc2U6JzxwYXRoIGQ9Ik02IDZsMTIgMTJNMTggNkw2IDE4IiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIxLjkiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPicsCiAgICByZXNldDonPHBhdGggZD0iTTMgMTJhOSA5IDAgMSAwIDIuNi02LjRMMyA4TTMgM3Y1aDUiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjEuOCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+JwogIH07CiAgY29uc3QgaWMgPSAobiwgY2xzKSA9PiBgPHN2ZyBjbGFzcz0iJHtjbHMgfHwgJ2ljJ30iIHZpZXdCb3g9IjAgMCAyNCAyNCIgYXJpYS1oaWRkZW49InRydWUiPiR7SUNPTltuXSB8fCAnJ308L3N2Zz5gOwoKICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExvb2t1cHMgKi8KICBjb25zdCB0eXBPYmogPSBpZCA9PiBELnR5cGVuLmZpbmQodCA9PiB0LmlkID09PSBpZCk7CiAgY29uc3QgZGljaHRPYmogPSBpZCA9PiBELmRpY2h0dW5nZW4uZmluZChkID0+IGQuaWQgPT09IGlkKTsKICBjb25zdCBpc0JlbmQgPSB0ID0+IHQgJiYgKHQuc3ZnVHlwZSA9PT0gJ2JvZ2VuOTAnIHx8IHQuc3ZnVHlwZSA9PT0gJ2JvZ2VuNDUnKTsKICBjb25zdCBpc0Nvbm5lY3QgPSB0ID0+ICEhKHQgJiYgdC5jb25uZWN0KTsKICBjb25zdCBpc0RpbjExODY1ID0gdCA9PiAhISh0ICYmIHQubm9ybSA9PT0gJ2RpbjExODY1Jyk7CiAgY29uc3Qgcm93czMyID0gciA9PiBELm1hc3NlLmRpbjMyNjc2LnJlaWhlbltyXS5yb3dzOwogIGNvbnN0IGxibCA9IHIgPT4gciA\\\/IChyLmxhYmVsIHx8IHIuaWQpIDogJyc7CiAgY29uc3QgY29ubmVjdERhdGEgPSB0ID0+ICF0ID8gbnVsbCA6ICh0LmlkID09PSAnQ0YnID8gRC5tYXNzZS5jb25uZWN0LmNmIDogdC5pZCA9PT0gJ0NGSScgPyBELm1hc3NlLmNvbm5lY3QuY2ZpIDogbnVsbCk7CiAgLy8gV2Vya3N0b2Zmc2VyaWUgZGVyIENvbm5lY3QtRmxhbnNjaGU6IHdpcmQgdWViZXIgZGllIFdlcmtzdG9mZm51bW1lciBnZWZ1ZWhydAogIC8vIChIZXJzdGVsbGVya3VlcnplbCBzaW5kIHNlaXQgZGVtIDI3LjA3LjIwMjYgcmF1cywgc2llaGUgZGF0YS5qcykuCiAgY29uc3QgY29ubmVjdFNlcmllID0gcyA9PiBlZmZXZXJrc3RvZmYocyk7CiAgZnVuY3Rpb24gb2JlcmZsYWVjaGVuT3B0aW9uZW4ocykgewogICAgY29uc3QgdCA9IHR5cE9iaihzICYmIHMudHlwKTsKICAgIC8vIERpZSBDb25uZWN0LURhdGVuYmxhZXR0ZXIgYmVsZWdlbiBmdWVyIENGIGRpZSBBdXNmdWVocnVuZyBINC4KICAgIC8vIEZ1ZXIgQ0ZJIGlzdCB6dXNhZXR6bGljaCBkaWUgZWxla3Ryb3BvbGllcnRlIEF1c2Z1ZWhydW5nIEg0byBhdWZnZWZ1ZWhydC4KICAgIC8vIEFuZGVyZSBESU4tMTE4NjYtS2xhc3NlbiB3ZXJkZW4gZnVlciBkaWVzZSBQcm9kdWt0ZmFtaWxpZW4gbmljaHQgYW5nZWJvdGVuLgogICAgY29uc3QgaWRzID0gdCAmJiB0LmlkID09PSAnQ0YnID8gWydINCddIDogdCAmJiB0LmlkID09PSAnQ0ZJJyA\\\/IFsnSDQnLCAnSDRvJ10gOiBudWxsOwogICAgcmV0dXJuIGlkcyA\\\/IGlkcy5tYXAoaWQgPT4gRC5vYmVyZmxhZWNoZW4uZmluZChvID0+IG8uaWQgPT09IGlkKSkuZmlsdGVyKEJvb2xlYW4pIDogRC5vYmVyZmxhZWNoZW47CiAgfQogIGNvbnN0IG9iZXJmbGFlY2hlRXJsYXVidCA9IHMgPT4gb2JlcmZsYWVjaGVuT3B0aW9uZW4ocykuc29tZShvID0+IG8uaWQgPT09IHMub2JlcmZsYWVjaGUpOwoKICAvKiAtLSBNYXNzcXVlbGxlIGplIFR5cCAoZGF0YS5qczogdHlwLm1hc3NlUXVlbGxlKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAqIERlciBkaWNrd2FuZGlnZSBUYW5rc3R1dHplbiAoVENEKSBoYXQgZWluZSBFSUdFTkUgTWFzc3RhYmVsbGUgKG1hc3NlLnRjZCwKICAgKiB6aW1tZXJsaW4tRGF0ZW5ibGF0dCwgQWVuZGVydW5nc3BsYW4gQWJzY2huaXR0IEYpIC0gYW5kZXJlIFJvaHJtYXNzZSBhbHMgZGllCiAgICogZHVlbm53YW5kaWdlIERJTi0zMjY3Ni1SZWloZS4gQmlzIDE2LjA3LjIwMjYgd2FyIGRhcyBGbGFnIHJlaW5lIERva3UgdW5kIHJvd3NGb3IoKQogICAqIGxpZWZlcnRlIGZ1ZXIgVENEIHVuYmVkaW5ndCByb3dzMzIoKSAtPiBUQ0QvRE4yNSB6ZWlndGUgZGllIGR1ZW5ud2FuZGlnZW4g4oyAMjkgeCAxLDUKICAgKiBzdGF0dCBkZXIgZGlja3dhbmRpZ2VuIOKMgDM0IHggNC4gV2VyIGhpZXIgZWluZW4gVHlwIGVyZ2Flbnp0OiBtYXNzZVF1ZWxsZSBpbiBkYXRhLmpzCiAgICogc2V0emVuIHVuZCBoaWVyIGVpbnRyYWdlbiAtIE5JRSBzdGlsbHNjaHdlaWdlbmQgYXVmIHJvd3MzMigpIHp1cnVlY2tmYWxsZW4uCiAgICogRGllIFRDRC1aZWlsZW4gdHJhZ2VuIGJld3Vzc3QgQU5ERVJFIEZlbGRuYW1lbiBhbHMgZGllIGR1ZW5ud2FuZGlnZW46CiAgICogICBkdWVubndhbmRpZzogdHViZU9EIC8gdHViZUlEIC8ga2sgLyBrbCAvIGdhc2tldE9EIC8gZ2Fza2V0SUQKICAgKiAgIFRDRDogICAgICAgICBhdXNzZW5EIChTcGFsdGUgQSkgLyBob2VoZSAoNjApIC8gd2FsbCAoNCkgLSBrZWluIHR1YmVPRCwga2VpbiBray9rbCwKICAgKiAgICAgICAgICAgICAgICBrZWluZSBJbm5lbi0vRGljaHR1bmdzbWFzc2UgKGltIERhdGVuYmxhdHQgbmljaHQgZ2VsaXN0ZXQpLgogICAqIERlc2hhbGIgTklFIHVuZ2VwcnVlZnQgcncudHViZU9EIGxlc2VuIC0+IGltbWVyIG9kT2YocncpLiAqLwogIGNvbnN0IE1BU1NRVUVMTEVOID0geyB0Y2Q6IHIgPT4gRC5tYXNzZS50Y2QucmVpaGVuW3JdLnJvd3MgfTsKICBjb25zdCByb3dzUXVlbGxlID0gKHQsIHJlaWhlKSA9PiB7CiAgICBjb25zdCBxID0gdCAmJiB0Lm1hc3NlUXVlbGxlID8gTUFTU1FVRUxMRU5bdC5tYXNzZVF1ZWxsZV0gOiBudWxsOwogICAgcmV0dXJuIHEgPyBxKHJlaWhlKSA6IHJvd3MzMihyZWloZSk7CiAgfTsKICAvKiBBdXNzZW5kdXJjaG1lc3NlciBlaW5lciBaZWlsZSAtIGVnYWwgYXVzIHdlbGNoZXIgVGFiZWxsZS4KICAgKiBUQ0Q6IGF1c3NlbkQgKFNwYWx0ZSBBIGRlcyBEYXRlbmJsYXR0cykuIER1ZW5ud2FuZGlnOiB0dWJlT0QuCiAgICogQmVpZGVzIHNpbmQgZ2VsaXN0ZXRlIFF1ZWxsd2VydGUsIGhpZXIgd2lyZCBOSUNIVFMgZ2VyZWNobmV0LiAqLwogIGNvbnN0IG9kT2YgPSBydyA9PiBydyA\\\/IChydy5hdXNzZW5EICE9IG51bGwgPyBydy5hdXNzZW5EIDogKHJ3LnR1YmVPRCAhPSBudWxsID8gcncudHViZU9EIDogcncuRGUpKSA6IG51bGw7CiAgY29uc3QgaWRPZiA9IHJ3ID0+IHJ3ID8gKHJ3LnR1YmVJRCAhPSBudWxsID8gcncudHViZUlEIDogcncuRGkpIDogbnVsbDsKICBjb25zdCB3YWxsT2YgPSBydyA9PiB7CiAgICBpZiAoIXJ3KSByZXR1cm4gbnVsbDsKICAgIGlmIChydy53YWxsICE9IG51bGwpIHJldHVybiBydy53YWxsOwogICAgY29uc3Qgb2QgPSBvZE9mKHJ3KSwgaWQgPSBpZE9mKHJ3KTsKICAgIHJldHVybiBvZCAhPSBudWxsICYmIGlkICE9IG51bGwgPyAob2QgLSBpZCkgLyAyIDogbnVsbDsKICB9OwogIC8qIExhZW5nZW5tYXNzIGVpbmVyIFplaWxlOgogICAqICAgVENEICAtPiBIb2VoZSBoID0gNjAgbW0gKFRDRF9LT05TVCwgV2Vpc3MtU3RhbmRhcmQgbGF1dCBCZXJuZCkgLSBLRUlOIEtLL0tMLgogICAqICAgc29uc3QgLT4gU3R1dHplbmxhZW5nZSBLSy9LTCBhdXMgZGVyIGR1ZW5ud2FuZGlnZW4gVGFiZWxsZS4KICAgKiBHaWJ0IHt3ZXJ0LCBsYWJlbH0genVydWVjazsgbnVsbCwgd2VubiBkaWUgWmVpbGUga2VpbiBMYWVuZ2VubWFzcyB0cmFlZ3QuICovCiAgZnVuY3Rpb24gbGFlbmdlT2YodCwgcncsIGxhZW5nZVZhcmlhbnRlKSB7CiAgICBpZiAoIXJ3KSByZXR1cm4gbnVsbDsKICAgIGlmIChydy5ob2VoZSAhPSBudWxsKSByZXR1cm4geyB3ZXJ0OiBydy5ob2VoZSwgbGFiZWw6ICdoJywgdGV4dDogJ0jDtmhlJyB9OwogICAgaWYgKHQgJiYgdC5sYWVuZ2VWYXJpYW50ZSkgewogICAgICBjb25zdCB2ID0gbGFlbmdlVmFyaWFudGUgPT09ICdLTCcgPyBydy5rbCA6IHJ3LmtrOwogICAgICByZXR1cm4gdiA9PSBudWxsID8gbnVsbCA6IHsgd2VydDogdiwgbGFiZWw6ICdMJywgdGV4dDogJ1N0dXR6ZW5sw6RuZ2UgKCcgKyBsYWVuZ2VWYXJpYW50ZSArICcpJyB9OwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICAvKiAtLSBGbGFuc2NoLVR5cGVuIChCbGluZGRlY2tlbCArIEtsYW1tZXIsIEFlbmRlcnVuZ3NwbGFuIEFic2Nobml0dCBEKSAtLS0tCiAgICogRGllc2UgVHlwZW4ga2VubmVuIEtFSU5FIFJlaWhlIEEvQi9DIHVuZCBLRUlORSBOZW5ud2VpdGUgLSBzaWUgaGFlbmdlbgogICAqIGF1c3NjaGxpZXNzbGljaCBhbSBGbGFuc2NoLcOYIChCZXJuZCAxNi4wNy4yMDI2KS4gc3RhdGUucmVpaGUvc3RhdGUuZ3JvZXNzZQogICAqIHdlcmRlbiBmdWVyIHNpZSBuaWNodCBnZWxlc2VuOyBhbGxlcyBsYWV1ZnQgdWViZXIgc3RhdGUuZmxhbnNjaC4KICAgKiBEZXNoYWxiIGxpZWZlcnQgcm93Rm9yKCkgaGllciBiZXd1c3N0IG51bGw6IGVzIGdpYnQga2VpbmUgRElOMzI2NzYtWmVpbGUsCiAgICogZGllIHp1IGVpbmVtIEZsYW5zY2gtw5ggZWluZGV1dGlnIGdlaG9lcnQgKGVpbiBGbGFuc2NoIHRyYWVndCBtZWhyZXJlIFJvaHIt4oyAKS4KICAgKiBKZWRlIFN0ZWxsZSwgZGllIHJ3IGJyYXVjaHQsIG11c3MgZGVuIG51ckZsYW5zY2gtRmFsbCBnZXRyZW5udCBiZWhhbmRlbG4gLQogICAqIE5JRSBhdWYgcm93czMyKC4uLilbMF0genVydWVja2ZhbGxlbiwgZGFzIHdhZXJlIGVpbmUgZmFsc2NoZSBHcm9lc3NlLiAqLwogIGNvbnN0IGlzdE51ckZsYW5zY2ggPSB0ID0+ICEhKHQgJiYgdC5udXJGbGFuc2NoKTsKICAvKiAtLSBUeXBlbiBvaG5lIGJlbGVndGUgTWFzc3F1ZWxsZSAoQ0YvQ0ZJLCBBZW5kZXJ1bmdzcGxhbiBBYnNjaG5pdHQgRykgLS0tCiAgICogbWFzc2VGb2xndDp0cnVlIGhlaXNzdDogRnVlciBkaWVzZW4gVHlwIGxpZWd0IFVFQkVSSEFVUFQgS0VJTiBmcmVpZ2VnZWJlbmVzIE1hc3Mgdm9yIC0KICAgKiB3ZWRlciBlaW5lIFJlaWhlL05lbm53ZWl0ZSBub2NoIGVpbiBGbGFuc2NoLcOYLiBBbmRlcnMgYWxzIGJlaSBudXJGbGFuc2NoIChCbGluZGRlY2tlbC8KICAgKiBLbGFtbWVyOiBGbGFuc2NoLcOYIGlzdCBiZWxlZ3QsIGRlciBSZXN0IGZlaGx0KSBnaWJ0IGVzIGhpZXIgZ2FyIGtlaW5lbiBBbmtlci4KICAgKiBLb25zZXF1ZW56IGFuIEpFREVSIFN0ZWxsZTogcm93c0ZvcigpIC0+IFtdLCBwYXJhbXNGb3IoKSAtPiBudWxsLCBrZWluZSBHcm9lc3Nlbmxpc3RlLAogICAqIGtlaW5lIFplaWNobnVuZywga2VpbiBQcmVpcy4gTklFIGF1ZiByb3dzMzIoLi4uKSB6dXJ1ZWNrZmFsbGVuIC0gZGFzIHNpbmQgZGllCiAgICogRFVFTk5XQU5ESUdFTiBESU4tMzI2NzYtUm9ocm1hc3NlLCBkaWUgbWl0IENGL0NGSSBuaWNodHMgenUgdHVuIGhhYmVuIChnZW5hdSBkYXMgd2FyCiAgICogZGVyIEZlaGxlciB2b3IgZGVtIDE2LjA3LjIwMjYpLgogICAqIEFDSFRVTkcgZnVlciBOYWNoZm9sZ2VyIC0gU3RhbmQgMTYuMDcuMjAyNiwgd2VsY2hlIGRhdGEuanMtRmxhZ3Mgd2lya2xpY2ggd2lya2VuOgogICAqICAgVkVSRFJBSFRFVDogYG1hc3NlRm9sZ3RgLCBgbnVyRmxhbnNjaGAsIGBtYXNzZVF1ZWxsZWAgKC0+IHJvd3NRdWVsbGUvcm93c0ZvciksCiAgICogICAgICAgICAgICAgICBgZWluemVsU3R1dHplbmAgKC0+IHBhcmFtc0ZvcjogcC50eXBlPSdzdHV0emVuJyksIGBsYWVuZ2VWYXJpYW50ZWAuCiAgICogICBSRUlORSBET0tVOiBgemVpY2hudW5nT2huZU1hc3NlYCwgYGtvbXBsZXR0ZVZlcmJpbmR1bmdgLiBXZXIgc2ljaCBhdWYgZWluIERva3UtRmxhZwogICAqICAgICAgICAgICAgICAgdmVybGFlc3N0LCBiYXV0IHN0aWxsIHdpZWRlciBmYWxzY2hlIE1hc3NlIGVpbiAtIGVyc3QgdmVyZHJhaHRlbi4gKi8KICBjb25zdCBpc3RNYXNzZUZvbGd0ID0gdCA9PiAhISh0ICYmIHQubWFzc2VGb2xndCk7CiAgY29uc3QgaXN0S2xhbW1lciA9IHQgPT4gISEodCAmJiB0LmtsYW1tZXJUeXBlbik7CiAgLyogLS0gQmF1dGVpbCAiRGljaHR1bmciIChUeXAgRCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKICAgKiBCZXJuZCBMaW5rZXIsIDExLjA4LjIwMjY6ICJXZXJrc3RvZmYvT2JlcmZsYWVjaGUgaXN0IGhpZXIgdW5udWV0eiBkYSBudXIKICAgKiBFZGVsc3RhaGwgbWl0IGVudHNwcmVjaGVuZGVuIE9iZXJmbGFlY2hlbiBhbmdlemVpZ3Qgd2lyZC4gS2FubnN0IGR1IGRhcwogICAqIFNwZXJyZW4gYmVpIEJhdXRlaWwgRGljaHR1bmcgZGFzIG1hbiBudXI6IEJhdXRlaWwgLT4gR3JvZXNzZSAtPiBEaWNodHVuZyAtPgogICAqIE5hY2h3ZWlzZSBoYXQ\\\/IiAtPiBTY2hyaXR0IDUgZW50ZmFlbGx0IGZ1ZXIgVHlwIEQgKGFwcGxpY2FibGUoKSksIHVuZCBkZXIKICAgKiBFZGVsc3RhaGwtV2Vya3N0b2ZmIHNhbXQgT2JlcmZsYWVjaGUgdmVyc2Nod2luZGV0IHVlYmVyYWxsIGRvcnQsIHdvIGVyIHNvbnN0CiAgICoga3VuZGVuc2ljaHRiYXIgd3VlcmRlOiBWb3JzY2hhdS1DaGlwcywgRGF0ZW5ibGF0dCB1bmQgQW5mcmFnZXRleHQuIERlcgogICAqIFdlcmtzdG9mZiBkZXIgRGljaHR1bmcgc3RlaHQgd2VpdGVyaGluIGluIGRlciBlaWdlbmVuIFplaWxlICJEaWNodHVuZyIuCiAgICogTklDSFQgdWViZXIgdC5kaWNodHVuZyBwcnVlZmVuIC0gZGFzIEZsYWcgdHJhZWd0IGF1Y2ggVHlwIFRDIChrb21wbGV0dGUKICAgKiBWZXJiaW5kdW5nKSwgdW5kIGRlciBiZXN0ZWh0IHNlaHIgd29obCBhdXMgRWRlbHN0YWhsLiAqLwogIGNvbnN0IGlzdERpY2h0dW5nQmF1dGVpbCA9IHQgPT4gISEodCAmJiB0LmlkID09PSAnRCcpOwogIC8qIEFud2VuZHVuZ3NhYmhhZW5naWdlIEZEQS1Lb25mb3JtaXRhZXQgKEJlcm5kIDExLjA4LjIwMjYpOiBQaGFybWEgdW5kCiAgICogU3RlcmlsdGVjaG5payAtPiBVU1AgQ2xhc3MgVkkgKyBBREkvQlNFL1RTRSwgTGViZW5zbWl0dGVsIHVuZCBDaGVtaWUgLT4KICAgKiBFRyAxOTM1LzIwMDQuIEVpbmUgUXVlbGxlIGZ1ZXIgTmFjaHdlaXMtU2Nocml0dCwgRGljaHR1bmdzLVNjaHJpdHQsCiAgICogRGF0ZW5ibGF0dCB1bmQgQW5mcmFnZXRleHQuICovCiAgY29uc3QgZmRhVGV4dCA9ICgpID0+IChELmZkYUtvbmZvcm1pdGFldCB8fCB7fSlbc3RhdGUuYW53ZW5kdW5nXSB8fCBELmZkYUtvbmZvcm1pdGFldEZhbGxiYWNrIHx8ICdGREEnOwogIGNvbnN0IGZkYUt1cnpUZXh0ID0gKCkgPT4gKEQuZmRhS3VyeiB8fCB7fSlbc3RhdGUuYW53ZW5kdW5nXSB8fCBudWxsOwogIC8vIEJlcm5kIExpbmtlciwgMDEuMDkuMjAyNjogRGFzIEFibmFobWVwcnVlZnpldWduaXMgMy4xIG5hY2ggQUQtVzIgd2lyZCBlaW5tYWwgamUKICAvLyBDaGFyZ2UgYXVzZ2VzdGVsbHQsIG5pY2h0IGplIEJhdXRlaWwuIEZlcnJpdC1NZXNzdW5nIHVuZCBSYS1NZXNzcHJvdG9rb2xsIGJsZWliZW4KICAvLyBkYWdlZ2VuIGF1c2RydWVja2xpY2ggamUgU3R1ZWNrLCB3ZWlsIGplZGVzIGVpbnplbG5lIFRlaWwgZ2VtZXNzZW4gdW5kCiAgLy8gcHJvdG9rb2xsaWVydCB3aXJkLiBTZWluIFJlY2hlbmJlaXNwaWVsOiA1IFN0dWVjayB6dSA3MCw4MCBzaW5kIDM1NCwwMCBwbHVzCiAgLy8gZWlubWFsaWcgMTUsMDAgZnVlciBkYXMgWmV1Z25pcywgYWxzbyAzNjksMDAgdW5kIG5pY2h0IDQyOSwwMC4KICBjb25zdCBOQUNIV0VJU19KRV9DSEFSR0UgPSBbJ0VOMTAyMDRfMzFfQURXMiddOwogIGNvbnN0IGlzdENoYXJnZW5OYWNod2VpcyA9IGlkID0+IE5BQ0hXRUlTX0pFX0NIQVJHRS5pbmRleE9mKGlkKSA+PSAwOwogIGNvbnN0IGNoYXJnZW5BdWZwcmVpc0Z1ZXIgPSBpZCA9PiB7CiAgICBjb25zdCBQID0gRC5wcmVpc2UgfHwge307CiAgICBjb25zdCBiZXRyYWcgPSBQLm5hY2h3ZWlzQXVmcHJlaXNFdXJvICYmIFAubmFjaHdlaXNBdWZwcmVpc0V1cm9baWRdOwogICAgcmV0dXJuIChiZXRyYWcgPT0gbnVsbCkgPyBudWxsIDogTnVtYmVyKGJldHJhZykgKiAoUC5nbG9iYWxGYWt0b3IgfHwgMSk7CiAgfTsKICBjb25zdCBuYWNod2Vpc0xhYmVsID0gbncgPT4gKG53ICYmIG53LmFud2VuZHVuZ3NMYWJlbCA9PT0gJ2ZkYUtvbmZvcm1pdGFldCcpID8gZmRhVGV4dCgpIDogKG53ID8gbncubGFiZWwgOiAnJyk7CiAgY29uc3QgbmFjaHdlaXNMYWJlbEJ5SWQgPSBpZCA9PiBuYWNod2Vpc0xhYmVsKChELm5hY2h3ZWlzZSB8fCBbXSkuZmluZCh4ID0+IHguaWQgPT09IGlkKSk7CiAgY29uc3QgZmxhbnNjaE9iaiA9IGlkID0+IChELmZsYW5zY2hncm9lc3NlbiB8fCBbXSkuZmluZChmID0+IGYuaWQgPT09IGlkKTsKICBjb25zdCBrbGFtbWVyVHlwT2JqID0gaWQgPT4gKEQua2xhbW1lclR5cGVuIHx8IFtdKS5maW5kKGsgPT4gay5pZCA9PT0gaWQpOwogIGNvbnN0IGZsYW5zY2hGb3IgPSBzID0+IGZsYW5zY2hPYmoocy5mbGFuc2NoKSB8fCAoRC5mbGFuc2NoZ3JvZXNzZW4gfHwgW10pWzBdIHx8IG51bGw7CiAgLyogSXN0IGZ1ZXIgRElFU0VTIEJhdXRlaWwgaW4gRElFU0VSIEZsYW5zY2hncm9lc3NlIGF1c3NlciBkZW0gRmxhbnNjaC3DmCBub2NoIGtlaW4KICAgKiBNYXNzIGJlbGVndD8gRGllIEZyYWdlIGhhZW5ndCBhbSBCQVVURUlMLCBuaWNodCBhbiBlaW5lbSBlaW56ZWxuZW4gRmVsZC4KICAgKiBGcnVlaGVyIHN0YW5kIGhpZXIgc3RlbGx2ZXJ0cmV0ZW5kIGBibGluZFRoayA9PSBudWxsYC4gU2VpdCBCZXJuZHMgTmFjaHRyYWcgdm9tCiAgICogMjcuMDcuMjAyNiAoIkJsaW5kZGVja2VsOiAyODYsMTsgMzE5IHVuZCAzMzggZWluZmFjaCBNYXNzIEwgbWl0IDE0IGFuZ2ViZW4iKSBpc3QKICAgKiBibGluZFRoayBpbiBKRURFUiBHcm9lc3NlIGJlbGVndCAtIGRlciBUZXN0IHdhciBkYW1pdCB0b3QgdW5kIGhhdCBkZW4gSGlud2VpcwogICAqIGF1Y2ggYmVpIGRlciBLTEFNTUVSIHZlcnNjaGx1Y2t0LCBvYndvaGwgZXIgZG9ydCB3ZWl0ZXIgZ2lsdDogS0xBTU1FUl9BIGluIGRhdGEuanMKICAgKiBlbmRldCBiZWkgRmxhbnNjaC3ijIAgMjY4LCBmdWVyIDI4NiwxIC8gMzE5IC8gMzM4IGdpYnQgZXMga2VpbiBNYXNzIEEgKCJBdWYgQW5mcmFnZSIpLgogICAqIEtsYW1tZXIgLT4gTWFzcyBBIGRlcyBnZXdhZWhsdGVuIEtsYW1tZXJ0eXBzLCBCbGluZGRlY2tlbCAtPiBEZWNrZWxzdGFlcmtlIEwuICovCiAgZnVuY3Rpb24gZmxhbnNjaE1hc3NPZmZlbih0LCBmLCBrbGFtbWVyVHlwKSB7CiAgICBpZiAoIXQgfHwgIWYpIHJldHVybiBmYWxzZTsKICAgIGlmIChpc3RLbGFtbWVyKHQpKSByZXR1cm4gIShmLmtsYW1tZXJBICYmIGYua2xhbW1lckFba2xhbW1lclR5cF0gIT0gbnVsbCk7CiAgICBpZiAodC5zdmdUeXBlID09PSAnYmxpbmRkZWNrZWwnKSByZXR1cm4gZi5ibGluZFRoayA9PSBudWxsOwogICAgcmV0dXJuIGZhbHNlOwogIH0KICAvKiBGbGFuc2NoLcOYIGF1cyBkZW0gU3RhdGUgLSBlZ2FsIG9iIHVlYmVyIEZsYW5zY2gtTGlzdGUgb2RlciB1ZWJlciBlaW5lIFJlaWhlIGdld2FlaGx0LiAqLwogIGZ1bmN0aW9uIGZsYW5nZU9mU3RhdGUocykgewogICAgY29uc3QgdCA9IHR5cE9iaihzLnR5cCk7CiAgICBpZiAoaXN0TnVyRmxhbnNjaCh0KSkgeyBjb25zdCBmID0gZmxhbnNjaEZvcihzKTsgcmV0dXJuIGYgPyBmLmZsYW5nZU9EIDogbnVsbDsgfQogICAgY29uc3QgcncgPSByb3dGb3Iocyk7IHJldHVybiBydyA\\\/IHJ3LmZsYW5nZU9EIDogbnVsbDsKICB9CgogIC8qIC0tIFdlcmtzdG9mZmU6IEtsYW1tZXJuIGhhYmVuIGVpZ2VuZSAoQWJzY2huaXR0IEUpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgKiBCZXJuZDogIkFjaHR1bmcsIGRpZSBLbGFtbWVybiBoYWJlbiBhbmRlcmUgTWF0ZXJpYWxpZW4gYWxzIGRpZSBGaXR0aW5ncy4iCiAgICogLT4gMS40MzA4LzEuNDQwOCBzdGF0dCAxLjQ0MDQvMS40NDM1LCB1bmQgamUgS2xhbW1lcnR5cCBudXIgZGllIGVybGF1YnRlbi4KICAgKiBLbGFtbWVyLVdlcmtzdG9mZiBsaWVndCBpbiBzdGF0ZS5rbGFtbWVyV2Vya3N0b2ZmLCBnZXRyZW5udCB2b24gc3RhdGUud2Vya3N0b2ZmLAogICAqIGRhbWl0IGVpbiBXZWNoc2VsIEtsYW1tZXIgPC0+IEZpdHRpbmcgZGVuIGpld2VpbHMgYW5kZXJlbiBXZXJ0IG5pY2h0IHVlYmVyc2NocmVpYnQuCiAgICogQWxsZXMsIHdhcyBlaW5lbiBXZXJrc3RvZmYgYXVzZ2lidCwgbGFldWZ0IHVlYmVyIGVmZldlcmtzdG9mZigpLiAqLwogIGZ1bmN0aW9uIHdlcmtzdG9mZk9wdGlvbmVuKHMpIHsKICAgIGNvbnN0IHQgPSB0eXBPYmoocy50eXApOwogICAgaWYgKCFpc3RLbGFtbWVyKHQpKSByZXR1cm4gRC53ZXJrc3RvZmZlOwogICAgY29uc3Qga3QgPSBrbGFtbWVyVHlwT2JqKHMua2xhbW1lclR5cCk7CiAgICBjb25zdCBlcmxhdWJ0ID0ga3QgPyBrdC53ZXJrc3RvZmZlIDogW107CiAgICByZXR1cm4gKEQua2xhbW1lcldlcmtzdG9mZmUgfHwgW10pLmZpbHRlcih3ID0+IGVybGF1YnQuaW5kZXhPZih3LmlkKSA+PSAwKTsKICB9CiAgZnVuY3Rpb24gZWZmV2Vya3N0b2ZmKHMpIHsKICAgIGNvbnN0IHQgPSB0eXBPYmoocy50eXApOwogICAgaWYgKCFpc3RLbGFtbWVyKHQpKSByZXR1cm4gcy53ZXJrc3RvZmY7CiAgICBjb25zdCBhdiA9IHdlcmtzdG9mZk9wdGlvbmVuKHMpLm1hcCh3ID0+IHcuaWQpOwogICAgcmV0dXJuIGF2LmluZGV4T2Yocy5rbGFtbWVyV2Vya3N0b2ZmKSA+PSAwID8gcy5rbGFtbWVyV2Vya3N0b2ZmIDogKGF2WzBdIHx8IG51bGwpOwogIH0KCiAgZnVuY3Rpb24gcm93c0ZvcihzKSB7CiAgICBjb25zdCB0ID0gdHlwT2JqKHMudHlwKTsKICAgIGlmIChpc3ROdXJGbGFuc2NoKHQpKSByZXR1cm4gW107CiAgICAvLyBtYXNzZUZvbGd0IChDRi9DRkkpOiBLRUlORSBHcm9lc3NlbnplaWxlbi4gT2huZSBkaWVzZXMgW10gd3VlcmRlIGhpZXIgcm93czMyKHMucmVpaGUpCiAgICAvLyBncmVpZmVuIHVuZCBkZW0gS3VuZGVuIGRpZSBkdWVubndhbmRpZ2VuIERJTi0zMjY3Ni1NYXNzZSBhbHMgQ0YtTWFzc2UgdmVya2F1ZmVuLgogICAgaWYgKGlzdE1hc3NlRm9sZ3QodCkpIHJldHVybiBbXTsKICAgIGlmICh0ICYmIHQuaWQgPT09ICdDRicpIHsKICAgICAgY29uc3QgZ3J1cHBlID0gRC5tYXNzZS5jb25uZWN0LmNmLnJlaWhlbltzLmNvbm5lY3ROb3JtXSB8fCBELm1hc3NlLmNvbm5lY3QuY2YucmVpaGVuLkRJTjsKICAgICAgcmV0dXJuIGdydXBwZSA\\\/IGdydXBwZS5yb3dzIDogW107CiAgICB9CiAgICBpZiAodCAmJiB0LmlkID09PSAnQ0ZJJykgcmV0dXJuIEQubWFzc2UuY29ubmVjdC5jZmkucm93cyB8fCBbXTsKICAgIGlmICh0ICYmIHQuaWQgPT09ICdUU1InKSB7CiAgICAgIC8vIFJ1bmRlIDg6IGdlbGllZmVydGUgS29tYmluYXRpb25lbiAoRHVyY2hnYW5nL0FiendlaWcpIGF1cyBkZXIgS3VuZGVudGFiZWxsZS4KICAgICAgLy8gU2Nocml0dCA0IHplaWd0IG51ciBEdXJjaGfDpG5nZSwgZsO8ciBkaWUgbWluZGVzdGVucyBlaW4gYmVsZWd0ZXIgQWJ6d2VpZyBleGlzdGllcnQ7CiAgICAgIC8vIEwwL0wgc2luZCBqZSBEdXJjaGdhbmdzLUdydXBwZSBrb25zdGFudCB1bmQga29tbWVuIGF1cyBkZW0gZXJzdGVuIFBhYXIuCiAgICAgIGNvbnN0IHBhYXJlID0gKEQubWFzc2UuZGluMTE4NjUudFN0dWVja1JlZHV6aWVydC5yZWloZW5bcy5yZWloZV0gfHwge30pLnJvd3MgfHwgW107CiAgICAgIGNvbnN0IGJhc2lzID0gRC5tYXNzZS5kaW4xMTg2NS5ib2VnZW5bcy5yZWloZV0gfHwgW107CiAgICAgIGNvbnN0IGdlc2VoZW4gPSBuZXcgU2V0KCk7CiAgICAgIHJldHVybiBwYWFyZS5maWx0ZXIocCA9PiAhZ2VzZWhlbi5oYXMocC52b25JZCkgJiYgZ2VzZWhlbi5hZGQocC52b25JZCkpCiAgICAgICAgLm1hcChwID0+IHsKICAgICAgICAgIGNvbnN0IG1lcmdlZCA9IE9iamVjdC5hc3NpZ24oe30sIGJhc2lzLmZpbmQoYiA9PiBiLmlkID09PSBwLnZvbklkKSB8fCB7fSwgeyBpZDogcC52b25JZCwgTDA6IHAuTDAsIEw6IHAuTCwgTDE6IG51bGwsIEwyOiBudWxsLCBSOiBudWxsIH0pOwogICAgICAgICAgaWYgKCFtZXJnZWQubGFiZWwpIHsgY29uc3QgbSA9IHJvd3MzMihzLnJlaWhlKS5maW5kKHggPT4geC5pZCA9PT0gcC52b25JZCk7IGlmIChtKSBtZXJnZWQubGFiZWwgPSBtLmxhYmVsOyB9CiAgICAgICAgICByZXR1cm4gbWVyZ2VkOwogICAgICAgIH0pOwogICAgfQogICAgaWYgKHQgJiYgdC5pZCA9PT0gJ1RTJykgewogICAgICBjb25zdCBxdWVsbGUgPSBELm1hc3NlLmRpbjExODY1LnRTdHVlY2tHbGVpY2gucmVpaGVuW3MucmVpaGVdOwogICAgICBjb25zdCBiYXNpcyA9IEQubWFzc2UuZGluMTE4NjUuYm9lZ2VuW3MucmVpaGVdIHx8IFtdOwogICAgICByZXR1cm4gKHF1ZWxsZSA\\\/IHF1ZWxsZS5yb3dzIDogW10pLm1hcChyID0+IHsKICAgICAgICBjb25zdCBtZXJnZWQgPSBPYmplY3QuYXNzaWduKHt9LCBiYXNpcy5maW5kKGIgPT4gYi5pZCA9PT0gci5pZCkgfHwge30sIHIpOwogICAgICAgIGlmICghbWVyZ2VkLmxhYmVsKSB7IGNvbnN0IG0gPSByb3dzMzIocy5yZWloZSkuZmluZCh4ID0+IHguaWQgPT09IHIuaWQpOyBpZiAobSkgbWVyZ2VkLmxhYmVsID0gbS5sYWJlbDsgfQogICAgICAgIHJldHVybiBtZXJnZWQ7CiAgICAgIH0pOwogICAgfQogICAgaWYgKHQgJiYgdC5pZCA9PT0gJ1InKSB7CiAgICAgIGNvbnN0IHBhYXJlID0gKEQubWFzc2UuZGluMTE4NjUucmVkdXppZXJ1bmcucmVpaGVuW3MucmVpaGVdIHx8IHt9KS5yb3dzIHx8IFtdOwogICAgICBjb25zdCB2b24gPSBuZXcgU2V0KHBhYXJlLm1hcChyID0+IHIudm9uSWQpKTsKICAgICAgcmV0dXJuIChELm1hc3NlLmRpbjExODY1LmJvZWdlbltzLnJlaWhlXSB8fCBbXSkuZmlsdGVyKHIgPT4gdm9uLmhhcyhyLmlkKSk7CiAgICB9CiAgICAvLyBtYXNzZVF1ZWxsZSAoVENEKTogZWlnZW5lIFRhYmVsbGUgc3RhdHQgZGVyIGR1ZW5ud2FuZGlnZW4gRElOLTMyNjc2LVJlaWhlLgogICAgaWYgKCFpc0JlbmQodCkpIHJldHVybiByb3dzUXVlbGxlKHQsIHMucmVpaGUpOwogICAgLy8gQm9nZW4tVGFiZWxsZW4gdHJhZ2VuIGtlaW4gTGFiZWwgLT4gd2VubiBtb2VnbGljaCBhdXMgZGVyIDMyNjc2LVJlaWhlIHVlYmVybmVobWVuLgogICAgLy8gQmxvY2tpZXJ0ZSBaZWlsZW4gKGFrdHVlbGwgRE4yNSBtaXQgd2lkZXJzcHJ1ZWNobGljaGVtIEwzKSBzaW5kIG5pY2h0IHdhZWhsYmFyLgogICAgY29uc3QgYmFzZSA9IHJvd3MzMihzLnJlaWhlKTsKICAgIHJldHVybiAoRC5tYXNzZS5kaW4xMTg2NS5ib2VnZW5bcy5yZWloZV0gfHwgW10pLmZpbHRlcihyID0+IHIuc3RhdHVzICE9PSAnYmxvY2tpZXJ0JykubWFwKHIgPT4gewogICAgICBpZiAoci5sYWJlbCkgcmV0dXJuIHI7CiAgICAgIGNvbnN0IG0gPSBiYXNlLmZpbmQoeCA9PiB4LmlkID09PSByLmlkKTsKICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHIsIHsgbGFiZWw6IG0gPyBtLmxhYmVsIDogci5pZCB9KTsKICAgIH0pOwogIH0KICAvLyBudWxsIGJlaSBudXJGbGFuc2NoLVR5cGVuIChyb3dzRm9yIGxpZWZlcnQgZG9ydCBbXSkgLT4gQXVmcnVmZXIgbXVlc3NlbiBkYXMgYWJmYW5nZW4uCiAgZnVuY3Rpb24gcm93Rm9yKHMpIHsgY29uc3QgcnMgPSByb3dzRm9yKHMpOyByZXR1cm4gcnMuZmluZChyID0+IHIuaWQgPT09IHMuZ3JvZXNzZSkgfHwgcnNbMF0gfHwgbnVsbDsgfQogIC8qIC0tIFp3ZWl0ZXIgw5ggKCJSZWR1emllcnQgYXVmIiAvICJBYmdhbmciKTogbnVyIEtMRUlORVIgYWxzIGRpZSBOZW5ud2VpdGUgLS0tLS0tLS0tLS0KICAgKiBCZXJuZCBSMy0yL1IzLTQgKDE3LjA3LjIwMjYpOiAiTmVubndlaXRlIG11c3MgaW1tZXIgR1LDllNTRVIgc2VpbiBhbHMgJ1JlZHV6aWVydCBhdWYnLiIKICAgKiBEaWUgUmVpaGVuLVRhYmVsbGVuIChyb3dzMzIpIHNpbmQgYXVmc3RlaWdlbmQgc29ydGllcnQgLT4ga2xlaW5lcmUgTmVubndlaXRlID0gZnLDvGhlcmVyCiAgICogSW5kZXguIHJvd3MyRm9yKCkgbGllZmVydCBkZXNoYWxiIGdlbmF1IGRpZSBaZWlsZW4gVk9SIGRlciBnZXfDpGhsdGVuIE5lbm53ZWl0ZS4KICAgKiBJc3QgZGllIGtsZWluc3RlIEdyw7bDn2UgZ2V3w6RobHQgKEluZGV4IDApIG9kZXIgaXN0IGdyb2Vzc2UgdW5iZWthbm50IC0+IFtdIChrZWluZQogICAqIGtsZWluZXJlIEdyw7bDn2UpLiBEZXIgQXVmcnVmZXIgYmVoYW5kZWx0IGRhcyBzYXViZXIgKFBsYXR6aGFsdGVyLyJmb2xndCIsIGtlaW4gQWJzdHVyeikuCiAgICogRGllIGdlbmF1ZW4gZ8O8bHRpZ2VuIEtvbWJpbmF0aW9uZW4gbGllZmVydCBCZXJuZCBub2NoIGFscyBWb3JsYWdlOyBiaXMgZGFoaW4gZ2lsdCBkaWUKICAgKiBzaW1wbGUgS2xlaW5lci1SZWdlbCAtIGVzIHdpcmQgTklDSFRTIGVyZnVuZGVuLCBudXIgZ2VmaWx0ZXJ0LiAqLwogIGZ1bmN0aW9uIHJvd3MyRm9yKHMpIHsKICAgIGNvbnN0IHQgPSB0eXBPYmoocy50eXApOwogICAgaWYgKHQgJiYgdC5pZCA9PT0gJ1InKSB7CiAgICAgIGNvbnN0IHBhYXJlID0gKEQubWFzc2UuZGluMTE4NjUucmVkdXppZXJ1bmcucmVpaGVuW3MucmVpaGVdIHx8IHt9KS5yb3dzIHx8IFtdOwogICAgICBjb25zdCBpZHMgPSBuZXcgU2V0KHBhYXJlLmZpbHRlcihwID0+IHAudm9uSWQgPT09IHMuZ3JvZXNzZSkubWFwKHAgPT4gcC5uYWNoSWQpKTsKICAgICAgcmV0dXJuIChELm1hc3NlLmRpbjExODY1LmJvZWdlbltzLnJlaWhlXSB8fCBbXSkuZmlsdGVyKHIgPT4gaWRzLmhhcyhyLmlkKSk7CiAgICB9CiAgICBpZiAodCAmJiB0LmlkID09PSAnVFNSJykgewogICAgICAvLyBSdW5kZSA4OiBkZXIgQWJ6d2VpZyBiaWV0ZXQgTlVSIGRpZSBnZWxpZWZlcnRlbiwgYmVsZWd0ZW4gS29tYmluYXRpb25lbiBhbiAtCiAgICAgIC8vIG5pY2h0IGJlbGVndGUgUGFhcmUgYmxlaWJlbiB1bnNpY2h0YmFyIChmYWlsLWNsb3NlZCBzdGF0dCBLbGVpbmVyLVJlZ2VsKS4KICAgICAgY29uc3QgcGFhcmUgPSAoRC5tYXNzZS5kaW4xMTg2NS50U3R1ZWNrUmVkdXppZXJ0LnJlaWhlbltzLnJlaWhlXSB8fCB7fSkucm93cyB8fCBbXTsKICAgICAgY29uc3QgaWRzID0gbmV3IFNldChwYWFyZS5maWx0ZXIocCA9PiBwLnZvbklkID09PSBzLmdyb2Vzc2UpLm1hcChwID0+IHAubmFjaElkKSk7CiAgICAgIHJldHVybiAoRC5tYXNzZS5kaW4xMTg2NS5ib2VnZW5bcy5yZWloZV0gfHwgW10pLmZpbHRlcihyID0+IGlkcy5oYXMoci5pZCkpOwogICAgfQogICAgY29uc3QgcnIgPSByb3dzMzIocy5yZWloZSk7CiAgICBjb25zdCBpID0gcnIuZmluZEluZGV4KHIgPT4gci5pZCA9PT0gcy5ncm9lc3NlKTsKICAgIHJldHVybiBpID4gMCA\\\/IHJyLnNsaWNlKDAsIGkpIDogW107CiAgfQogIC8vIERlZmF1bHQgZsO8ciBkZW4gendlaXRlbiDDmDogZGllIEdSw5ZTU1RFIG5vY2gga2xlaW5lcmUgR3LDtsOfZSAoZWluIFNjaHJpdHQgdW50ZXIgZGVyCiAgLy8gTmVubndlaXRlKSAtPiBzb2ZvcnQgZWluIGVjaHRlciBLZWdlbCBtaXQgendlaSB2ZXJzY2hpZWRlbmVuIMOYLiBudWxsLCB3ZW5uIGtlaW5lCiAgLy8ga2xlaW5lcmUgR3LDtsOfZSBleGlzdGllcnQgKGRhbm4gemVpZ3QgZGllIFplaWNobnVuZyBkZW4gImZvbGd0Ii1QbGF0emhhbHRlcikuCiAgZnVuY3Rpb24gZGVmYXVsdEdyb2Vzc2UyKHMpIHsgY29uc3QgYXYgPSByb3dzMkZvcihzKTsgcmV0dXJuIGF2Lmxlbmd0aCA\\\/IGF2W2F2Lmxlbmd0aCAtIDFdLmlkIDogbnVsbDsgfQogIC8vIHJvdzJGb3IgbnVyIGF1cyBkZW4gR8OcTFRJR0VOIGtsZWluZXJlbiBaZWlsZW4gKHJvd3MyRm9yKSAtIGVpbiBncm9lc3NlMiwgZGFzIG5pY2h0CiAgLy8ga2xlaW5lciBhbHMgZGllIE5lbm53ZWl0ZSBpc3QgKHouIEIuIGF1cyBlaW5lbSBhbHRlbiBMaW5rIG9kZXIgbmFjaCBOZW5ud2VpdGVuLVdlY2hzZWwpLAogIC8vIGxpZWZlcnQgbnVsbCAtPiBpc3RSZWR1emllcnVuZ09obmVad2VpdE9EIGdyZWlmdCAtPiAiZm9sZ3QiLCBzdGF0dCBlaW5lciBlcmZ1bmRlbmVuCiAgLy8gUmVkdXppZXJ1bmcuIERhbWl0IGlzdCBlaW4gZ2VyYWRlcyBSb2hyIChvZCA9PSBvZDIpIG5pY2h0IG1laHIgemVpY2hlbmJhci4KICBmdW5jdGlvbiByb3cyRm9yKHMpIHsgcmV0dXJuIHJvd3MyRm9yKHMpLmZpbmQociA9PiByLmlkID09PSBzLmdyb2Vzc2UyKSB8fCBudWxsOyB9CiAgZnVuY3Rpb24gcmVkdWN0aW9uUGFpcihzKSB7CiAgICBpZiAoIXMgfHwgcy50eXAgIT09ICdSJykgcmV0dXJuIG51bGw7CiAgICBjb25zdCByb3dzID0gKEQubWFzc2UuZGluMTE4NjUucmVkdXppZXJ1bmcucmVpaGVuW3MucmVpaGVdIHx8IHt9KS5yb3dzIHx8IFtdOwogICAgcmV0dXJuIHJvd3MuZmluZChyID0+IHIudm9uSWQgPT09IHMuZ3JvZXNzZSAmJiByLm5hY2hJZCA9PT0gcy5ncm9lc3NlMikgfHwgbnVsbDsKICB9CiAgLy8gQmVsZWd0ZXMgVC1TdMO8Y2stUGFhciAoRHVyY2hnYW5nL0FiendlaWcpIC0gUnVuZGUgOC4gTGllZmVydCBkaWUgcGFhcnNwZXppZmlzY2hlbgogIC8vIE1hw59lIChMMiB1bmQgTDEgdmFyaWllcmVuIGplIEFiendlaWcsIEwwL0wgc2luZCBncnVwcGVua29uc3RhbnQpLiBPaG5lIFBhYXI6IG51bGwsCiAgLy8gdW5kIGRpZSBBdWZydWZlciBibGVpYmVuIGZhaWwtY2xvc2VkIChrZWluZSBaZWljaG51bmcsIGtlaW4gRGF0ZW5ibGF0dC1NYcOfKS4KICBmdW5jdGlvbiB0U3R1ZWNrUGFpcihzKSB7CiAgICBpZiAoIXMgfHwgcy50eXAgIT09ICdUU1InKSByZXR1cm4gbnVsbDsKICAgIGNvbnN0IHJvd3MgPSAoRC5tYXNzZS5kaW4xMTg2NS50U3R1ZWNrUmVkdXppZXJ0LnJlaWhlbltzLnJlaWhlXSB8fCB7fSkucm93cyB8fCBbXTsKICAgIHJldHVybiByb3dzLmZpbmQociA9PiByLnZvbklkID09PSBzLmdyb2Vzc2UgJiYgci5uYWNoSWQgPT09IHMuZ3JvZXNzZTIpIHx8IG51bGw7CiAgfQoKICAvKiAtLSBSZWR1emllcnVuZyBvaG5lIGJlbGVndGVuIHp3ZWl0ZW4gw5ggKE5hY2hwcnVlZi1CZWZ1bmQgYSwgMTYuMDcuMjAyNikgLS0tLQogICAqIERpZSBSZWR1emllcnVuZyAoc3ZnVHlwZSAncmVkdXppZXJ1bmcnKSBicmF1Y2h0IFpXRUkgRHVyY2htZXNzZXI6IGRlbiBSb2hyLcOYCiAgICogKHJ3KSB1bmQgZGVuIMOYLCBhdWYgZGVuIHJlZHV6aWVydCB3aXJkIChyb3cyRm9yIC0+IHN0YXRlLmdyb2Vzc2UyKS4gRmVobHQgZGVyCiAgICogendlaXRlIC0gei4gQi4gYmVpIGVpbmVtIGdldGVpbHRlbiBMaW5rIG1pdCB0eXA9UiBvaG5lIGdyb2Vzc2UyIC0sIHd1cmRlIGVyCiAgICogZnJ1ZWhlciBhdXMgZGVtIEZha3RvciAwLjY2IEdFUkVDSE5FVCAocncudHViZU9EKjAuNjYgLT4gei4gQi4gMzQsOTggYXVzIDUzKQogICAqIHVuZCBhbHMgZWNodGVzIE1hc3MgYmVtYXNzdC4gRGFzIGlzdCBlcmZ1bmRlbi4gT2huZSB6d2VpdGVuIMOYIGdpYnQgZXMgS0VJTgogICAqIGJlbGVndGVzIE1hc3MgLT4gcGFyYW1zRm9yKCkgbGllZmVydCBudWxsIHVuZCByZW5kZXJQcmV2aWV3KCkgemVpZ3QgZGllCiAgICogImZvbGd0Ii1LYXJ0ZSwgZ2VuYXUgd2llIGJlaSBtYXNzZUZvbGd0L251ckZsYW5zY2guIE5JRSBlaW5lbiB6d2VpdGVuIMOYIHJlY2huZW4uICovCiAgZnVuY3Rpb24gaXN0UmVkdXppZXJ1bmdPaG5lWndlaXRPRChzKSB7CiAgICBjb25zdCB0ID0gdHlwT2JqKHMudHlwKTsKICAgIHJldHVybiAhISh0ICYmIHQuc3ZnVHlwZSA9PT0gJ3JlZHV6aWVydW5nJyAmJiAhcm93MkZvcihzKSk7CiAgfQogIC8qIEZvcm0gVEsgLSBCZXJuZCAyNy4wNy4yMDI2IGltIFdvcnRsYXV0OiAiTWFzc2UgZnVlciBUSyBzaW5kIGlkZW50aXNjaCB3aWUKICAgKiBGb3JtIFQgYXVzc2VyIGRhcyBMMiBkdXJjaCBkZW4gV2VydCBhdXMgZGVyIFRhYmVsbGUgbWl0IEwxIGVyc2V0enQgd2lyZAogICAqICh3byBTdHJpY2ggaXN0LCBpc3QgZGVyIFdlcnQgMCkuIgogICAqIERpZSBTcGFsdGUgTDEgc3RlaHQgaW4gZGVuIEt1bmRlbnRhYmVsbGVuIGFscyBUZXh0IG1pdCBUb2xlcmFueiBkYSwgei4gQi4KICAgKiAnMTYgwrEgMCw3NSc7IGVpbiBTdHJpY2ggaXN0IGFscyBudWxsIGdlZnVlaHJ0LiB0a0FiZ2FuZygpIHppZWh0IGRhcmF1cyBkaWUKICAgKiBNYXNzemFobCAoZGV1dHNjaGVzIEtvbW1hKSBiencuIDAgLSBlcyB3aXJkIG5pY2h0cyBnZXNjaGFldHp0LiAqLwogIGZ1bmN0aW9uIHRrQWJnYW5nKGwxKSB7CiAgICBpZiAobDEgPT0gbnVsbCkgcmV0dXJuIDA7CiAgICBpZiAodHlwZW9mIGwxID09PSAnbnVtYmVyJykgcmV0dXJuIGlzRmluaXRlKGwxKSA\\\/IGwxIDogbnVsbDsKICAgIGNvbnN0IG0gPSBTdHJpbmcobDEpLm1hdGNoKC8tP1xkKyg\\\/OlsuLF1cZCspPy8pOwogICAgaWYgKCFtKSByZXR1cm4gbnVsbDsKICAgIGNvbnN0IHYgPSBwYXJzZUZsb2F0KG1bMF0ucmVwbGFjZSgnLCcsICcuJykpOwogICAgcmV0dXJuIGlzRmluaXRlKHYpID8gdiA6IG51bGw7CiAgfQogIC8vIEFiZ2FuZ3NsYWVuZ2UgTDIgZGVyIGdld2FlaGx0ZW4gQmF1Zm9ybTogRm9ybSBUIC0+IFNwYWx0ZSBMMiwgRm9ybSBUSyAtPiBTcGFsdGUgTDEuCiAgZnVuY3Rpb24gYWJnYW5nTDIocywgc3JjKSB7CiAgICBpZiAoIXNyYykgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gcy5mb3JtVmFyaWFudGUgPT09ICdUSycgPyB0a0FiZ2FuZyhzcmMuTDEpIDogc3JjLkwyOwogIH0KICAvKiBEYXMgTUFTU0tVRVJaRUwgbXVzcyBkZXIgQmF1Zm9ybSBmb2xnZW4sIG5pY2h0IG51ciBkZXIgV2VydDogQmVpIEZvcm0gVEsgc3RhbW10IGRlcgogICAqIEFiZ2FuZyBhdXMgU3BhbHRlIEwxLCBpbSBEYXRlbmJsYXR0IHN0YW5kIGFiZXIgd2VpdGVyICJBYmdhbmcgTDIiIC0gdW5kIGRpcmVrdAogICAqIGRhcnVudGVyIG5vY2ggZWlubWFsIGRpZXNlbGJlIFphaGwgYWxzICJMMSIuIEVpbiBLdW5kZW5kb2t1bWVudCwgZGFzIHNpY2ggc2VsYnN0CiAgICogd2lkZXJzcHJpY2h0LiBFaW5lIFF1ZWxsZSBmdWVyIERhdGVuYmxhdHQgVU5EIEFuZnJhZ2UtTWFpbCwgZGFtaXQgYmVpZGUgZ2xlaWNoIGhlaXNzZW4uICovCiAgY29uc3QgYWJnYW5nS3VlcnplbCA9IHMgPT4gKHMgJiYgcy5mb3JtVmFyaWFudGUgPT09ICdUSycpID8gJ0wxJyA6ICdMMic7CiAgLyogSW4gMTUgZGVyIDEzNyBaZWlsZW4gc3RhbmQgaW4gZGVyIFNwYWx0ZSBMMSBlaW4gU3RyaWNoIChkaWUga2xlaW5zdGVuIEdyb2Vzc2VuOgogICAqIEROMDYvRE4wOC9ETjEwLCBOVzEwLDIvTlcxMyw1LCAxLzQiLzMvOCIvMS8yIiB1bmQgZGllIHp1Z2Vob2VyaWdlbiByZWR1emllcnRlbgogICAqIFBhYXJlKS4gRm9ybSBUSyB3YXIgZG9ydCBnZXNwZXJydCwgd2VpbCAiU3RyaWNoID0gMCIgZWluZW4gQWJnYW5nIGVyZ2ViZW4gaGFldHRlLAogICAqIGRlciBrdWVyemVyIGFscyBkZXIgUmFkaXVzIGRlcyBMYXVmcm9ocnMgaXN0IC0gemVpY2huZXJpc2NoIHVubW9lZ2xpY2guCiAgICogR0VLTEFFUlQsIEJlcm5kIExpbmtlciAzMS4wNy4yMDI2OiAiZGEgZXMgaW4gZGVyIE5vcm0gbmljaHQgZ2VuYW5udCB3aXJkIGhhYmUgaWNoCiAgICogYmVpIGVpbmVtIExpZWZlcmFudGVuIG5hY2hnZXNlaGVuLCBkZXIgZ2lidCBkZW4gV2VydCBiZWkgZGVuIGtsZWluZW4gR3JvZXNzZW4gbWl0CiAgICogMTFtbSBhbi4gRGFubiBuaW1tdCBkaWVzZSAxMW1tIGZ1ZXIgYWxsZSB3byBlcyBkaXIgZmVobHQuIiAtPiBMMSA9IDExIGluIGRhdGEuanMsCiAgICogYWxsZSAxMzcgS29tYmluYXRpb25lbiBzaW5kIGZyZWkuIERpZSBTcGVycmUgYmxlaWJ0IGFscyBTaWNoZXJoZWl0c25ldHogc3RlaGVuOgogICAqIGtvbW10IGt1ZW5mdGlnIGVpbmUgWmVpbGUgb2huZSBMMSBkYXp1LCBibGVpYnQgRm9ybSBUSyBkb3J0IGF1dG9tYXRpc2NoIHp1LAogICAqIHN0YXR0IGVpbmUgMCB6dSB6ZWljaG5lbi4gKi8KICBmdW5jdGlvbiB0a1F1ZWxsZShzKSB7CiAgICBjb25zdCB0ID0gdHlwT2JqKHMudHlwKTsgaWYgKCF0IHx8ICF0LmZvcm1XYWhsKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiB0LnJlZHV6aWVydCA\\\/IHRTdHVlY2tQYWlyKHMpIDogcm93Rm9yKHMpOwogIH0KICBmdW5jdGlvbiB0a09obmVNYXNzKHMpIHsKICAgIGlmICghcyB8fCBzLmZvcm1WYXJpYW50ZSAhPT0gJ1RLJykgcmV0dXJuIGZhbHNlOwogICAgY29uc3Qgc3JjID0gdGtRdWVsbGUocyk7CiAgICByZXR1cm4gISFzcmMgJiYgc3JjLkwxID09IG51bGw7CiAgfQogIC8vIFNpY2hlcmhlaXRzbmV0eiBmdWVyIGVpbmUgdW5iZWthbm50ZSBCYXVmb3JtICh3ZWRlciBUIG5vY2ggVEspLgogIGZ1bmN0aW9uIGlzdEZvcm1PaG5lTWFzc2UocykgewogICAgY29uc3QgdCA9IHR5cE9iaihzLnR5cCk7CiAgICBpZiAoIXQgfHwgIXQuZm9ybVdhaGwpIHJldHVybiBmYWxzZTsKICAgIGlmIChzLmZvcm1WYXJpYW50ZSAhPT0gJ1QnICYmIHMuZm9ybVZhcmlhbnRlICE9PSAnVEsnKSByZXR1cm4gdHJ1ZTsKICAgIHJldHVybiB0a09obmVNYXNzKHMpOwogIH0KCiAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTdGF0ZSAqLwogIGNvbnN0IHN0YXRlID0gewogICAgc3RlcDogMSwgYW53ZW5kdW5nOiBudWxsLCBub3JtOiBudWxsLCB0eXA6IG51bGwsIHJlaWhlOiAnQScsCiAgICAvLyBEaWUgV2Vpc3MtUHJlaXNsaXN0ZW4gYmV6aWVoZW4gc2ljaCBhdWYgS0wuIERlc2hhbGIgc3RhcnRldCBkaWUgc2ljaHRiYXJlCiAgICAvLyBBdXN3YWhsIGF1ZiBkZXIgUHJlaXNsaXN0ZW5iYXNpczsgS0sgYmxlaWJ0IGFscyBiZXd1c3N0IGdld2FlaGx0ZSwKICAgIC8vIHJhYmF0dGllcnRlIFZhcmlhbnRlIHZlcmZ1ZWdiYXIuCiAgICBncm9lc3NlOiBudWxsLCBncm9lc3NlMjogbnVsbCwgbGFlbmdlVmFyaWFudGU6ICdLTCcsIGV4emVudHJpc2NoOiBmYWxzZSwKICAgIC8vIENvbm5lY3QtRmxhbnNjaGUgaGFiZW4gZWluZSBlaWdlbmUgTm9ybWZhbWlsaWUsIEJhdWZvcm0gdW5kIExhZW5nZW53YWhsLgogICAgY29ubmVjdE5vcm06ICdESU4nLCBjb25uZWN0TGFlbmdlOiBudWxsLCBjb25uZWN0QW5zY2hsdXNzOiAnQlcnLAogICAgLy8gUjMtMy9SMy00OiBCYXVmb3JtIGRlciBULVN0w7xja2UuICdUJyA9IGFsbGUgQWJnw6RuZ2UgZ2xlaWNoIGxhbmcgKERlZmF1bHQsID0gYmlzaGVyaWdlcwogICAgLy8gVmVyaGFsdGVuKSwgJ1RLJyA9IER1cmNoZ2FuZyBnbGVpY2gsIEFiZ2FuZyBrdXJ6LiBOdXIgcmVsZXZhbnQgZsO8ciBUeXBlbiBtaXQgZm9ybVdhaGw6dHJ1ZS4KICAgIGZvcm1WYXJpYW50ZTogJ1QnLAogICAgLy8gTnVyIGZ1ZXIgVHlwZW4gbWl0IG51ckZsYW5zY2g6dHJ1ZSAoQmxpbmRkZWNrZWwsIEtsYW1tZXIpIC0gdW5hYmhhZW5naWcgdm9uIHJlaWhlL2dyb2Vzc2UuCiAgICBmbGFuc2NoOiBudWxsLAogICAgLy8gTnVyIGZ1ZXIgZGllIEtsYW1tZXIgKEFic2Nobml0dCBFKTogQmF1Zm9ybSArIGVpZ2VuZXIgV2Vya3N0b2ZmICsgTXV0dGVyLUFydC4KICAgIC8vIGtsYW1tZXJNdXR0ZXI6ICdNJyA9IE11dHRlciAoU3RhbmRhcmQpLCAnUycgPSBTZWNoc2thbnRtdXR0ZXIgKEF1ZnByZWlzKSwgUjItNC4KICAgIGtsYW1tZXJUeXA6ICdLTDEnLCBrbGFtbWVyV2Vya3N0b2ZmOiAnMS40MzA4Jywga2xhbW1lck11dHRlcjogJ00nLAogICAgd2Vya3N0b2ZmOiAnMS40NDA0Jywgb2JlcmZsYWVjaGU6ICdIMycsIGRpY2h0dW5nOiBudWxsLCBsaXBwZTogJ0wnLAogICAgbmFjaHdlaXNlOiAoRC5wcmVpc2UubmFjaHdlaXNTdGFuZGFyZCB8fCBbXSkuc2xpY2UoKSwgbWVuZ2U6IDEsCiAgICB2aWV3OiAnemVpY2hudW5nJywgICAgICAgIC8vICd6ZWljaG51bmcnIChESU4pIHwgJ2Fuc2ljaHQnIChQcm9kdWt0LVJlbmRlcikKICAgIHBvc2l0aW9uZW46IFtdLCBrb250YWt0OiB7IGZpcm1hOicnLCBuYW1lOicnLCBlbWFpbDonJywgdGVsZWZvbjonJywgdGVybWluOicnLCBmcmVpdGV4dDonJyB9CiAgfTsKCiAgLyogLS0gVXJzcHJ1bmdzenVzdGFuZCBmdWVyIGRlbiBadXJ1ZWNrc2V0emVuLUJ1dHRvbiAoQTUsIEJlcm5kIFBrdC4gOCkgLS0tLQogICAqIFRpZWZlIEtvcGllIGRlcyBTdGFydC1TdGF0ZXMgLSBHRU5BVSBISUVSIGdlem9nZW4sIGFsc28gYmV2b3IgcHJlZmlsbCgpIGlobgogICAqIHVudGVuIGF1cyBkZXIgVVJMIHVlYmVyc2NocmVpYnQuIFNvbnN0IHd1ZXJkZSBkZXIgQnV0dG9uIGJlaSBlaW5lbSBnZXRlaWx0ZW4KICAgKiBLb25maWd1cmF0aW9ucy1MaW5rIGF1ZiBERVNTRU4gU3RhbmQgenVydWVja3N0ZWxsZW4gc3RhdHQgYXVmIGRlbiBlY2h0ZW4KICAgKiBVcnNwcnVuZyAoIndpZSBiZWltIGVyc3RlbiBMYWRlbiI6IFNjaHJpdHQgMSwga2VpbmUgQXVzd2FobCwgRGVmYXVsdHMpLgogICAqIEpTT04gcmVpY2h0IGFscyBLbG9uIC0gZGVyIFN0YXRlIHRyYWVndCBudXIgU3RyaW5ncy9aYWhsZW4vQm9vbHMvbnVsbCwKICAgKiBlaW4gQXJyYXkgdW5kIGVpbiBmbGFjaGVzIE9iamVrdCwga2VpbmUgRnVua3Rpb25lbi9EYXRlcy4gKi8KICBjb25zdCBVUlNQUlVORyA9IEpTT04uc3RyaW5naWZ5KHN0YXRlKTsKICBjb25zdCBpc3RVcnNwcnVuZyA9ICgpID0+IEpTT04uc3RyaW5naWZ5KHN0YXRlKSA9PT0gVVJTUFJVTkc7CgogIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RyYWludHMgKi8KICBmdW5jdGlvbiBzcGVyckRpY2h0dW5nZW4oKSB7CiAgICBjb25zdCBvdXQgPSBuZXcgU2V0KCk7CiAgICBELmNvbnN0cmFpbnRzLmZvckVhY2goYyA9PiB7CiAgICAgIGlmIChjLnNwZXJyZURpY2h0dW5nICYmIGMud2VubiAmJiBjLndlbm4uYW53ZW5kdW5nICYmIGMud2Vubi5hbndlbmR1bmcuaW5jbHVkZXMoc3RhdGUuYW53ZW5kdW5nKSkKICAgICAgICBjLnNwZXJyZURpY2h0dW5nLmZvckVhY2goeCA9PiBvdXQuYWRkKHgpKTsKICAgIH0pOwogICAgcmV0dXJuIG91dDsKICB9CgogIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUGFyYW1zIC0+IFNWRyAqLwogIGZ1bmN0aW9uIGNvbm5lY3RMZW5ndGhGb3IocywgcncpIHsKICAgIGlmICghcncgfHwgIUFycmF5LmlzQXJyYXkocncubGFlbmdlbikpIHJldHVybiBudWxsOwogICAgcmV0dXJuIHJ3LmxhZW5nZW4uZmluZCh4ID0+IE51bWJlcih4LkwpID09PSBOdW1iZXIocy5jb25uZWN0TGFlbmdlKSkgfHwgcncubGFlbmdlblswXSB8fCBudWxsOwogIH0KICBmdW5jdGlvbiBjb25uZWN0RW5kRm9yKHMsIHJ3KSB7CiAgICByZXR1cm4gcncgJiYgcncuYW5zY2hsdWVzc2UgPyBydy5hbnNjaGx1ZXNzZVtzLmNvbm5lY3RBbnNjaGx1c3NdIHx8IG51bGwgOiBudWxsOwogIH0KICBmdW5jdGlvbiBwYXJhbXNGb3IocykgewogICAgY29uc3QgdCA9IHR5cE9iaihzLnR5cCk7IGlmICghdCkgcmV0dXJuIG51bGw7CiAgICAvLyBudXJGbGFuc2NoLVR5cGVuIChCbGluZGRlY2tlbC9LbGFtbWVyKTogRXMgZ2lidCBudXIgZGVuIEZsYW5zY2gtw5guIEVpbiBSb2hyLeKMgC8KICAgIC8vIGVpbmUgV2FuZHN0YWVya2Ugd2FlcmUgZ2VyYXRlbiAtPiBkaWUgWmVpY2hudW5nIGJla29tbXQgTlVSIGRpZSBiZWxlZ3RlbiBGbGFuc2NoLQogICAgLy8gbWFzc2UuIFJ1bmRlIDcgKFctMDU5KTogZHJhdy5qcy9yZW5kZXIuanMgaGFiZW4gZWNodGUgWmVpY2hudW5nZW4gZnVlciBkZW4KICAgIC8vIEJsaW5kZGVja2VsIChBICsgRGVja2Vsc3RhZXJrZSBMKSB1bmQgZGllIEtsYW1tZXIgKEEgKyBLbGVtbS3ijIAsIGplIEtsYW1tZXJ0eXApLgogICAgLy8gRmVobHQgZGFzIGJlbGVndGUgTWFzcyAoRmxhbnNjaCAyODYsMS8zMTkvMzM4KSwgYmxlaWJ0IHBhcmFtcyBudWxsIHVuZAogICAgLy8gcmVuZGVyUHJldmlldyB6ZWlndCB3ZWl0ZXJoaW4gZGllICJaZWljaG51bmcgZm9sZ3QiLUthcnRlIHN0YXR0IGVyZnVuZGVuZXIgTWFzc2UuCiAgICBpZiAoaXN0TnVyRmxhbnNjaCh0KSkgewogICAgICBjb25zdCBmID0gZmxhbnNjaEZvcihzKTsgaWYgKCFmKSByZXR1cm4gbnVsbDsKICAgICAgY29uc3QgYmFzaXMgPSB7IGZsYW5nZU9kOiBmLmZsYW5nZU9ELCBsYWJlbDogJ0ZsYW5zY2gt4oyAICcgKyBmLmxhYmVsLCBwcm92RGltczogZmFsc2UgfTsKICAgICAgaWYgKGlzdEtsYW1tZXIodCkpIHsKICAgICAgICBjb25zdCBhID0gZi5rbGFtbWVyQSA\\\/IGYua2xhbW1lckFbcy5rbGFtbWVyVHlwXSA6IG51bGw7CiAgICAgICAgaWYgKCEoYSA+IDApKSByZXR1cm4gbnVsbDsKICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihiYXNpcywgewogICAgICAgICAgdHlwZTogJ2tsYW1tZXInLCBrbGFtbWVyQTogYSwga2xhbW1lclR5cDogcy5rbGFtbWVyVHlwLCBrbGFtbWVyTXV0dGVyOiBzLmtsYW1tZXJNdXR0ZXIsCiAgICAgICAgICB3ZXJrc3RvZmY6IGVmZldlcmtzdG9mZihzKSwgc3VyZmFjZTogJycgICAvLyBSMi00OiBLbGFtbWVyIGhhdCBrZWluZSBPYmVyZmxhZWNoZQogICAgICAgIH0pOwogICAgICB9CiAgICAgIGlmICghKGYuYmxpbmRUaGsgPiAwKSkgcmV0dXJuIG51bGw7CiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKGJhc2lzLCB7CiAgICAgICAgdHlwZTogJ2JsaW5kZGVja2VsJywgbGVuZ3RoOiBmLmJsaW5kVGhrLAogICAgICAgIHdlcmtzdG9mZjogZWZmV2Vya3N0b2ZmKHMpLCBzdXJmYWNlOiBzLm9iZXJmbGFlY2hlCiAgICAgIH0pOwogICAgfQogICAgLy8gbWFzc2VGb2xndCAoQ0YvQ0ZJKToga2VpbiBlaW56aWdlcyBiZWxlZ3RlcyBNYXNzIC0+IGtlaW5lIFBhcmFtcywga2VpbmUgWmVpY2hudW5nLgogICAgLy8gKHJvd0ZvcigpIGxpZWZlcnQgaGllciBvaG5laGluIG51bGwsIGRhcyBpc3QgbnVyIGRpZSBleHBsaXppdGUgQWJzaWNodC4pCiAgICBpZiAoaXN0TWFzc2VGb2xndCh0KSkgcmV0dXJuIG51bGw7CiAgICAvLyBSZWR1emllcnVuZyBvaG5lIHp3ZWl0ZW4gw5g6IGtlaW4gYmVsZWd0ZXMgTWFzcyAtPiBrZWluZSBQYXJhbXMsIGtlaW5lIFplaWNobnVuZy4KICAgIC8vIHJlbmRlclByZXZpZXcoKSBmYWVuZ3QgZGFzIGFiIHVuZCB6ZWlndCBkaWUgImZvbGd0Ii1LYXJ0ZSwgc3RhdHQgZHJhdy5qcyBlaW5lbgogICAgLy8gYXVzIDAuNjYgZ2VyZWNobmV0ZW4gw5ggKDM0LDk4ICYgQ28uKSBiZW1hc3NlbiB6dSBsYXNzZW4uCiAgICBpZiAoaXN0UmVkdXppZXJ1bmdPaG5lWndlaXRPRChzKSkgcmV0dXJuIG51bGw7CiAgICBjb25zdCBydyA9IHJvd0ZvcihzKTsgaWYgKCFydykgcmV0dXJuIG51bGw7CiAgICBpZiAodC5pZCA9PT0gJ0NGJykgewogICAgICBjb25zdCBsZyA9IGNvbm5lY3RMZW5ndGhGb3IocywgcncpOwogICAgICBpZiAoIWxnIHx8IHJ3LkRlID09IG51bGwgfHwgcncuRGkgPT0gbnVsbCB8fCBydy5EZiA9PSBudWxsIHx8IGxnLkwgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICAgIHJldHVybiB7CiAgICAgICAgdHlwZTonY29ubmVjdGZsYW5zY2gnLCBvZDpydy5EZSwgaW5uZXJEaWFtZXRlcjpydy5EaSwgZmxhbmdlT2Q6cncuRGYsCiAgICAgICAgbGVuZ3RoOmxnLkwsIHByb2R1Y3RTZXJpZXM6Y29ubmVjdFNlcmllKHMpLCBsYWJlbDpsYmwocncpLAogICAgICAgIHN1cmZhY2U6cy5vYmVyZmxhZWNoZSwgd2Vya3N0b2ZmOmVmZldlcmtzdG9mZihzKSwgcHJvdkRpbXM6ZmFsc2UKICAgICAgfTsKICAgIH0KICAgIGlmICh0LmlkID09PSAnQ0ZJJykgewogICAgICBjb25zdCBlbmQgPSBjb25uZWN0RW5kRm9yKHMsIHJ3KTsKICAgICAgY29uc3QgdXBwZXIgPSBELm1hc3NlLmNvbm5lY3QuY2ZpLm9iZXJlckFuc2NobHVzczsKICAgICAgY29uc3QgZW5kRGlhbWV0ZXIgPSBlbmQgPyAocy5jb25uZWN0QW5zY2hsdXNzID09PSAnVEMnID8gZW5kLlRDIDogZW5kLkEpIDogbnVsbDsKICAgICAgaWYgKCFlbmQgfHwgIXVwcGVyIHx8IHJ3LkRlID09IG51bGwgfHwgcncuRGkgPT0gbnVsbCB8fCBydy5ZID09IG51bGwgfHwgZW5kLkwgPT0gbnVsbCB8fCBlbmREaWFtZXRlciA9PSBudWxsIHx8IHVwcGVyLkRlID09IG51bGwgfHwgdXBwZXIuRGkgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICAgIHJldHVybiB7CiAgICAgICAgdHlwZTonY29ubmVjdGlubGluZScsIG9kOnJ3LkRlLCBpbm5lckRpYW1ldGVyOnJ3LkRpLCBsZW5ndGg6ZW5kLkwsCiAgICAgICAgYnJhbmNoSGVpZ2h0OnJ3LlksIGVuZFR5cGU6cy5jb25uZWN0QW5zY2hsdXNzLCBlbmREaWFtZXRlciwKICAgICAgICB1cHBlck91dGVyRGlhbWV0ZXI6dXBwZXIuRGUsIHVwcGVySW5uZXJEaWFtZXRlcjp1cHBlci5EaSwKICAgICAgICBwcm9kdWN0U2VyaWVzOmNvbm5lY3RTZXJpZShzKSwgbGFiZWw6bGJsKHJ3KSwgc3VyZmFjZTpzLm9iZXJmbGFlY2hlLAogICAgICAgIHdlcmtzdG9mZjplZmZXZXJrc3RvZmYocyksIHByb3ZEaW1zOmZhbHNlCiAgICAgIH07CiAgICB9CiAgICBjb25zdCBkTyA9IGRpY2h0T2JqKHMuZGljaHR1bmcpOwogICAgY29uc3QgcCA9IHsKICAgICAgLy8gZWluemVsU3R1dHplbiAoVENEL1RDUyk6ICdzdHV0emVuJyB6ZWljaG5ldCBFSU5FTiBTdHV0emVuIC0gb2huZSB6d2VpdGUgRmVycnVsZSwKICAgICAgLy8gb2huZSBEaWNodHVuZywgb2huZSBLbGFtbWVyIChCZXJuZCAxNi4wNy4yMDI2LCBQa3QuIDkuMi85LjMpLgogICAgICB0eXBlOiAodC5laW56ZWxTdHV0emVuICYmIHQuc3ZnVHlwZSA9PT0gJ2NsYW1wc3R1dHplbicpID8gJ3N0dXR6ZW4nIDogdC5zdmdUeXBlLAogICAgICAvLyBvZE9mOiBUQ0QgbGllZmVydCBhdXNzZW5EIChkaWNrd2FuZGlnKSwgc29uc3QgdHViZU9ELiBOSUUgZGlyZWt0IHJ3LnR1YmVPRCAtCiAgICAgIC8vIGRpZSBUQ0QtWmVpbGVuIGhhYmVuIGtlaW4gdHViZU9ELCBkYXMgd2FlcmUgdW5kZWZpbmVkIC0+IGRyYXcuanMtRGVmYXVsdCDijIAyNS4KICAgICAgb2Q6IG9kT2YocncpLCB3YWxsOiB3YWxsT2YocncpLCBzdXJmYWNlOiBzLm9iZXJmbGFlY2hlLCB3ZXJrc3RvZmY6IGVmZldlcmtzdG9mZihzKSwKICAgICAgY2xhbXBTaXplOiBsYmwocncpLCBnYXNrZXRNYXRlcmlhbDogcy5kaWNodHVuZyB8fCAnRVBETScsIGdhc2tldENvbG9yOiBkTyA\\\/IGRPLmZhcmJlIDogbnVsbCwKICAgICAgZG46IHMucmVpaGUgPT09ICdBJyA\\\/IFN0cmluZyhydy5pZCkucmVwbGFjZSgnRE4nLCAnJykgOiBsYmwocncpCiAgICB9OwogICAgaWYgKHQuc3ZnVHlwZSA9PT0gJ2NsYW1wc3R1dHplbicpIHsKICAgICAgcC5mbGFuZ2VPZCA9IHJ3LmZsYW5nZU9EOwogICAgICAvLyBsYWVuZ2VPZjogVENEIC0+IEhvZWhlIDYwIChMYWJlbCAnaCcpLCBzb25zdCBLSy9LTCAoTGFiZWwgJ0wnKS4gRmVobHQgZGFzIE1hc3MsCiAgICAgIC8vIGJsZWlidCBwLmxlbmd0aCB1bmdlc2V0enQgLSBkYW5uIHplaWNobmV0IGRyYXcuanMgc2VpbmVuIERlZmF1bHQuIERhcyBkYXJmIG51cgogICAgICAvLyBwYXNzaWVyZW4sIHdlbm4gZGllIFplaWxlIHdpcmtsaWNoIGtlaW4gTGFlbmdlbm1hc3MgdHJhZWd0LgogICAgICBjb25zdCBsZyA9IGxhZW5nZU9mKHQsIHJ3LCBzLmxhZW5nZVZhcmlhbnRlKTsKICAgICAgaWYgKGxnKSB7IHAubGVuZ3RoID0gbGcud2VydDsgcC5sZW5ndGhMYWJlbCA9IGxnLmxhYmVsOyB9CiAgICB9CiAgICBlbHNlIGlmICh0LnN2Z1R5cGUgPT09ICdibGluZGthcHBlJykgeyBwLmZsYW5nZU9kID0gcncuZmxhbmdlT0Q7IHAubGVuZ3RoID0gcncua2s7IH0KICAgIGVsc2UgaWYgKHQuc3ZnVHlwZSA9PT0gJ2tsYW1tZXInKSB7IHAuZmxhbmdlT2QgPSBydy5mbGFuZ2VPRDsgfQogICAgLy8gVHlwIEQgJ2RpY2h0dW5nJyAoUnVuZGUgNywgVy0wNTkpOiBFL0Mga29tbWVuIGF1cyBkZXIgYmVsZWd0ZW4gRElOMzI2NzYtWmVpbGU7CiAgICAvLyBkZXIgVHlwIGZvbGd0IGRlciBiZWxlZ3RlbiBBdXNmdWVocnVuZ3NyZWdlbCAoVHlwIElJID0gbWl0IExpcHBlLCBUeXAgSSA9IG9obmUsCiAgICAvLyB3YWVobGJhciBudXIgaW4gUmVpaGUgQykuIGRyYXcuanMvcmVuZGVyLmpzIGZhbGxlbiBvaG5lIEUvQyBzZWxic3QgYXVmIGRlbgogICAgLy8gUGxhdHpoYWx0ZXIgenVydWVjayAtIGhpZXIgd2lyZCBuaWNodHMgZXJnYWVuenQgb2RlciBnZXJhdGVuLgogICAgZWxzZSBpZiAodC5zdmdUeXBlID09PSAnZGljaHR1bmcnKSB7CiAgICAgIC8vIElubmVuLcOYIGhhZW5ndCBzZWl0IGRlbSAxMS4wOC4yMDI2IGFtIERpY2h0dW5nc3dlcmtzdG9mZiAoQmVybmQ6IHdlaWNoID0gU3R1dHplbgogICAgICAvLyArIDAsMiBtbSwgUFRGRSB1bmQgUFRGRS9GS00gPSBTdHV0emVuLUlubmVuLcOYLCBUQzI1IGVpZ2VuZSBXZXJ0ZSkuIERlc2hhbGIgTklFCiAgICAgIC8vIHJ3Lmdhc2tldElEIGRpcmVrdCB6ZWljaG5lbiAtIGRhcyB3YWVyZSBpbW1lciBkZXIgd2VpY2hlIEZhbGwuCiAgICAgIHAuZ2Fza2V0T2QgPSBydy5nYXNrZXRPRDsgcC5nYXNrZXRJZCA9IGRpY2h0dW5nSW5uZW5EKHMsIHJ3KTsKICAgICAgcC5nYXNrZXRUeXBlID0gZWZmTGlwcGUocykgPT09ICdPJyA\\\/ICdJJyA6ICdJSSc7CiAgICAgIC8vIERpZSBMZWdlbmRlIGRlciBaZWljaG51bmcgZnVlaHJ0ZSBiaXMgenVtIDExLjA4LjIwMjYgYXVjaCBiZWkgZGVyIERpY2h0dW5nCiAgICAgIC8vICJXZXJrc3RvZmYgMS40NDM1IC8gT2JlcmZsYWVjaGUgSDQiIC0gZ2VuYXUgZGllIHp3ZWkgQW5nYWJlbiwgZGllIEJlcm5kIGhpZXIKICAgICAgLy8gd2VnaGFiZW4gd2lsbC4gbGVnZW5kQm94KCkgZmlsdGVydCBsZWVyZSBXZXJ0ZSBzZWxic3QgaGVyYXVzLCBkZXNoYWxiIHJlaWNodAogICAgICAvLyBlcywgc2llIGdhciBuaWNodCBlcnN0IG1pdHp1Z2ViZW4uCiAgICAgIHAud2Vya3N0b2ZmID0gJyc7IHAuc3VyZmFjZSA9ICcnOwogICAgfQogICAgZWxzZSBpZiAoaXNCZW5kKHQpKSB7CiAgICAgIGNvbnN0IHRhbmdlbnQgPSB0LmJvZ2VuID09PSA0NSA\\\/IHJ3LkwzXzQ1IDogcncuTDNfOTA7CiAgICAgIGNvbnN0IG92ZXJhbGwgPSB0LmJvZ2VuID09PSA0NSA\\\/IHJ3LkwyIDogcncuTDE7CiAgICAgIGlmIChydy5SID09IG51bGwgfHwgdGFuZ2VudCA9PSBudWxsIHx8IG92ZXJhbGwgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICAgIHAuYmVuZFJhZGl1cyA9IHJ3LlI7IHAubGVuZ3RoID0gdGFuZ2VudDsgcC5sZW5ndGhMYWJlbCA9ICdMMyc7CiAgICAgIHAub3ZlcmFsbExlbmd0aCA9IG92ZXJhbGw7IHAub3ZlcmFsbExlbmd0aExhYmVsID0gdC5ib2dlbiA9PT0gNDUgPyAnTDInIDogJ0wxJzsKICAgIH0KICAgIC8qIFQtU3R1ZWNrOiBEaWUgQWJnYW5nc2xhZW5nZSBpc3QgamV0enQgaW4gQkVJREVOIEJhdWZvcm1lbiBlaW4gZWNodGVzIE1hc3MgYXVzCiAgICAgKiBkZXIgS3VuZGVudGFiZWxsZSAtIEZvcm0gVCBhdXMgU3BhbHRlIEwyLCBGb3JtIFRLIGF1cyBTcGFsdGUgTDEgKEJlcm5kCiAgICAgKiAyNy4wNy4yMDI2KS4gRXMgd2lyZCB3ZWl0ZXJoaW4gbmljaHRzIGdlc2NoYWV0enQ6IGZlaGx0IGRlciBXZXJ0LCBnaWJ0IGVzCiAgICAgKiBrZWluZSBaZWljaG51bmcuICovCiAgICBlbHNlIGlmICh0LnN2Z1R5cGUgPT09ICd0c3R1ZWNrJykgewogICAgICAvLyBSZWR1emllcnQ6IEwyICh1bmQgTDEpIGhhZW5nZW4gYW0gYmVsZWd0ZW4gUGFhciwgbmljaHQgYW4gZGVyIER1cmNoZ2FuZ3N6ZWlsZS4KICAgICAgLy8gT2huZSBiZWxlZ3RlcyBQYWFyL1p3ZWl0LcOYIC0+IG51bGwgKGZhaWwtY2xvc2VkLCBrZWluZSBlcmZ1bmRlbmUgWmVpY2hudW5nKS4KICAgICAgY29uc3QgcGFpciA9IHQucmVkdXppZXJ0ID8gdFN0dWVja1BhaXIocykgOiBudWxsOwogICAgICBjb25zdCBzcmMgPSB0LnJlZHV6aWVydCA\\\/IHBhaXIgOiBydzsKICAgICAgaWYgKHRrT2huZU1hc3MocykpIHJldHVybiBudWxsOwogICAgICBjb25zdCBicmFuY2hMMiA9IGFiZ2FuZ0wyKHMsIHNyYyk7CiAgICAgIGlmIChydy5MID09IG51bGwgfHwgcncuTDAgPT0gbnVsbCB8fCBicmFuY2hMMiA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgICAgY29uc3QgcjIgPSB0Lnp3ZWl0ZUdyb2Vzc2UgPyByb3cyRm9yKHMpIDogbnVsbDsKICAgICAgaWYgKHQucmVkdXppZXJ0ICYmICFyMikgcmV0dXJuIG51bGw7CiAgICAgIHAubGVuZ3RoID0gcncuTDsgcC5icmFuY2hMZW5ndGggPSBicmFuY2hMMjsKICAgICAgcC5icmFuY2hPZCA9ICh0LnJlZHV6aWVydCAmJiByMikgPyBvZE9mKHIyKSA6IG9kT2YocncpOwogICAgICBwLnRmb3JtID0gcy5mb3JtVmFyaWFudGUgPT09ICdUSycgPyAnVEsnIDogJ1QnOwogICAgfQogICAgLy8gRGVyIHp3ZWl0ZSDDmCBrb21tdCBBVVNTQ0hMSUVTU0xJQ0ggYXVzIHJvdzJGb3IgKHN0YXRlLmdyb2Vzc2UyKSAtIG5pZSBhdXMgZWluZW0KICAgIC8vIEZha3Rvci4gaXN0UmVkdXppZXJ1bmdPaG5lWndlaXRPRCBoYXQgb2JlbiBzY2hvbiBudWxsIGdlbGllZmVydCwgZmFsbHMgZXIgZmVobHQ7CiAgICAvLyBkYXMgaWYoIXIyKSByZXR1cm4gbnVsbCBpc3QgZGllIGRvcHBlbHRlIEFic2ljaGVydW5nOiBsaWViZXIga2VpbmUgWmVpY2hudW5nIGFscwogICAgLy8gZWluZSBlcmZ1bmRlbmUgUmVkdXppZXJ1bmcuCiAgICBlbHNlIGlmICh0LnN2Z1R5cGUgPT09ICdyZWR1emllcnVuZycpIHsKICAgICAgY29uc3QgcjIgPSByb3cyRm9yKHMpLCBwYWlyID0gcmVkdWN0aW9uUGFpcihzKTsKICAgICAgaWYgKCFyMiB8fCAhcGFpciB8fCBwYWlyLkwgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICAgIHAub2QyID0gb2RPZihyMik7IHAud2FsbDIgPSB3YWxsT2YocjIpOyBwLmxlbmd0aCA9IHBhaXIuTDsgcC5lY2NlbnRyaWMgPSBzLmV4emVudHJpc2NoOwogICAgfQogICAgcC5wcm92RGltcyA9IGZhbHNlOwogICAgcmV0dXJuIHA7CiAgfQoKICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByZWlzICovCiAgLyogU3BydW5nbWFya2VuIHVudGVyIGRlbSBTdHVlY2t6YWhsZmVsZC4gVmVyZWluaWd1bmcgYXVzIGRlbiBhbGxnZW1laW5lbgogICAqIE1lbmdlbnZvcnNjaGxhZWdlbiAoRC5tZW5nZW5zdGFmZmVsKSB1bmQgZGVuIHRhdHNhZWNobGljaGVuIFJhYmF0dHN0dWZlbgogICAqIChELnByZWlzZS5zdGFmZmVsKS4gT2huZSBkaWUgVmVyZWluaWd1bmcgd2FyIGVpbmUgaW0gQWRtaW4gZ2VwZmxlZ3RlIFN0dWZlCiAgICogcGVyIEtsaWNrIG5pY2h0IGVycmVpY2hiYXI6IGRpZSBLbm9lcGZlIHN0YW5kZW4gZmVzdCBhdWYgMS8yNS81MC8xMDAvMjUwLAogICAqIGdlcmVjaG5ldCB3dXJkZSBhYmVyIG1pdCBkZW4gU3R1ZmVuIGF1cyBkZXIgU3RhZmZlbCAoQmVmdW5kIDIxLjA4LjIwMjYpLiAqLwogIGZ1bmN0aW9uIG1lbmdlblNwcnVuZ21hcmtlbigpIHsKICAgIGNvbnN0IGJhc2lzID0gQXJyYXkuaXNBcnJheShELm1lbmdlbnN0YWZmZWwpID8gRC5tZW5nZW5zdGFmZmVsIDogWzFdOwogICAgY29uc3Qgc3R1ZmVuID0gKEQucHJlaXNlICYmIEFycmF5LmlzQXJyYXkoRC5wcmVpc2Uuc3RhZmZlbCkgPyBELnByZWlzZS5zdGFmZmVsIDogW10pCiAgICAgIC5maWx0ZXIoeCA9PiB4ICYmIHgucmFiYXR0ID4gMCAmJiB4LmFiID4gMCkKICAgICAgLm1hcCh4ID0+IHguYWIpOwogICAgcmV0dXJuIEFycmF5LmZyb20obmV3IFNldChiYXNpcy5jb25jYXQoc3R1ZmVuKSkpLnNvcnQoKGEsIGIpID0+IGEgLSBiKTsKICB9CgogIC8qIEV4YWt0ZSBQcmVpc2xpc3RlbiB2b24gV2Vpc3MgKDIxLjA4LjIwMjYpLiBEaWUgWmVpbGVuc2NobHVlc3NlbCBmb2xnZW4KICAgKiBSZWloZSArIEdyb2Vzc2VuLUlEIGF1cyBkYXRhLmpzLiBUIHVuZCBUSyBoYWJlbiBnZXRyZW5udGUgU3BhbHRlbi4gS2xhbW1lcgogICAqIHVuZCBCbGluZGRlY2tlbCB3ZXJkZW4gd2llIGltIFVJIG51ciBuYWNoIEZsYW5zY2gtw5ggYmVwcmVpc3QuICovCiAgZnVuY3Rpb24gZXhhY3RQcmljZUtleShzLCB0KSB7CiAgICBpZiAoIXMgfHwgIXQpIHJldHVybiBudWxsOwogICAgaWYgKHQuaWQgPT09ICdUUycpIHJldHVybiBzLmZvcm1WYXJpYW50ZSA9PT0gJ1RLJyA\\\/ICdUU19USycgOiAnVFNfVCc7CiAgICByZXR1cm4gdC5pZDsKICB9CgogIGZ1bmN0aW9uIGV4YWN0QmFzZVByaWNlKHMsIHQsIFApIHsKICAgIGlmICghcyB8fCAhdCB8fCAhUCkgcmV0dXJuIG51bGw7CiAgICBpZiAoaXN0TnVyRmxhbnNjaCh0KSkgewogICAgICBjb25zdCByb3cgPSBQLmZsYW5zY2hwcmVpcyAmJiBzLmZsYW5zY2ggPyBQLmZsYW5zY2hwcmVpc1tzLmZsYW5zY2hdIDogbnVsbDsKICAgICAgcmV0dXJuIHJvdyAmJiByb3dbdC5pZF0gIT0gbnVsbCA\\\/IE51bWJlcihyb3dbdC5pZF0pIDogbnVsbDsKICAgIH0KICAgIGNvbnN0IHJvd0tleSA9IHMucmVpaGUgJiYgcy5ncm9lc3NlID8gcy5yZWloZSArICc6JyArIHMuZ3JvZXNzZSA6IG51bGw7CiAgICBjb25zdCByb3cgPSByb3dLZXkgJiYgUC5leGFrdCA\\\/IFAuZXhha3Rbcm93S2V5XSA6IG51bGw7CiAgICBjb25zdCBwcmljZUtleSA9IGV4YWN0UHJpY2VLZXkocywgdCk7CiAgICByZXR1cm4gcm93ICYmIHByaWNlS2V5ICYmIHJvd1twcmljZUtleV0gIT0gbnVsbCA\\\/IE51bWJlcihyb3dbcHJpY2VLZXldKSA6IG51bGw7CiAgfQoKICAvKiBEaWUgUHJlaXNsaXN0ZW53ZXJ0ZSBmdWVyIFRDIHVuZCBUQ1MgYmV6aWVoZW4gc2ljaCBsYXV0IEJlcm5kIExpbmtlciBhdWYKICAgKiBkaWUgbGFuZ2UgU3R1dHplbmxhZW5nZSBLTCAoTWFpbCB2b20gMjguMDguMjAyNikuIEZ1ZXIgS0sgZ2VsdGVuIGRpZSB2b24KICAgKiBpaG0gYmVzdGFldGlndGVuIEFic2NobGFlZ2U6IEVpbnplbHN0dXR6ZW4gLTQwICUsIGtvbXBsZXR0ZSBWZXJiaW5kdW5nCiAgICogLTM3ICUuIEFsbGUgYW5kZXJlbiBUeXBlbiB1bmQgS0wgYmxlaWJlbiB1bnZlcmFlbmRlcnQuICovCiAgZnVuY3Rpb24gbGFlbmdlblByZWlzRmFrdG9yKHMsIHQpIHsKICAgIGlmICghcyB8fCAhdCB8fCBzLmxhZW5nZVZhcmlhbnRlICE9PSAnS0snKSByZXR1cm4gMTsKICAgIGlmICh0LmlkID09PSAnVENTJykgcmV0dXJuIDAuNjA7CiAgICBpZiAodC5pZCA9PT0gJ1RDJykgcmV0dXJuIDAuNjM7CiAgICByZXR1cm4gMTsKICB9CgogIGZ1bmN0aW9uIHByaWNlSW5mbyhzKSB7CiAgICBjb25zdCB0ID0gdHlwT2JqKHMudHlwKSwgbiA9IEQubm9ybWVuLmZpbmQoeCA9PiB4LmlkID09PSBzLm5vcm0pLCBQID0gRC5wcmVpc2U7CiAgICBpZiAoIXQgfHwgIW4pIHJldHVybiB7IG1vZGU6ICdhbmZyYWdlJyB9OwogICAgaWYgKG4ucHJlaXNNb2R1cyA9PT0gJ2FuZnJhZ2UnKSByZXR1cm4geyBtb2RlOiAnYW5mcmFnZScsIGdydW5kOiBuLmxhYmVsICsgJyDigJMgRmlybWEgV2Vpc3Mga2Fsa3VsaWVydCBpbmRpdmlkdWVsbC4nIH07CiAgICAvLyBGYWlsLXNhZmU6IEF1Y2ggd2VubiBlaW5lIGJlc3RlaGVuZGUgV29yZFByZXNzLUluc3RhbGxhdGlvbiBub2NoIGFsdGUKICAgIC8vIEJlaXNwaWVsd2VydGUgb2RlciBwbGF0emhhbHRlcjpmYWxzZSBnZXNwZWljaGVydCBoYXQsIGVyc2NoZWluZW4gRXVyby0KICAgIC8vIEJldHLDpGdlIGVyc3QgbmFjaCBlaW5lciBhdXNkcsO8Y2tsaWNoZW4gUHJlaXNmcmVpZ2FiZSBpbSBBZG1pbi4KICAgIGlmIChQLmZyZWlnZWdlYmVuICE9PSB0cnVlKSByZXR1cm4geyBtb2RlOiAnYW5mcmFnZScsIGdydW5kOiAnRGllIFByZWlzZnJlaWdhYmUgdm9uIEZpcm1hIFdlaXNzIHN0ZWh0IG5vY2ggYXVzLicgfTsKICAgIGlmIChQLnBsYXR6aGFsdGVyID09PSB0cnVlKSByZXR1cm4geyBtb2RlOiAnYW5mcmFnZScsIGdydW5kOiAnRmlybWEgV2Vpc3Mga2Fsa3VsaWVydCBpbmRpdmlkdWVsbC4nIH07CiAgICBjb25zdCBleGFjdE1vZGUgPSBQLm1vZHVzID09PSAnZXhha3QnOwogICAgY29uc3QgYmFzZSA9IGV4YWN0TW9kZQogICAgICA\\\/IGV4YWN0QmFzZVByaWNlKHMsIHQsIFApCiAgICAgIDogKFAuZ3J1bmRwcmVpcyAmJiB0ID8gUC5ncnVuZHByZWlzW3MudHlwXSA6IG51bGwpOwogICAgLy8gSW0gYWx0ZW4gR3J1bmRwcmVpcy1Nb2RlbGwgYmxlaWJlbiBudXJGbGFuc2NoLVR5cGVuIChCbGluZGRlY2tlbCwgS2xhbW1lcikKICAgIC8vIGdlc3BlcnJ0OiBEaWUgRm9ybWVsIHNrYWxpZXJ0IHVlYmVyIGRlbiBST0hSLUF1c3NlbmR1cmNobWVzc2VyCiAgICAvLyAoZG5GYWt0b3JSZWZPRCkuIERlbiBnaWJ0IGVzIGJlaSByZWluZXIgRmxhbnNjaC1BdXN3YWhsIG5pY2h0LCB1bmQgZWluZSBQcmVpc3N0YWZmZWwgbmFjaAogICAgLy8gRmxhbnNjaC3DmCBoYXQgV2Vpc3MgbmljaHQgZ2VsaWVmZXJ0LiBFaW4gUnVlY2tmYWxsIGF1ZiByb3dzMzIocmVpaGUpWzBdIHd1ZXJkZSBzdGlsbHNjaHdlaWdlbmQKICAgIC8vIG1pdCBkZXIga2xlaW5zdGVuIE5lbm53ZWl0ZSByZWNobmVuIC0+IGZhbHNjaGVyIFByZWlzLiBEZXNoYWxiIGVocmxpY2ggImF1ZiBBbmZyYWdlIi4KICAgIC8vIE1VU1MgVk9SIGRlciBadXNjaGxhZ3NwcnVlZnVuZyBzdGVoZW46IERpZSBLbGFtbWVyLVdlcmtzdG9mZmUgMS40MzA4LzEuNDQwOCBzaW5kIGluCiAgICAvLyB3ZXJrc3RvZmZadXNjaGxhZ1Byb3plbnQgYmV3dXNzdCBuaWNodCBlbnRoYWx0ZW4gKHNpZWhlIGRhdGEuanMpLiBTdGFuZCBkaWUgUHJ1ZWZ1bmcgZGF2b3IsCiAgICAvLyBiZWthbSBkZXIgS3VuZGUgYmVpIGplZGVyIEtsYW1tZXIgZGllIGZhbHNjaGUgQmVncnVlbmR1bmcgIlp1c2NobGFlZ2Ugbm9jaCBuaWNodCBiZXN0YWV0aWd0IgogICAgLy8gc3RhdHQgZGVyIHdhaHJlbiAoQmVmdW5kIDIxLjA4LjIwMjYpLgogICAgLy8gRGllIG5ldWUgV2Vpc3MtTGlzdGUgZW50aGFlbHQgZGFnZWdlbiBlY2h0ZSBGbGFuc2NocHJlaXNlLiBEYW5uIGRhcmYgZGllCiAgICAvLyBTcGVycmUgd2VnLCBhYmVyIG51ciB3ZW5uIGZ1ZXIgZGVuIGdld2FlaGx0ZW4gRmxhbnNjaCB3aXJrbGljaCBlaW4gV2VydCBkYSBpc3QuCiAgICBpZiAoIWV4YWN0TW9kZSAmJiBpc3ROdXJGbGFuc2NoKHQpKSByZXR1cm4geyBtb2RlOiAnYW5mcmFnZScsIGdydW5kOiB0LmxhYmVsICsgJyB3aXJkIG51ciBuYWNoIEZsYW5zY2gtw5ggdW50ZXJzY2hpZWRlbiwgZWluZSBQcmVpc3N0YWZmZWwgbmFjaCBGbGFuc2NoLcOYIGxpZWd0IG5vY2ggbmljaHQgdm9yLicgfTsKICAgIGlmIChiYXNlID09IG51bGwpIHJldHVybiB7IG1vZGU6ICdhbmZyYWdlJywgZ3J1bmQ6ICdGw7xyICcgKyB0LmxhYmVsICsgJyBsaWVndCBub2NoIGtlaW4gUmljaHRwcmVpcyB2b24gRmlybWEgV2Vpc3Mgdm9yLicgfTsKICAgIC8vIERpY2h0dW5nZW4gaGFiZW4ga2VpbmVuIEVkZWxzdGFobC0vT2JlcmZsYWVjaGVuc2Nocml0dC4gS2xhbW1lcm4gdHJhZ2VuCiAgICAvLyBlaWdlbmUgV2Vya3N0b2ZmZSwgZnVlciBkaWUgV2Vpc3Mga2VpbmVuIE1hdGVyaWFsYXVmc2NobGFnIGdlbGllZmVydCBoYXQuCiAgICBjb25zdCBvaG5lRml0dGluZ1p1c2NobGFnID0gaXN0RGljaHR1bmdCYXV0ZWlsKHQpIHx8IGlzdEtsYW1tZXIodCk7CiAgICBjb25zdCBtYXRaID0gb2huZUZpdHRpbmdadXNjaGxhZyA\\\/IDAgOiBQLndlcmtzdG9mZlp1c2NobGFnUHJvemVudFtlZmZXZXJrc3RvZmYocyldOwogICAgY29uc3Qgc3VyZlogPSBvaG5lRml0dGluZ1p1c2NobGFnID8gMCA6IFAub2JlcmZsYWVjaGVadXNjaGxhZ1Byb3plbnRbcy5vYmVyZmxhZWNoZV07CiAgICBpZiAobWF0WiA9PSBudWxsIHx8IHN1cmZaID09IG51bGwpIHJldHVybiB7IG1vZGU6J2FuZnJhZ2UnLCBncnVuZDonRGllIFp1c2NobMOkZ2UgZsO8ciBkaWVzZSBBdXNmw7xocnVuZyBzaW5kIG5vY2ggbmljaHQgdm9sbHN0w6RuZGlnIGJlc3TDpHRpZ3QuJyB9OwogICAgaWYgKHQuZGljaHR1bmcgJiYgcy5kaWNodHVuZyAmJiBQLmRpY2h0dW5nQXVmcHJlaXNFdXJvW3MuZGljaHR1bmddID09IG51bGwpIHJldHVybiB7IG1vZGU6J2FuZnJhZ2UnLCBncnVuZDonRGVyIERpY2h0dW5nc2F1ZnByZWlzIGlzdCBub2NoIG5pY2h0IGJlc3TDpHRpZ3QuJyB9OwogICAgaWYgKChzLm5hY2h3ZWlzZSB8fCBbXSkuc29tZShpZCA9PiBQLm5hY2h3ZWlzQXVmcHJlaXNFdXJvW2lkXSA9PSBudWxsKSkgcmV0dXJuIHsgbW9kZTonYW5mcmFnZScsIGdydW5kOidNaW5kZXN0ZW5zIGVpbiBnZXfDpGhsdGVyIE5hY2h3ZWlzIHdpcmQgaW5kaXZpZHVlbGwga2Fsa3VsaWVydC4nIH07CiAgICBjb25zdCBjaGFyZ2VuTmFjaHdlaXNlID0gKHMubmFjaHdlaXNlIHx8IFtdKS5maWx0ZXIoaXN0Q2hhcmdlbk5hY2h3ZWlzKTsKICAgIGxldCBzdGsgPSBiYXNlOwogICAgc3RrICo9IGxhZW5nZW5QcmVpc0Zha3RvcihzLCB0KTsKICAgIGlmICghZXhhY3RNb2RlKSB7CiAgICAgIGNvbnN0IHJ3ID0gcm93Rm9yKHMpOwogICAgICAvLyBvZE9mIHN0YXR0IHJ3LnR1YmVPRDogRGVyIGRpY2t3YW5kaWdlIFRDRCBoYXQga2VpbiB0dWJlT0QgLSBkZXIgRmFrdG9yIHdhZXJlIHNvbnN0CiAgICAgIC8vIGF1ZiB1bmRlZmluZWQgZ2VsYXVmZW4gdW5kIGRlciBSaWNodHByZWlzIHVlYmVyIGRlbiBmYWxzY2hlbiAoZHVlbm53YW5kaWdlbikgQUQKICAgICAgLy8gc2thbGllcnQuIG9kT2YgbGllZmVydCBmdWVyIFRDRCBkZW4gZ2VsaXN0ZXRlbiBhdXNzZW5ELgogICAgICBjb25zdCBvZCA9IG9kT2YocncpICE9IG51bGwgPyBvZE9mKHJ3KSA6IFAuZG5GYWt0b3JSZWZPRDsKICAgICAgY29uc3QgZmFrdG9yID0gTWF0aC5tYXgoMC43LCAxICsgUC5kbkZha3RvclN0ZWlndW5nICogKChvZCAtIFAuZG5GYWt0b3JSZWZPRCkgLyBQLmRuRmFrdG9yUmVmT0QpKTsKICAgICAgc3RrICo9IGZha3RvcjsKICAgIH0KICAgIC8vIEJlcm5kIExpbmtlciAoMjguMDguMjAyNik6IFByb3plbnRhdWZzY2hsYWVnZSB3ZXJkZW4gbmFjaGVpbmFuZGVyIGdlcmVjaG5ldC4KICAgIC8vIEJlaXNwaWVsOiA3NSw4MCBFVVIgKiAxLDE1ICogMSwxNSA9IDEwMCwyNSBFVVIgKGthdWZtYWVubmlzY2ggZ2VydW5kZXQpLgogICAgLy8gRXVyby1BdWZwcmVpc2UgYmxlaWJlbiBkYW5hY2ggdW52ZXJhZW5kZXJ0IGFic29sdXQuCiAgICBzdGsgKj0gKDEgKyBtYXRaIC8gMTAwKTsKICAgIHN0ayAqPSAoMSArIHN1cmZaIC8gMTAwKTsKICAgIGlmICh0LmRpY2h0dW5nICYmIHMuZGljaHR1bmcpIHN0ayArPSBQLmRpY2h0dW5nQXVmcHJlaXNFdXJvW3MuZGljaHR1bmddOwogICAgaWYgKCh0LmlkID09PSAnVEMnIHx8IHQuaWQgPT09ICdLTCcpICYmIHMua2xhbW1lclR5cCkgewogICAgICBjb25zdCBrbGFtbWVyWiA9IFAua2xhbW1lclR5cEF1ZnByZWlzRXVybyAmJiBQLmtsYW1tZXJUeXBBdWZwcmVpc0V1cm9bcy5rbGFtbWVyVHlwXTsKICAgICAgaWYgKGtsYW1tZXJaID09IG51bGwpIHJldHVybiB7IG1vZGU6J2FuZnJhZ2UnLCBncnVuZDonRGVyIEF1ZnByZWlzIGbDvHIgZGVuIGdld8OkaGx0ZW4gS2xhbW1lcnR5cCBpc3Qgbm9jaCBuaWNodCBiZXN0w6R0aWd0LicgfTsKICAgICAgc3RrICs9IE51bWJlcihrbGFtbWVyWik7CiAgICB9CiAgICAvLyBEaWUgU2VjaHNrYW50bXV0dGVyIGlzdCBsYXV0IEt1bmRlbnVudGVybGFnZSBudXIgImdlZ2VuIEF1ZnByZWlzIgogICAgLy8gdmVyZnVlZ2JhcjsgZWluIEJldHJhZyBmZWhsdC4gU2llIGRhcmYgZGVzaGFsYiBrZWluZW4gc2NoZWluYmFyIGZlcnRpZ2VuCiAgICAvLyBQcmVpcyBiZWtvbW1lbi4KICAgIGlmICh0LmlkID09PSAnS0wnICYmIHMua2xhbW1lck11dHRlciA9PT0gJ1MnKSByZXR1cm4geyBtb2RlOidhbmZyYWdlJywgZ3J1bmQ6J0RlciBBdWZwcmVpcyBmw7xyIGRpZSBTZWNoc2thbnRtdXR0ZXIgd2lyZCBpbmRpdmlkdWVsbCBrYWxrdWxpZXJ0LicgfTsKICAgIC8vIE51ciBkaWUgTmFjaHdlaXNlLCBkaWUgamUgQmF1dGVpbCBhbmZhbGxlbiwgZ2VoZW4gaW4gZGVuIFN0dWVja3ByZWlzLiBGZXJyaXQtTWVzc3VuZwogICAgLy8gdW5kIFJhLU1lc3Nwcm90b2tvbGwgZ2Vob2VyZW4gZGF6dTogZG9ydCB3aXJkIGplZGVzIGVpbnplbG5lIFRlaWwgZ2VtZXNzZW4uCiAgICAocy5uYWNod2Vpc2UgfHwgW10pLmZvckVhY2goaWQgPT4geyBpZiAoIWlzdENoYXJnZW5OYWNod2VpcyhpZCkpIHN0ayArPSBQLm5hY2h3ZWlzQXVmcHJlaXNFdXJvW2lkXTsgfSk7CiAgICBzdGsgKj0gKFAuZ2xvYmFsRmFrdG9yIHx8IDEpOyAgIC8vIGdsb2JhbGVyIFByZWlzZmFrdG9yIChBZG1pbi9QbHVnaW4sIHouIEIuIDEuMDIgPSArMiAlKQogICAgLy8gRmFsbGJhY2sgYmV3dXNzdCB7YWI6MSwgcmFiYXR0OjB9IHVuZCBOSUNIVCBQLnN0YWZmZWxbMF06IEJlZ2lubnQgZWluZSBpbSBBZG1pbgogICAgLy8gZ2VwZmxlZ3RlIFN0YWZmZWwgZXJzdCBiZWkgMTAsIGdhYiBQLnN0YWZmZWxbMF0gZGVuIDEwZXItUmFiYXR0IGF1Y2ggZnVlciBlaW4KICAgIC8vIGVpbnplbG5lcyBTdHVlY2sgKEJlZnVuZCAyMS4wOC4yMDI2KS4KICAgIGNvbnN0IHN0dWZlbiA9IEFycmF5LmlzQXJyYXkoUC5zdGFmZmVsKSA\\\/IFAuc3RhZmZlbCA6IFtdOwogICAgY29uc3Qgc3RhZmZlbCA9IHN0dWZlbi5zbGljZSgpLnJldmVyc2UoKS5maW5kKHggPT4gcy5tZW5nZSA+PSB4LmFiKSB8fCB7IGFiOiAxLCByYWJhdHQ6IDAgfTsKICAgIC8vIENoYXJnZW5hdWZwcmVpc2UgaGFlbmdlbiBhbiBkZXIgTGllZmVydW5nLCBuaWNodCBhbiBkZXIgU3R1ZWNremFobC4gU2llIGtvbW1lbgogICAgLy8gZGVzaGFsYiBlcnN0IE5BQ0ggZGVyIE1lbmdlbnJlY2hudW5nIGRhenUgdW5kIGJla29tbWVuIGJld3Vzc3QgS0VJTkVOIE1lbmdlbnJhYmF0dDoKICAgIC8vIGVpbiBaZXVnbmlzIHdpcmQgbmljaHQgYmlsbGlnZXIsIHdlaWwgbWVociBUZWlsZSBpbiBkZXJzZWxiZW4gQ2hhcmdlIGxpZWdlbi4KICAgIC8vIERlciBnbG9iYWxlIFByZWlzZmFrdG9yIGdpbHQgZGFnZWdlbiBhdWNoIGhpZXIsIHNvbnN0IHdhZXJlIGVyIHRlaWx3ZWlzZSB3aXJrdW5nc2xvcy4KICAgIGxldCBjaGFyZ2VBdWZwcmVpcyA9IDA7CiAgICBjaGFyZ2VuTmFjaHdlaXNlLmZvckVhY2goaWQgPT4geyBjaGFyZ2VBdWZwcmVpcyArPSBQLm5hY2h3ZWlzQXVmcHJlaXNFdXJvW2lkXTsgfSk7CiAgICBjaGFyZ2VBdWZwcmVpcyAqPSAoUC5nbG9iYWxGYWt0b3IgfHwgMSk7CiAgICBjb25zdCBnZXNhbXQgPSBzdGsgKiBzLm1lbmdlICogKDEgLSBzdGFmZmVsLnJhYmF0dCAvIDEwMCkgKyBjaGFyZ2VBdWZwcmVpczsKICAgIHJldHVybiB7IG1vZGU6ICdsaXZlJywgc3R1ZWNrOiBzdGssIGdlc2FtdCwgY2hhcmdlQXVmcHJlaXMsIHJhYmF0dDogc3RhZmZlbC5yYWJhdHQsIGFiOiBzdGFmZmVsLmFiLCBwbGF0emhhbHRlcjogISFQLnBsYXR6aGFsdGVyIH07CiAgfQoKICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFR5cGVuc2NobHVlc3NlbCAqLwogIC8vIEdyb2Vzc2VuLVRva2VuIGRlciBLb25maWd1cmF0aW9ucy1Oci4gLSBpZGVudGlzY2ggbWl0IGRlbSBkZXIgQXJ0aWtlbG51bW1lciwKICAvLyBkYW1pdCBiZWlkZSBOdW1tZXJuIG5pY2h0IGluIGRlciBTY2hyZWlid2Vpc2UgYXVzZWluYW5kZXJsYXVmZW4gKEJlcm5kIDI3LjA3LjIwMjY6CiAgLy8gTlcuLi4gZnVlciBJU08sIFouLi4gZnVlciBab2xsLCBkZXV0c2NoZXMgS29tbWEpLgogIGZ1bmN0aW9uIHNpemVUb2tlbihzKSB7CiAgICByZXR1cm4gYXJ0aWtlbEdyb2Vzc2Uocywgcm93Rm9yKHMpKSB8fCAnJzsKICB9CiAgY29uc3QgYXJ0aWNsZU51bWJlckZvcm1hdCA9IG4gPT4gU3RyaW5nKE1hdGgucm91bmQoTnVtYmVyKG4pICogMTAwKSAvIDEwMCkucmVwbGFjZSgnLicsICcsJyk7CiAgLyogQmVybmQgMjcuMDcuMjAyNjogImljaCBoYWJlIG5vY2gga2VpbmUgRnJlaWdhYmUgZnVlciBkaWUgVmVyd2VuZHVuZyBkZXIKICAgKiBCZXplaWNobnVuZ2VuIGRhIGRpZXNlIEhlcnN0ZWxsZXJzcGV6aWZpc2NoIHNpbmQuIiBEaWUgaGVyc3RlbGxlcmVpZ2VuZW4KICAgKiBBcnRpa2VsY29kZXMgZGVzIEhlcnN0ZWxsZXJzIHdlcmRlbiBkZXNoYWxiIE5JQ0hUIG1laHIgYXVzZ2VnZWJlbi4KICAgKiBTZWluZSBWb3JnYWJlIGF1ZiBkZW0gU2NyZWVuc2hvdDogIkFydCBOci4gd2llIEtvbmZpZ3VyYXRpb24iIC0gZGllCiAgICogQXJ0aWtlbG51bW1lciBpc3QgYmVpIENGL0NGSSBhbHNvIGlkZW50aXNjaCBtaXQgZGVyIEtvbmZpZ3VyYXRpb25zLU5yLgogICAqIERpZSBDb2RlcyBibGVpYmVuIGluIGRhdGEuanMgYWxzIFF1ZWxsZSBlcmhhbHRlbiwgbnVyIHVuc2ljaHRiYXIuICovCiAgZnVuY3Rpb24gY29ubmVjdEFydGljbGVOdW1iZXIocykgewogICAgY29uc3QgdCA9IHR5cE9iaihzLnR5cCksIHJ3ID0gcm93Rm9yKHMpOwogICAgaWYgKCF0IHx8ICFydykgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gdHlwZWNvZGUocyk7CiAgfQogIC8qIEdyb2Vzc2VuLVRva2VuIGRlciBBcnRpa2VsbnVtbWVyIChCZXJuZCAyNy4wNy4yMDI2KToKICAgKiAgIFJlaWhlIEEgKG1ldHJpc2NoKSAtPiBETjA2LCBETjI1IC4uLgogICAqICAgUmVpaGUgQiAoSVNPKSAgICAgIC0+IE5XMzMsNyAgICgiZGFzIE5XIHNhZ3QgSVNPIGF1cyIpCiAgICogICBSZWloZSBDIChab2xsKSAgICAgLT4gWjEsIFoxLDUgKCJkYXMgWiBzdGVodCBmdWVyIFpvZWxsaWciKQogICAqIERldXRzY2hlIFNjaHJlaWJ3ZWlzZSBtaXQgS29tbWEsIHdpZSBpbiBCZXJuZHMgQmVpc3BpZWxlbi4gKi8KICBmdW5jdGlvbiBncm9lc3NlVG9rZW4ocmVpaGUsIHJ3KSB7CiAgICBpZiAoIXJ3IHx8ICFyZWloZSkgcmV0dXJuIG51bGw7CiAgICBpZiAocmVpaGUgPT09ICdBJykgcmV0dXJuIFN0cmluZyhydy5pZCk7CiAgICBpZiAocmVpaGUgPT09ICdCJykgcmV0dXJuIFN0cmluZyhydy5pZCkucmVwbGFjZSgnLicsICcsJyk7CiAgICBpZiAocmVpaGUgPT09ICdDJykgcmV0dXJuICdaJyArIFN0cmluZyhydy5pZCkucmVwbGFjZSgnLicsICcsJyk7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgZnVuY3Rpb24gYXJ0aWtlbEdyb2Vzc2UocywgcncpIHsgcmV0dXJuIGdyb2Vzc2VUb2tlbihzICYmIHMucmVpaGUsIHJ3KTsgfQogIGZ1bmN0aW9uIGFydGljbGVOdW1iZXIocykgewogICAgY29uc3QgdCA9IHR5cE9iaihzLnR5cCksIHJ3ID0gcm93Rm9yKHMpOwogICAgaWYgKCF0IHx8ICFydykgcmV0dXJuIG51bGw7CiAgICBpZiAoaXNDb25uZWN0KHQpKSByZXR1cm4gY29ubmVjdEFydGljbGVOdW1iZXIocyk7CiAgICAvKiBUQy1TdHV0emVuIGVpbnplbG4gLSBCZXJuZHMgU2NoZW1hIHZvbSAyNy4wNy4yMDI2LCBlcyBlcnNldHp0IGRpZSBhbHRlCiAgICAgKiBSZXYwNi1OdW1tZXIgdm9sbHN0YWVuZGlnICgiU29sbCBkYXMgbmV1ZSBTY2hlbWEgZGllIGFsdGUgTnVtbWVyIGdhbnoKICAgICAqIGVyc2V0emVuPyBKYSIpLiBEZXIgV2Vya3N0b2ZmIHN0ZWh0IGltIEtsYXJ0ZXh0IChmdWVyIDEuNDQzNSBlaW5mYWNoIDEuNDQzNQogICAgICogYW4gZGllIFN0ZWxsZSB2b24gMS40NDA0KSwgZGllIERpY2h0dW5nIGdlaG9lcnQgTklDSFQgaGluZWluICgiTmVpbiwgbWVpbgogICAgICogRmVobGVyLCBkYSBuYXR1ZXJsaWNoIG51ciBUQ1MtRE4wNi1BLTEuNDQzNS1IMS1LSyIpLgogICAgICogICBUQ1MtPEdyb2Vzc2U+LTxSZWloZT4tPFdlcmtzdG9mZj4tPE9iZXJmbGFlY2hlPi08S0t8S0w+ICovCiAgICBpZiAodC5pZCA9PT0gJ1RDUycpIHsKICAgICAgY29uc3Qgc2l6ZSA9IGFydGlrZWxHcm9lc3NlKHMsIHJ3KSwgd2VyayA9IGVmZldlcmtzdG9mZihzKTsKICAgICAgLy8gRmFpbC1jbG9zZWQ6IE5VUiBkaWUgYmVpZGVuIGJlbGVndGVuIExhZW5nZW52YXJpYW50ZW4gZXJnZWJlbiBlaW5lIE51bW1lci4KICAgICAgLy8gRGVyIGZydWVoZXIgaGllciBzdGVoZW5kZSBLdXJ6c2NobHVzcyAoPT09ICdLTCcgPyAnS0wnIDogJ0tLJykgaGF0IGJlaSBqZWRlbQogICAgICAvLyBmcmVtZGVuIG9kZXIgZmVobGVuZGVuIFdlcnQgc3RpbGxzY2h3ZWlnZW5kICJLSyIgYmVoYXVwdGV0IC0gYXVzIGVpbmVtCiAgICAgIC8vIGthcHV0dGVuIFRlaWxlbi1MaW5rIHdhZXJlIHNvIGVpbmUgZmFsc2NoZSBBcnRpa2VsbnVtbWVyIGVudHN0YW5kZW4sIGRpZSBkZXIKICAgICAgLy8gS3VuZGUgbmllIGdld2FlaGx0IGhhdC4gT2huZSBiZWxlZ3RlIFZhcmlhbnRlIGdpYnQgZXMgbGllYmVyIGtlaW5lIE51bW1lci4KICAgICAgY29uc3QgbHYgPSBzLmxhZW5nZVZhcmlhbnRlID09PSAnS0wnID8gJ0tMJyA6IHMubGFlbmdlVmFyaWFudGUgPT09ICdLSycgPyAnS0snIDogbnVsbDsKICAgICAgaWYgKCFzaXplIHx8ICF3ZXJrIHx8ICFzLm9iZXJmbGFlY2hlIHx8ICFsdikgcmV0dXJuIG51bGw7CiAgICAgIHJldHVybiBbJ1RDUycsIHNpemUsIHMucmVpaGUsIHdlcmssIHMub2JlcmZsYWVjaGUsIGx2XS5qb2luKCctJyk7CiAgICB9CiAgICAvKiBEaWNodHVuZyAtIEJlcm5kcyBTY2hlbWEgdm9tIDI3LjA3LjIwMjY6CiAgICAgKiAgIEQtPEdyb2Vzc2U+LTxSZWloZT4tPFdlcmtzdG9mZj4tPEx8Tz4KICAgICAqICAgRC1ETjI1LUEtRVBETS1MIMK3IEQtTlczMyw3LUItVk1RLUwgwrcgRC1aMSw1LUMtRktNLU8KICAgICAqIEwgPSBtaXQgTGlwcGUsIE8gPSBvaG5lIExpcHBlLiBEaWUgTGlwcGUga29tbXQgYXVzIGVmZkxpcHBlKCksIGRhcyBCZXJuZHMKICAgICAqIFJlZ2VsIGFiYmlsZGV0IChGbGFuc2NoIDI1IG5pZSBtaXQgTGlwcGUsIFR5cCBJIHNvbnN0IG51ciBiZWkgWm9sbCkuICovCiAgICBpZiAodC5pZCA9PT0gJ0QnKSB7CiAgICAgIGNvbnN0IHNpemUgPSBhcnRpa2VsR3JvZXNzZShzLCBydyk7CiAgICAgIGNvbnN0IGQgPSBkaWNodE9iaihzLmRpY2h0dW5nKTsKICAgICAgY29uc3QgbWF0ID0gZCA\\\/IChkLmFydGlrZWxDb2RlIHx8IGQuaWQpIDogbnVsbDsKICAgICAgaWYgKCFzaXplIHx8ICFtYXQpIHJldHVybiBudWxsOwogICAgICByZXR1cm4gWydEJywgc2l6ZSwgcy5yZWloZSwgbWF0LCBlZmZMaXBwZShzKV0uam9pbignLScpOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQogIGZ1bmN0aW9uIHR5cGVjb2RlKHMpIHsKICAgIGNvbnN0IHQgPSB0eXBPYmoocy50eXApOyBpZiAoIXQpIHJldHVybiAn4oCTJzsKICAgIGlmIChpc0Nvbm5lY3QodCkpIHsKICAgICAgY29uc3QgcncgPSByb3dGb3Iocyk7IGlmICghcncpIHJldHVybiAn4oCTJzsKICAgICAgLy8gQmVybmQgMjcuMDcuMjAyNjoga2VpbmUgSGVyc3RlbGxlcnNlcmllIG1laHIgaW4gZGVyIE51bW1lciAtIG51ciBub2NoIENGIGJ6dy4gQ0ZJLgogICAgICBjb25zdCBwYXJ0cyA9IFt0LmlkLCBydy5pZF07CiAgICAgIGlmICh0LmlkID09PSAnQ0YnKSBwYXJ0cy5wdXNoKCdMJyArIGFydGljbGVOdW1iZXJGb3JtYXQocy5jb25uZWN0TGFlbmdlKSk7CiAgICAgIGVsc2UgcGFydHMucHVzaChzLmNvbm5lY3RBbnNjaGx1c3MpOwogICAgICBwYXJ0cy5wdXNoKGVmZldlcmtzdG9mZihzKSwgcy5vYmVyZmxhZWNoZSk7CiAgICAgIHJldHVybiBwYXJ0cy5maWx0ZXIoQm9vbGVhbikuam9pbignLScpOwogICAgfQogICAgLy8gbnVyRmxhbnNjaC1UeXBlbjoga2VpbiBSZWloZW4tL05lbm53ZWl0ZW4tVG9rZW4sIG51ciBkZXIgRmxhbnNjaC3DmC4KICAgIC8vIEJlaSBkZXIgS2xhbW1lciBzdGVodCBkZXIgS2xhbW1lcnR5cCB2b3JuIChLTDEvS0xMSS9LTEgpIC0gbmFlaGVyIGFuIFJldjA2CiAgICAvLyAoZG9ydCB6LiBCLiAiS0xMSS0wOC01MC1NIikgYWxzIGVpbiBnZW5lcmlzY2hlcyAiS0wiLiBEaWUgUmV2MDYtTWF0ZXJpYWwtCiAgICAvLyBjb2RlcyAoMDgvNDA4KSBzaW5kIHVlYmVyIFIyLTUgKEFydGlrZWxudW1tZXIpIG5vY2ggYWJ6dWJpbGRlbiAtPiBoaWVyIGJsZWlidAogICAgLy8gZGllIFdlcmtzdG9mZm51bW1lciB2b3JlcnN0IGltIEtsYXJ0ZXh0LgogICAgLy8gUjItNDogRGllIEtsYW1tZXIgdHJhZWd0IEtFSU5FIE9iZXJmbGFlY2hlIChrZWluIE9iZXJmbGFlY2hlbi1TY2hyaXR0KSAtPiBkaWUKICAgIC8vIE9iZXJmbGFlY2hlbmtsYXNzZSBnZWhvZXJ0IE5JQ0hUIGluIGRpZSBLbGFtbWVyLVR5cC1Oci4gKGJlaGVidCAiS2xhbW1lciB0cmFlZ3QgSDQiKS4KICAgIC8vIEJlaW0gQmxpbmRkZWNrZWwgYmxlaWJ0IHNpZSBkcmluLgogICAgaWYgKGlzdE51ckZsYW5zY2godCkpIHsKICAgICAgY29uc3QgZiA9IGZsYW5zY2hGb3Iocyk7IGlmICghZikgcmV0dXJuICfigJMnOwogICAgICBjb25zdCBrdCA9IGlzdEtsYW1tZXIodCkgPyBrbGFtbWVyVHlwT2JqKHMua2xhbW1lclR5cCkgOiBudWxsOwogICAgICBjb25zdCBwYXJ0cyA9IFtrdCA\\\/IGt0LmlkIDogdC5pZCwgJ+KMgCcgKyBmLmxhYmVsLCBlZmZXZXJrc3RvZmYocyldOwogICAgICAvLyBLb25maWd1cmF0aW9ucy1Oci4gKGtlaW5lIFdlaXNzLUFydGlrZWxudW1tZXIpOiBNdXR0ZXIvU2VjaHNrYW50bXV0dGVyIG11c3MKICAgICAgLy8gZW50aGFsdGVuIHNlaW4sIGRhbWl0IHp3ZWkgc2ljaHRiYXJlIEtsYW1tZXItQXVzZnVlaHJ1bmdlbiBlaW5kZXV0aWcgYmxlaWJlbi4KICAgICAgaWYgKGlzdEtsYW1tZXIodCkpIHBhcnRzLnB1c2gocy5rbGFtbWVyTXV0dGVyKTsKICAgICAgaWYgKCFpc3RLbGFtbWVyKHQpKSBwYXJ0cy5wdXNoKHMub2JlcmZsYWVjaGUpOwogICAgICBpZiAodC5kaWNodHVuZyAmJiBzLmRpY2h0dW5nKSBwYXJ0cy5wdXNoKHMuZGljaHR1bmcpOwogICAgICByZXR1cm4gcGFydHMuZmlsdGVyKEJvb2xlYW4pLmpvaW4oJy0nKTsKICAgIH0KICAgIC8vIG1hc3NlRm9sZ3QgKENGL0NGSSk6IEVzIGdpYnQga2VpbiBHcm9lc3Nlbi1Ub2tlbiAtIGRpZSBOdW1tZXIgd2lyZCBudXIgYXVzIGRlbQogICAgLy8gZ2ViYXV0LCB3YXMgZGVyIEt1bmRlIFdJUktMSUNIIGdld2FlaGx0IGhhdCAoVHlwLCBXZXJrc3RvZmYsIE9iZXJmbGFlY2hlLCBEaWNodHVuZykuCiAgICAvLyBLZWluIFJlaWhlbi0vTmVubndlaXRlbi1UZWlsLCBrZWluIEtLL0tMOiBiZWlkZXMgd2FlcmUgZXJmdW5kZW4uIERpZSBHcm9lc3NlIHRyYWVndAogICAgLy8gV2Vpc3MgbmFjaCwgc29iYWxkIGRhcyBEYXRlbmJsYXR0IGRhIGlzdC4KICAgIGlmIChpc3RNYXNzZUZvbGd0KHQpKSB7CiAgICAgIGNvbnN0IHBhcnRzID0gW3QuaWQsIGVmZldlcmtzdG9mZihzKSwgcy5vYmVyZmxhZWNoZV07CiAgICAgIGlmICh0LmRpY2h0dW5nICYmIHMuZGljaHR1bmcpIHBhcnRzLnB1c2gocy5kaWNodHVuZyk7CiAgICAgIHJldHVybiBwYXJ0cy5maWx0ZXIoQm9vbGVhbikuam9pbignLScpOwogICAgfQogICAgaWYgKCFzLmdyb2Vzc2UpIHJldHVybiAn4oCTJzsKICAgIGNvbnN0IHBhcnRzID0gW3QuaWQsIHNpemVUb2tlbihzKV07CiAgICAvLyBad2VpdGUgR3JvZXNzZSBpbiBkZXJzZWxiZW4gU2NocmVpYndlaXNlIHdpZSBkaWUgZXJzdGUgKE5XLi4uL1ouLi4gbWl0IEtvbW1hKS4KICAgIGlmICh0Lnp3ZWl0ZUdyb2Vzc2UgJiYgcy5ncm9lc3NlMikgeyBjb25zdCByMiA9IHJvdzJGb3Iocyk7IGlmIChyMikgcGFydHMucHVzaChncm9lc3NlVG9rZW4ocy5yZWloZSwgcjIpKTsgfQogICAgLy8gVHlwIEQ6IFNlaXQgZGVtIFdlZ2ZhbGwgdm9uIFNjaHJpdHQgNSAoQmVybmQgMTEuMDguMjAyNikgd2FlaGx0IG5pZW1hbmQgbWVocgogICAgLy8gRWRlbHN0YWhsLVdlcmtzdG9mZiB1bmQgT2JlcmZsYWVjaGUgLSBkYW5uIGR1ZXJmZW4gc2llIGF1Y2ggbmljaHQgaW4gZGVyCiAgICAvLyBrdW5kZW5zaWNodGJhcmVuIEtvbmZpZ3VyYXRpb25zLU5yLiBhdWZ0YXVjaGVuLiBTb25zdCBzdHVlbmRlIGRvcnQgZWluCiAgICAvLyAiMS40NDA0LUg0IiwgZGFzIGRlciBLdW5kZSBuaWUgYW5nZWtsaWNrdCBoYXQuIFVlYnJpZyBibGVpYnQKICAgIC8vIEQtPEdyb2Vzc2U+LTxSZWloZT4tPERpY2h0dW5nPi08THxPPiwgcGFyYWxsZWwgenVyIFdlaXNzLUFydGlrZWxudW1tZXIuCiAgICBpZiAoaXN0RGljaHR1bmdCYXV0ZWlsKHQpKSBwYXJ0cy5wdXNoKHMucmVpaGUpOwogICAgZWxzZSBwYXJ0cy5wdXNoKHMucmVpaGUsIGVmZldlcmtzdG9mZihzKSwgcy5vYmVyZmxhZWNoZSk7CiAgICBpZiAodC5kaWNodHVuZyAmJiBzLmRpY2h0dW5nKSBwYXJ0cy5wdXNoKHMuZGljaHR1bmcsIGVmZkxpcHBlKHMpKTsKICAgIC8vIEtLL0tMIGhhZW5ndCBhbSBsYWVuZ2VWYXJpYW50ZS1GbGFnLCBOSUNIVCBhbSBzdmdUeXBlOiBUQ0QgdHJhZWd0IHp3YXIKICAgIC8vIHN2Z1R5cGU6J2NsYW1wc3R1dHplbicsIGhhdCBhYmVyIGtlaW5lIEtLL0tMLUxhZW5nZSAoZGlja3dhbmRpZywgZmVzdGUgSG9laGUgNjAgbW0pLgogICAgLy8gVWViZXIgZGVuIHN2Z1R5cGUgc3RhbmQgaW4gZGVyIFR5cC1Oci4gZWluICItS0siLCBkYXMgZXMgZnVlciBUQ0QgbmljaHQgZ2lidC4KICAgIGlmICh0LmxhZW5nZVZhcmlhbnRlKSBwYXJ0cy5wdXNoKHMubGFlbmdlVmFyaWFudGUpOwogICAgaWYgKHQuc3ZnVHlwZSA9PT0gJ3JlZHV6aWVydW5nJykgcGFydHMucHVzaChzLmV4emVudHJpc2NoID8gJ2V4eicgOiAna29ueicpOwogICAgLy8gUjMtMy9SMy00OiBCYXVmb3JtIFQgLyBUSyBpbiBkaWUgVHlwLU5yLiAoei4gQi4gVFMtLi4uLVQsIFRTUi0uLi4tVEspLgogICAgaWYgKHQuZm9ybVdhaGwpIHBhcnRzLnB1c2gocy5mb3JtVmFyaWFudGUpOwogICAgaWYgKHQuaWQgPT09ICdUQycgJiYgcy5rbGFtbWVyVHlwKSBwYXJ0cy5wdXNoKHMua2xhbW1lclR5cCk7CiAgICByZXR1cm4gcGFydHMuZmlsdGVyKEJvb2xlYW4pLmpvaW4oJy0nKTsKICB9CiAgLy8gQXVzZnVlaHJ1bmcgKExpcHBlKSA9IERpY2h0dW5nc3R5cC4gQkVMRUdUIChCZXJuZCAxNi4wNy4yMDI2LCBBRU5ERVJVTkdTUExBTiBSMi0zKToKICAvLyBUeXAgSSA9IG9obmUgTGlwcGUgKE8pLCBUeXAgSUkgPSBtaXQgTGlwcGUgKEwpLiAiR2VuZXJlbGwgbnVyIFR5cCBJSTsgVHlwIEkgbnVyIGJlaQogIC8vIFJlaWhlIEMgKFpvbGwpLiIgLT4gUkVJSEVOLWJhc2llcnQgKGxvZXN0IGRpZSBmcnVlaGVyZSBmbGFuc2NoLcOYLVN0YWZmZWx1bmcgYWIpOgogIC8vIFJlaWhlIEMgYmlldGV0IFR5cCBJICsgVHlwIElJLCBSZWloZSBBICsgQiBudXIgVHlwIElJLiBEZXIgRGVmYXVsdCBpc3QgZGFtaXQgdWViZXJhbGwKICAvLyAibWl0IExpcHBlIChUeXAgSUkpIiAoc3RhdGUubGlwcGU6J0wnKS4gbnVyRmxhbnNjaC1UeXBlbiAoQmxpbmRkZWNrZWwpIGhhYmVuIGtlaW5lCiAgLy8gd2FlaGxiYXJlIFJlaWhlIC0+IGViZW5mYWxscyBudXIgVHlwIElJLgogIC8qIEVyZ2Flbnp1bmcgQmVybmQgMjcuMDcuMjAyNjogIkwgPSBtaXQgTGlwcGUsIGFsc28gZmFzdCBhbGxlLCB1bmQgTyA9IG9obmUgTGlwcGUKICAgKiAobnVyIGJlaSB6b2VsbGlnZW4gVU5EIGJlaSBhbGxlbiBEaWNodHVuZ2VuIG1pdCBUQzI1LiBEaWUgRGljaHR1bmdlbiBmdWVyCiAgICogRmxhbnNjaCAyNW1tIGhhYmVuIGJhdWFydGJlZGluZ3QgbmllIGVpbmUgTGlwcGUsIGF1Y2ggYmVpIERJTiB1bmQgSVNPIG5pY2h0ISkiCiAgICogLT4gRmxhbnNjaC3ijIAgMjUgbGFlc3N0IG51ciBUeXAgSSB6dSwgdW5hYmhhZW5naWcgdm9uIGRlciBSZWloZS4gKi8KICBmdW5jdGlvbiBmbGFuc2NoT2RPZihzKSB7CiAgICBpZiAoaXN0TnVyRmxhbnNjaCh0eXBPYmoocy50eXApKSkgeyBjb25zdCBmID0gZmxhbnNjaEZvcihzKTsgcmV0dXJuIGYgPyBmLmZsYW5nZU9EIDogbnVsbDsgfQogICAgY29uc3QgcncgPSByb3dGb3Iocyk7CiAgICByZXR1cm4gcncgJiYgcncuZmxhbmdlT0QgIT0gbnVsbCA\\\/IHJ3LmZsYW5nZU9EIDogbnVsbDsKICB9CiAgZnVuY3Rpb24gYXVzZnVlaHJ1bmdBdmFpbChzKSB7CiAgICBpZiAoZmxhbnNjaE9kT2YocykgPT09IDI1KSByZXR1cm4gWydPJ107CiAgICByZXR1cm4gKHMucmVpaGUgPT09ICdDJyAmJiAhaXN0TnVyRmxhbnNjaCh0eXBPYmoocy50eXApKSkgPyBbJ0wnLCAnTyddIDogWydMJ107CiAgfQogIGZ1bmN0aW9uIGVmZkxpcHBlKHMpIHsgY29uc3QgYXYgPSBhdXNmdWVocnVuZ0F2YWlsKHMpOyByZXR1cm4gYXYuaW5kZXhPZihzLmxpcHBlKSA+PSAwID8gcy5saXBwZSA6IGF2WzBdOyB9CiAgLyogRGljaHR1bmdzLUlubmVuLcOYIGZ1ZXIgZGVuIEdFV0FFSExURU4gRGljaHR1bmdzd2Vya3N0b2ZmLiBEaWUgUmVnZWwgc3RlaHQgaW4KICAgKiBkYXRhLmpzIChkaWNodHVuZ0lubmVuRCksIGhpZXIgd2lyZCBudXIgZGVyIFN0YXRlIGFuZ2VsZWd0LiBad2VpIE51dHplcjoKICAgKiBkaWUgWmVpY2hudW5nIChwYXJhbXNGb3IpIHVuZCBkYXMgRGF0ZW5ibGF0dC4gQmVpZGUgbXVlc3NlbiBkZW5zZWxiZW4gV2VydAogICAqIHplaWdlbiAtIGZydWVoZXIgd2FyIGVzIGFuIGJlaWRlbiBTdGVsbGVuIHN0dXIgZGVyIFRhYmVsbGVud2VydC4gKi8KICBmdW5jdGlvbiBkaWNodHVuZ0lubmVuRChzLCBydykgewogICAgaWYgKCFydykgcmV0dXJuIG51bGw7CiAgICBpZiAodHlwZW9mIEQuZGljaHR1bmdJbm5lbkQgIT09ICdmdW5jdGlvbicpIHJldHVybiBydy5nYXNrZXRJRCAhPSBudWxsID8gcncuZ2Fza2V0SUQgOiBudWxsOwogICAgcmV0dXJuIEQuZGljaHR1bmdJbm5lbkQocncsIHMuZGljaHR1bmcgfHwgJ0VQRE0nKTsKICB9CiAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTdGVwcyAqLwogIGNvbnN0IFNURVBTID0gWwogICAgeyBuOjEsIGxhYmVsOidBbndlbmR1bmcnIH0sIHsgbjoyLCBsYWJlbDonTm9ybScgfSwgeyBuOjMsIGxhYmVsOidCYXV0ZWlsJyB9LAogICAgeyBuOjQsIGxhYmVsOidHcsO2w59lJyB9LCB7IG46NSwgbGFiZWw6J1dlcmtzdG9mZiAmIE9iZXJmbMOkY2hlJyB9LCB7IG46NiwgbGFiZWw6J0RpY2h0dW5nJyB9LAogICAgeyBuOjcsIGxhYmVsOidOYWNod2Vpc2UgJiBNZW5nZScgfSwgeyBuOjgsIGxhYmVsOidBbmZyYWdlJyB9CiAgXTsKICBmdW5jdGlvbiBpc1R5cGVCbG9ja2VkKHQpIHsKICAgIHJldHVybiAhISh0ICYmIHQuaWQgPT09ICdUU1InICYmIEQubWFzc2UuZGluMTE4NjUudFN0dWVja1JlZHV6aWVydC5zdGF0dXMgPT09ICdibG9ja2llcnQnKTsKICB9CiAgZnVuY3Rpb24gcmVpaGVBdmFpbGFibGUodCwgcmVpaGUpIHsKICAgIGlmICghdCB8fCBpc0Nvbm5lY3QodCkgfHwgaXN0TnVyRmxhbnNjaCh0KSkgcmV0dXJuIGZhbHNlOwogICAgaWYgKHQuaWQgPT09ICdUUycpIHJldHVybiAhISgoKEQubWFzc2UuZGluMTE4NjUudFN0dWVja0dsZWljaC5yZWloZW5bcmVpaGVdIHx8IHt9KS5yb3dzIHx8IFtdKS5sZW5ndGgpOwogICAgaWYgKHQuaWQgPT09ICdUU1InKSByZXR1cm4gISEoKChELm1hc3NlLmRpbjExODY1LnRTdHVlY2tSZWR1emllcnQucmVpaGVuW3JlaWhlXSB8fCB7fSkucm93cyB8fCBbXSkubGVuZ3RoKTsKICAgIHJldHVybiB0cnVlOwogIH0KICBjb25zdCBkaWNodHVuZ0FwcGxpZXMgPSAoKSA9PiB7IGNvbnN0IHQgPSB0eXBPYmooc3RhdGUudHlwKTsgcmV0dXJuICEhKHQgJiYgdC5kaWNodHVuZyk7IH07CiAgZnVuY3Rpb24gYXBwbGljYWJsZShuKSB7CiAgICAvLyBTY2hyaXR0IDUgZW50ZmFlbGx0IGJlaW0gQmF1dGVpbCAiRGljaHR1bmciOiBkb3J0IGdpYnQgZXMga2VpbmVuIEVkZWxzdGFobC0KICAgIC8vIFdlcmtzdG9mZiB1bmQga2VpbmUgT2JlcmZsYWVjaGUgenUgd2FlaGxlbiAoQmVybmQgMTEuMDguMjAyNikuCiAgICAvLyBHZXd1ZW5zY2h0ZSBGb2xnZSBmdWVyIFR5cCBEOiBCYXV0ZWlsIC0+IEdyb2Vzc2UgLT4gRGljaHR1bmcgLT4gTmFjaHdlaXNlLgogICAgaWYgKG4gPT09IDUpIHJldHVybiAhaXN0RGljaHR1bmdCYXV0ZWlsKHR5cE9iaihzdGF0ZS50eXApKTsKICAgIGlmIChuID09PSA2KSByZXR1cm4gZGljaHR1bmdBcHBsaWVzKCk7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgLy8gRmFlbmd0IGRlbiBGYWxsIGFiLCBkYXNzIGRlciBha3R1ZWxsZSBTY2hyaXR0IGR1cmNoIGVpbmVuIFR5cHdlY2hzZWwgb2RlciBlaW5lbgogIC8vIERlZXAtTGluayB3ZWdmYWVsbHQgLSBzb25zdCBzdHVlbmRlIGRlciBLb25maWd1cmF0b3IgYXVmIGVpbmVtIFNjaHJpdHQsIGRlbiBlcwogIC8vIGZ1ZXIgZGllc2VzIEJhdXRlaWwgZ2FyIG5pY2h0IG1laHIgZ2lidCwgdW5kIGRpZSBCdWVobmUgYmxpZWJlIGxlZXIuCiAgZnVuY3Rpb24gZml4U3RlcCgpIHsKICAgIGlmIChhcHBsaWNhYmxlKHN0YXRlLnN0ZXApKSByZXR1cm47CiAgICBjb25zdCBhID0gYXBwU3RlcHMoKTsKICAgIHN0YXRlLnN0ZXAgPSBhLmZpbmQoeCA9PiB4ID49IHN0YXRlLnN0ZXApIHx8IGFbYS5sZW5ndGggLSAxXSB8fCAxOwogIH0KICBmdW5jdGlvbiBhcHBTdGVwcygpIHsgcmV0dXJuIFNURVBTLmZpbHRlcihzID0+IGFwcGxpY2FibGUocy5uKSkubWFwKHMgPT4gcy5uKTsgfQogIC8vIEZvcnRsYXVmZW5kZSBBbnplaWdlLU51bW1lciBlaW5lcyBTY2hyaXR0cyAoMS4uTikgdW50ZXIgZGVuIGFrdHVlbGwgYW53ZW5kYmFyZW4KICAvLyBTY2hyaXR0ZW4uIEJsZWlidCBsdWVja2xvcywgd2VubiBTY2hyaXR0IDYgKERpY2h0dW5nKSBuaWNodCBhbndlbmRiYXIgaXN0LiBEaWUKICAvLyBpbnRlcm5lIExvZ2lrIG51dHp0IHdlaXRlciBkaWUgc3RhYmlsZW4gbiAoZGF0YS1uKSwgbnVyIGRpZSBBbnplaWdlIHphZWhsdCBuZXUuCiAgZnVuY3Rpb24gc3RlcFBvcyhuKSB7IGNvbnN0IGkgPSBhcHBTdGVwcygpLmluZGV4T2Yobik7IHJldHVybiBpIDwgMCA\\\/IG4gOiBpICsgMTsgfQogIGZ1bmN0aW9uIGNvbXBsZXRlKG4pIHsKICAgIHN3aXRjaCAobikgewogICAgICBjYXNlIDE6IHJldHVybiAhIXN0YXRlLmFud2VuZHVuZzsKICAgICAgY2FzZSAyOiByZXR1cm4gISFzdGF0ZS5ub3JtOwogICAgICBjYXNlIDM6IHsKICAgICAgICBjb25zdCB0ID0gdHlwT2JqKHN0YXRlLnR5cCk7CiAgICAgICAgcmV0dXJuICEhKHQgJiYgdC5ha3RpdiAmJiAhaXNUeXBlQmxvY2tlZCh0KSAmJiB0Lm5vcm0gPT09IHN0YXRlLm5vcm0pOwogICAgICB9CiAgICAgIC8vIG1hc3NlRm9sZ3QgKENGL0NGSSk6IEluIFNjaHJpdHQgNCBnaWJ0IGVzIG5pY2h0cyB6dSB3YWVobGVuIChrZWluZSBiZWxlZ3RlIEdyb2Vzc2UpLgogICAgICAvLyBEZXIgU2Nocml0dCBnaWx0IHRyb3R6ZGVtIGFscyBlcmxlZGlndCwgc29uc3QgaGFlbmdlIGRlciBLdW5kZSBmZXN0IHVuZCBrb2VubnRlIGRlbgogICAgICAvLyBUeXAgendhciBzZWhlbiwgYWJlciBuaWUgYW5mcmFnZW4gLSBkYXMgd2FlcmUgZmFrdGlzY2ggYWt0aXY6ZmFsc2UuCiAgICAgIGNhc2UgNDogewogICAgICAgIGNvbnN0IHQgPSB0eXBPYmooc3RhdGUudHlwKTsKICAgICAgICBpZiAoaXN0TWFzc2VGb2xndCh0KSkgcmV0dXJuIHRydWU7CiAgICAgICAgaWYgKGlzdE51ckZsYW5zY2godCkpIHJldHVybiAhIXN0YXRlLmZsYW5zY2g7CiAgICAgICAgaWYgKHQgJiYgdC5pZCA9PT0gJ0NGJykgcmV0dXJuICEhKHN0YXRlLmdyb2Vzc2UgJiYgc3RhdGUuY29ubmVjdExhZW5nZSAhPSBudWxsKTsKICAgICAgICBpZiAodCAmJiB0LmlkID09PSAnQ0ZJJykgcmV0dXJuICEhKHN0YXRlLmdyb2Vzc2UgJiYgc3RhdGUuY29ubmVjdEFuc2NobHVzcyk7CiAgICAgICAgaWYgKHQgJiYgdC5mb3JtV2FobCAmJiAhWydUJywnVEsnXS5pbmNsdWRlcyhzdGF0ZS5mb3JtVmFyaWFudGUpKSByZXR1cm4gZmFsc2U7CiAgICAgICAgaWYgKGlzdEZvcm1PaG5lTWFzc2Uoc3RhdGUpKSByZXR1cm4gZmFsc2U7CiAgICAgICAgcmV0dXJuICEhc3RhdGUuZ3JvZXNzZSAmJiAoISh0ICYmIHQuendlaXRlR3JvZXNzZSkgfHwgISFzdGF0ZS5ncm9lc3NlMik7CiAgICAgIH0KICAgICAgY2FzZSA1OiB7CiAgICAgICAgY29uc3QgdCA9IHR5cE9iaihzdGF0ZS50eXApOwogICAgICAgIHJldHVybiAhIShlZmZXZXJrc3RvZmYoc3RhdGUpICYmIChpc3RLbGFtbWVyKHQpIHx8IG9iZXJmbGFlY2hlRXJsYXVidChzdGF0ZSkpKTsKICAgICAgfQogICAgICBjYXNlIDY6IHJldHVybiAhZGljaHR1bmdBcHBsaWVzKCkgfHwgISFzdGF0ZS5kaWNodHVuZzsKICAgICAgY2FzZSA3OiByZXR1cm4gc3RhdGUubWVuZ2UgPj0gMTsKICAgICAgY2FzZSA4OiByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CiAgZnVuY3Rpb24gcmVhY2hhYmxlKG4pIHsgZm9yIChjb25zdCBtIG9mIGFwcFN0ZXBzKCkpIHsgaWYgKG0gPj0gbikgYnJlYWs7IGlmICghY29tcGxldGUobSkpIHJldHVybiBmYWxzZTsgfSByZXR1cm4gdHJ1ZTsgfQogIGZ1bmN0aW9uIGdvKG4pIHsgaWYgKCFhcHBsaWNhYmxlKG4pIHx8ICFyZWFjaGFibGUobikpIHJldHVybjsgc3RhdGUuc3RlcCA9IG47IHJlbmRlckFsbCgpOyBzY3JvbGxUb3AoKTsgfQogIGZ1bmN0aW9uIG5leHRTdGVwKCkgeyBjb25zdCBhID0gYXBwU3RlcHMoKTsgY29uc3QgaSA9IGEuaW5kZXhPZihzdGF0ZS5zdGVwKTsgaWYgKGkgPCBhLmxlbmd0aCAtIDEgJiYgY29tcGxldGUoc3RhdGUuc3RlcCkpIGdvKGFbaSArIDFdKTsgfQogIGZ1bmN0aW9uIHByZXZTdGVwKCkgeyBjb25zdCBhID0gYXBwU3RlcHMoKTsgY29uc3QgaSA9IGEuaW5kZXhPZihzdGF0ZS5zdGVwKTsgaWYgKGkgPiAwKSBnbyhhW2kgLSAxXSk7IH0KICBmdW5jdGlvbiBzY3JvbGxUb3AoKSB7IHRyeSB7IHdpbmRvdy5zY3JvbGxUbyh7IHRvcDogMCwgYmVoYXZpb3I6ICdzbW9vdGgnIH0pOyB9IGNhdGNoIChlKSB7fSB9CgogIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU2V0dGVyICovCiAgZnVuY3Rpb24gcGljayhwYXRjaCkgeyBPYmplY3QuYXNzaWduKHN0YXRlLCBwYXRjaCk7IHJlbmRlckFsbCgpOyB9CiAgZnVuY3Rpb24gc2V0QW53ZW5kdW5nKGlkKSB7CiAgICBjb25zdCBhID0gRC5hbndlbmR1bmdlbi5maW5kKHggPT4geC5pZCA9PT0gaWQpOyBpZiAoIWEpIHJldHVybjsKICAgIHN0YXRlLmFud2VuZHVuZyA9IGlkOwogICAgc3RhdGUud2Vya3N0b2ZmID0gYS5kZWZhdWx0cy53ZXJrc3RvZmY7IHN0YXRlLm9iZXJmbGFlY2hlID0gYS5kZWZhdWx0cy5vYmVyZmxhZWNoZTsgc3RhdGUuZGljaHR1bmcgPSBhLmRlZmF1bHRzLmRpY2h0dW5nOwogICAgcmVuZGVyQWxsKCk7CiAgfQogIGZ1bmN0aW9uIHNldE5vcm0oaWQpIHsgc3RhdGUubm9ybSA9IGlkOyBzdGF0ZS50eXAgPSBudWxsOyBzdGF0ZS5ncm9lc3NlID0gbnVsbDsgc3RhdGUuZ3JvZXNzZTIgPSBudWxsOyByZW5kZXJBbGwoKTsgfQogIGZ1bmN0aW9uIHNldFR5cChpZCkgewogICAgY29uc3QgdCA9IHR5cE9iaihpZCk7IGlmICghdCkgcmV0dXJuOwogICAgaWYgKCF0LmFrdGl2IHx8IHQubm9ybSAhPT0gc3RhdGUubm9ybSB8fCBpc1R5cGVCbG9ja2VkKHQpKSByZXR1cm47CiAgICBzdGF0ZS50eXAgPSBpZDsKICAgIGlmIChpc3ROdXJGbGFuc2NoKHQpKSB7CiAgICAgIC8vIFJlaWhlbi1BdXN3YWhsIGdpbHQgZnVlciBkaWVzZW4gVHlwIG5pY2h0IC0+IGdyb2Vzc2UgbGVlcmVuLCBkYW1pdCBuaXJnZW5kcwogICAgICAvLyB2ZXJzZWhlbnRsaWNoIGVpbmUgTmVubndlaXRlIGF1cyBlaW5lbSBmcnVlaGVyZW4gVHlwIG1pdGdlc2NobGVpZnQgd2lyZC4KICAgICAgc3RhdGUuZ3JvZXNzZSA9IG51bGw7IHN0YXRlLmdyb2Vzc2UyID0gbnVsbDsKICAgICAgaWYgKCFmbGFuc2NoT2JqKHN0YXRlLmZsYW5zY2gpKSBzdGF0ZS5mbGFuc2NoID0gKEQuZmxhbnNjaGdyb2Vzc2VuWzBdIHx8IHt9KS5pZCB8fCBudWxsOwogICAgICBpZiAoaXN0S2xhbW1lcih0KSAmJiAha2xhbW1lclR5cE9iaihzdGF0ZS5rbGFtbWVyVHlwKSkgewogICAgICAgIGNvbnN0IGRlZiA9IChELmtsYW1tZXJUeXBlbiB8fCBbXSkuZmluZChrID0+IGsuZGVmYXVsdCkgfHwgKEQua2xhbW1lclR5cGVuIHx8IFtdKVswXTsKICAgICAgICBzdGF0ZS5rbGFtbWVyVHlwID0gZGVmID8gZGVmLmlkIDogbnVsbDsKICAgICAgfQogICAgfSBlbHNlIGlmIChpc0Nvbm5lY3QodCkpIHsKICAgICAgc3RhdGUuZ3JvZXNzZTIgPSBudWxsOwogICAgICBzdGF0ZS5jb25uZWN0Tm9ybSA9IHQuaWQgPT09ICdDRicgJiYgRC5tYXNzZS5jb25uZWN0LmNmLnJlaWhlbltzdGF0ZS5jb25uZWN0Tm9ybV0gPyBzdGF0ZS5jb25uZWN0Tm9ybSA6ICdESU4nOwogICAgICBzdGF0ZS5jb25uZWN0QW5zY2hsdXNzID0gJ0JXJzsKICAgICAgY29uc3QgcnMgPSByb3dzRm9yKHN0YXRlKTsKICAgICAgc3RhdGUuZ3JvZXNzZSA9IHJzLmxlbmd0aCA\\\/IHJzWzBdLmlkIDogbnVsbDsKICAgICAgY29uc3QgcncgPSByc1swXSB8fCBudWxsOwogICAgICBzdGF0ZS5jb25uZWN0TGFlbmdlID0gdC5pZCA9PT0gJ0NGJyAmJiBydyAmJiBydy5sYWVuZ2VuLmxlbmd0aCA\\\/IHJ3LmxhZW5nZW5bMF0uTCA6IG51bGw7CiAgICAgIGlmICghb2JlcmZsYWVjaGVFcmxhdWJ0KHN0YXRlKSkgc3RhdGUub2JlcmZsYWVjaGUgPSBvYmVyZmxhZWNoZW5PcHRpb25lbihzdGF0ZSlbMF0uaWQ7CiAgICB9IGVsc2UgewogICAgICBjb25zdCBycyA9IHJvd3NGb3Ioc3RhdGUpOwogICAgICBpZiAodC56d2VpdGVHcm9lc3NlKSB7CiAgICAgICAgLy8gUmVkdXppZXJ1bmcgLyByZWR1emllcnRlcyBULVN0w7xjazogZGllIE5lbm53ZWl0ZSBtdXNzIEdSw5ZTU0VSIHNlaW4gYWxzICJSZWR1emllcnQgYXVmIgogICAgICAgIC8vIChCZXJuZCBSMy0yL1IzLTQpLiBEZWZhdWx0LU5lbm53ZWl0ZSBkYWhlciBOSUNIVCBkaWUga2xlaW5zdGUgKHNvbnN0IGfDpGJlIGVzIGtlaW5lCiAgICAgICAgLy8ga2xlaW5lcmUgdW5kIGRpZSBaZWljaG51bmcgYmxpZWJlIGxlZXIpLCBzb25kZXJuIGVpbmUga2xlaW5lLCBhYmVyIHJlZHV6aWVyYmFyZSBHcsO2w59lOwogICAgICAgIC8vICJSZWR1emllcnQgYXVmIiA9IGRpZSBncsO2w590ZSBub2NoIGtsZWluZXJlIEdyw7bDn2UgLT4gc29mb3J0IGVpbiBlY2h0ZXIgS2VnZWwuCiAgICAgICAgc3RhdGUuZ3JvZXNzZSA9IHJzLmxlbmd0aCA\\\/IHJzW01hdGgubWluKDMsIHJzLmxlbmd0aCAtIDEpXS5pZCA6IG51bGw7CiAgICAgICAgc3RhdGUuZ3JvZXNzZTIgPSBkZWZhdWx0R3JvZXNzZTIoc3RhdGUpOwogICAgICB9IGVsc2UgewogICAgICAgIHN0YXRlLmdyb2Vzc2UgPSBycy5sZW5ndGggPyByc1swXS5pZCA6IG51bGw7CiAgICAgIH0KICAgIH0KICAgIHN0YXRlLmxhZW5nZVZhcmlhbnRlID0gJ0tMJzsgc3RhdGUuZXh6ZW50cmlzY2ggPSBmYWxzZTsgc3RhdGUuZm9ybVZhcmlhbnRlID0gJ1QnOwogICAgaWYgKCF0LmRpY2h0dW5nKSB7IC8qIGtlZXAgZGljaHR1bmcgc3RvcmVkICovIH0KICAgIGZpeFN0ZXAoKTsKICAgIHJlbmRlckFsbCgpOwogIH0KICBmdW5jdGlvbiBzZXRSZWloZShyKSB7CiAgICBjb25zdCB0MCA9IHR5cE9iaihzdGF0ZS50eXApOwogICAgaWYgKCFyZWloZUF2YWlsYWJsZSh0MCwgcikpIHJldHVybjsKICAgIHN0YXRlLnJlaWhlID0gcjsKICAgIGNvbnN0IHQgPSB0eXBPYmooc3RhdGUudHlwKSwgcnMgPSByb3dzRm9yKHN0YXRlKTsKICAgIGlmICh0ICYmIHQuendlaXRlR3JvZXNzZSkgewogICAgICAvLyB3aWUgaW4gc2V0VHlwOiByZWR1emllcmJhcmUgRGVmYXVsdC1OZW5ud2VpdGUgKyBncsO2w590ZSBrbGVpbmVyZSBHcsO2w59lIGFscyAiUmVkdXppZXJ0IGF1ZiIuCiAgICAgIHN0YXRlLmdyb2Vzc2UgPSBycy5sZW5ndGggPyByc1tNYXRoLm1pbigzLCBycy5sZW5ndGggLSAxKV0uaWQgOiBudWxsOwogICAgICBzdGF0ZS5ncm9lc3NlMiA9IGRlZmF1bHRHcm9lc3NlMihzdGF0ZSk7CiAgICB9IGVsc2UgewogICAgICBzdGF0ZS5ncm9lc3NlID0gcnMubGVuZ3RoID8gcnNbMF0uaWQgOiBudWxsOwogICAgfQogICAgcmVuZGVyQWxsKCk7CiAgfQogIC8vIE5lbm53ZWl0ZSBzZXR6ZW4uIEJlaSBSZWR1emllci1UeXBlbiAoendlaXRlR3JvZXNzZSkgbXVzcyAiUmVkdXppZXJ0IGF1ZiIgS0xFSU5FUiBibGVpYmVuCiAgLy8gYWxzIGRpZSBuZXVlIE5lbm53ZWl0ZSAoQmVybmQgUjMtMi9SMy00KTogaXN0IGRlciBiaXNoZXJpZ2UgendlaXRlIMOYIG5pY2h0IG1laHIga2xlaW5lcgogIC8vIChvZGVyIGdpYnQgZXMgZ2FyIGtlaW5lbiBrbGVpbmVyZW4pLCBhdWYgZGllIGdyw7bDn3RlIGfDvGx0aWdlIGtsZWluZXJlIEdyw7bDn2UgenVyw7xja3NldHplbiAtCiAgLy8gYnp3LiBudWxsLCB3ZW5uIGtlaW5lIGV4aXN0aWVydCAoZGFubiBQbGF0emhhbHRlciAiZm9sZ3QiKS4gU28ga2FubiBuaWUgb2QgPT0gb2QyIChnZXJhZGVzCiAgLy8gUm9ocikgZW50c3RlaGVuIHVuZCBkZXIgU3RhdGUgYmxlaWJ0IGtvbnNpc3RlbnQuCiAgZnVuY3Rpb24gc2V0R3JvZXNzZShpZCkgewogICAgc3RhdGUuZ3JvZXNzZSA9IGlkOwogICAgY29uc3QgdCA9IHR5cE9iaihzdGF0ZS50eXApOwogICAgaWYgKHQgJiYgdC5pZCA9PT0gJ0NGJykgewogICAgICBjb25zdCBydyA9IHJvd0ZvcihzdGF0ZSk7CiAgICAgIGlmICghcncgfHwgIXJ3LmxhZW5nZW4uc29tZSh4ID0+IE51bWJlcih4LkwpID09PSBOdW1iZXIoc3RhdGUuY29ubmVjdExhZW5nZSkpKSB7CiAgICAgICAgc3RhdGUuY29ubmVjdExhZW5nZSA9IHJ3ICYmIHJ3LmxhZW5nZW4ubGVuZ3RoID8gcncubGFlbmdlblswXS5MIDogbnVsbDsKICAgICAgfQogICAgfQogICAgaWYgKHQgJiYgdC56d2VpdGVHcm9lc3NlKSB7CiAgICAgIGNvbnN0IGF2ID0gcm93czJGb3Ioc3RhdGUpOwogICAgICBpZiAoIWF2LnNvbWUociA9PiByLmlkID09PSBzdGF0ZS5ncm9lc3NlMikpIHN0YXRlLmdyb2Vzc2UyID0gYXYubGVuZ3RoID8gYXZbYXYubGVuZ3RoIC0gMV0uaWQgOiBudWxsOwogICAgfQogICAgcmVuZGVyQWxsKCk7CiAgfQogIGZ1bmN0aW9uIHNldENvbm5lY3ROb3JtKGlkKSB7CiAgICBpZiAoIUQubWFzc2UuY29ubmVjdC5jZi5yZWloZW5baWRdKSByZXR1cm47CiAgICBzdGF0ZS5jb25uZWN0Tm9ybSA9IGlkOwogICAgY29uc3QgcnMgPSByb3dzRm9yKHN0YXRlKTsgc3RhdGUuZ3JvZXNzZSA9IHJzLmxlbmd0aCA\\\/IHJzWzBdLmlkIDogbnVsbDsKICAgIHN0YXRlLmNvbm5lY3RMYWVuZ2UgPSByc1swXSAmJiByc1swXS5sYWVuZ2VuLmxlbmd0aCA\\\/IHJzWzBdLmxhZW5nZW5bMF0uTCA6IG51bGw7CiAgICByZW5kZXJBbGwoKTsKICB9CiAgZnVuY3Rpb24gc2V0Q29ubmVjdExhZW5nZSh2YWx1ZSkgewogICAgY29uc3QgcncgPSByb3dGb3Ioc3RhdGUpLCBuID0gTnVtYmVyKHZhbHVlKTsKICAgIGlmIChydyAmJiBydy5sYWVuZ2VuLnNvbWUoeCA9PiBOdW1iZXIoeC5MKSA9PT0gbikpIHsgc3RhdGUuY29ubmVjdExhZW5nZSA9IG47IHJlbmRlckFsbCgpOyB9CiAgfQogIGZ1bmN0aW9uIHNldENvbm5lY3RBbnNjaGx1c3MoaWQpIHsKICAgIGNvbnN0IHJ3ID0gcm93Rm9yKHN0YXRlKTsKICAgIGlmIChydyAmJiBydy5hbnNjaGx1ZXNzZSAmJiBydy5hbnNjaGx1ZXNzZVtpZF0pIHsgc3RhdGUuY29ubmVjdEFuc2NobHVzcyA9IGlkOyByZW5kZXJBbGwoKTsgfQogIH0KICBmdW5jdGlvbiBzZXRGbGFuc2NoKGlkKSB7IGlmIChmbGFuc2NoT2JqKGlkKSkgeyBzdGF0ZS5mbGFuc2NoID0gaWQ7IHJlbmRlckFsbCgpOyB9IH0KICAvLyBLbGFtbWVydHlwIHdlY2hzZWxuOiBEZXIgYmlzaGVyaWdlIFdlcmtzdG9mZiBibGVpYnQgbnVyIHN0ZWhlbiwgd2VubiBkZXIgbmV1ZSBUeXAgaWhuCiAgLy8genVsYWVzc3QgKEtMTEkgLT4gMS40NDA4LCBkYW5uIFdlY2hzZWwgYXVmIEtMMSwgZGFzIG51ciAxLjQzMDgga2FubikuIFNvbnN0IGZhZWxsdCBlcgogIC8vIGF1ZiBkZW4gZXJzdGVuIGVybGF1YnRlbiBXZXJrc3RvZmYgZGVzIFR5cHMgenVydWVjayAtIGtlaW4gdW5ndWVsdGlnZXMgUGFhciBpbSBTdGF0ZS4KICBmdW5jdGlvbiBzZXRLbGFtbWVyVHlwKGlkKSB7CiAgICBjb25zdCBrdCA9IGtsYW1tZXJUeXBPYmooaWQpOyBpZiAoIWt0KSByZXR1cm47CiAgICBzdGF0ZS5rbGFtbWVyVHlwID0gaWQ7CiAgICBpZiAoa3Qud2Vya3N0b2ZmZS5pbmRleE9mKHN0YXRlLmtsYW1tZXJXZXJrc3RvZmYpIDwgMCkgc3RhdGUua2xhbW1lcldlcmtzdG9mZiA9IGt0LndlcmtzdG9mZmVbMF07CiAgICByZW5kZXJBbGwoKTsKICB9CiAgLy8gTXV0dGVyLUFydCBkZXIgS2xhbW1lciAoUjItNCk6IE0gPSBNdXR0ZXIgKFN0YW5kYXJkKSwgUyA9IFNlY2hza2FudG11dHRlciAoQXVmcHJlaXMpLgogIGZ1bmN0aW9uIHNldEtsYW1tZXJNdXR0ZXIoaWQpIHsKICAgIGlmICghKEQua2xhbW1lck11dHRlcm4gfHwgW10pLnNvbWUobSA9PiBtLmlkID09PSBpZCkpIHJldHVybjsKICAgIHN0YXRlLmtsYW1tZXJNdXR0ZXIgPSBpZDsKICAgIHJlbmRlckFsbCgpOwogIH0KICAvKiBXZXJrc3RvZmYgc2V0emVuIChBYnNjaG5pdHQgRSk6IEJlaSBLbGFtbWVybiBnZWh0IGRlciBXZXJ0IGluIHN0YXRlLmtsYW1tZXJXZXJrc3RvZmYKICAgKiAoMS40MzA4LzEuNDQwOCksIGJlaSBhbGxlbiBhbmRlcmVuIFR5cGVuIGluIHN0YXRlLndlcmtzdG9mZiAoMS40NDA0LzEuNDQzNSkuIEJlaWRlCiAgICogRmVsZGVyIGJsZWliZW4gZ2V0cmVubnQgLSBzb25zdCB3dWVyZGUgZWluIEtsaWNrIGF1ZiBlaW5lbiBLbGFtbWVyLVdlcmtzdG9mZiBkZW4KICAgKiBGaXR0aW5nLVdlcmtzdG9mZiBtaXQgMS40MzA4IHVlYmVyc2NocmVpYmVuIChkb3J0IGdpYnQgZXMgZGVuIFdlcmtzdG9mZiBnYXIgbmljaHQpCiAgICogdW5kIGRlciBuYWVjaHN0ZSBGaXR0aW5nIHRyYWVnZSBlaW5lIFdlcmtzdG9mZm51bW1lciwgZGllIFdlaXNzIG5pZSBnZW5hbm50IGhhdC4KICAgKiBadXNhZXR6bGljaCBnZWdlbiBkaWUgamV3ZWlsaWdlIExpc3RlIGdlcHJ1ZWZ0LCBkYW1pdCBudXIgZWNodGUgV2VydGUgaW0gU3RhdGUgbGFuZGVuLiAqLwogIGZ1bmN0aW9uIHNldFdlcmtzdG9mZihpZCkgewogICAgY29uc3QgdCA9IHR5cE9iaihzdGF0ZS50eXApOwogICAgaWYgKGlzdEtsYW1tZXIodCkpIHsKICAgICAgaWYgKCEoRC5rbGFtbWVyV2Vya3N0b2ZmZSB8fCBbXSkuc29tZSh3ID0+IHcuaWQgPT09IGlkKSkgcmV0dXJuOwogICAgICBzdGF0ZS5rbGFtbWVyV2Vya3N0b2ZmID0gaWQ7CiAgICB9IGVsc2UgewogICAgICBpZiAoIShELndlcmtzdG9mZmUgfHwgW10pLnNvbWUodyA9PiB3LmlkID09PSBpZCkpIHJldHVybjsKICAgICAgc3RhdGUud2Vya3N0b2ZmID0gaWQ7CiAgICB9CiAgICByZW5kZXJBbGwoKTsKICB9CiAgZnVuY3Rpb24gc2V0T2JlcmZsYWVjaGUoaWQpIHsKICAgIGlmICghb2JlcmZsYWVjaGVuT3B0aW9uZW4oc3RhdGUpLnNvbWUobyA9PiBvLmlkID09PSBpZCkpIHJldHVybjsKICAgIHN0YXRlLm9iZXJmbGFlY2hlID0gaWQ7CiAgICByZW5kZXJBbGwoKTsKICB9CgogIC8qIC0tIFp1cnVlY2tzZXR6ZW4gKEE1LCBCZXJuZCBQa3QuIDgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAqIFN0ZWxsdCBkaWUgS29uZmlndXJhdGlvbiBhdWYgZGVuIFVyc3BydW5nc3p1c3RhbmQgenVydWVjazogU2Nocml0dCAxLCBrZWluZQogICAqIEF1c3dhaGwsIERlZmF1bHRzIC0gaW5rbHVzaXZlIFdhcmVua29yYi1Qb3NpdGlvbmVuIHVuZCBLb250YWt0ZGF0ZW4uCiAgICogWndlaS1LbGljay1CZXN0YWV0aWd1bmcgZGlyZWt0IGFtIEJ1dHRvbiAoTGFiZWwgd2VjaHNlbHQgYXVmICJXaXJrbGljaAogICAqIHp1cnVlY2tzZXR6ZW4\\\/IiwgZmFlbGx0IG5hY2ggNCBzIHp1cnVlY2spIHN0YXR0IHdpbmRvdy5jb25maXJtKCk6IERlcgogICAqIEtvbmZpZ3VyYXRvciBsYWV1ZnQgc3BhZXRlciBpbSBXb3JkUHJlc3MtaUZyYW1lLCB1bmQgZWluIHNhbmRib3hlZCBpRnJhbWUKICAgKiBvaG5lIGFsbG93LW1vZGFscyB2ZXJzY2hsdWNrdCBjb25maXJtKCkgLSBkZXIgQnV0dG9uIHd1ZXJkZSBkb3J0IHN0aWxsCiAgICogbmljaHRzIHR1bi4gRGFzIExhYmVsLVdlY2hzZWwtTXVzdGVyIGdpYnQgZXMgaGllciBzY2hvbiBiZWkgY29weVRleHQoKS4gKi8KICBsZXQgcmVzZXRUaW1lciA9IG51bGw7CiAgY29uc3QgcmVzZXRMYWJlbCA9IHR4dCA9PiBpYygncmVzZXQnLCAnaWMnKSArICcgJyArIHR4dDsKICBmdW5jdGlvbiBkaXNhcm1SZXNldChidG4pIHsKICAgIGNsZWFyVGltZW91dChyZXNldFRpbWVyKTsgcmVzZXRUaW1lciA9IG51bGw7CiAgICBpZiAoIWJ0bikgcmV0dXJuOwogICAgYnRuLmNsYXNzTGlzdC5yZW1vdmUoJ2FybWVkJyk7IGJ0bi5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtYXJtZWQnKTsKICAgIGJ0bi5pbm5lckhUTUwgPSByZXNldExhYmVsKCdadXLDvGNrc2V0emVuJyk7CiAgfQogIGZ1bmN0aW9uIGFybVJlc2V0KGJ0bikgewogICAgY2xlYXJUaW1lb3V0KHJlc2V0VGltZXIpOwogICAgYnRuLmNsYXNzTGlzdC5hZGQoJ2FybWVkJyk7IGJ0bi5zZXRBdHRyaWJ1dGUoJ2RhdGEtYXJtZWQnLCAnMScpOwogICAgYnRuLmlubmVySFRNTCA9IHJlc2V0TGFiZWwoJ1dpcmtsaWNoIHp1csO8Y2tzZXR6ZW4\\\/Jyk7CiAgICAvLyBOYWNoIDQgcyB3aWVkZXIgZW50c2NoYWVyZmVuLiBJc3QgZGVyIEJ1dHRvbiBiaXMgZGFoaW4gZHVyY2ggZWluIFJlLVJlbmRlcgogICAgLy8gZXJzZXR6dCB3b3JkZW4sIGxhZXVmdCBkYXMgWnVydWVja3NldHplbiBhdWYgZWluZW0gbG9zZ2Vsb2VzdGVuIEtub3RlbiAtCiAgICAvLyBoYXJtbG9zLCBkZXIgZnJpc2NoIGdlcmVuZGVydGUgQnV0dG9uIHN0YXJ0ZXQgb2huZWhpbiB1bnNjaGFyZi4KICAgIHJlc2V0VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IGRpc2FybVJlc2V0KGJ0biksIDQwMDApOwogIH0KICBmdW5jdGlvbiByZXNldEtvbmZpZ3VyYXRpb24oKSB7CiAgICBjbGVhclRpbWVvdXQocmVzZXRUaW1lcik7IHJlc2V0VGltZXIgPSBudWxsOwogICAgLy8gR2xlaWNoZSBTY2hsdWVzc2VsbWVuZ2Ugd2llIGRlciBVcnNwcnVuZyAtPiBPYmplY3QuYXNzaWduIGxhZXNzdCBuaWNodHMgc3RlaGVuLgogICAgLy8gSlNPTi5wYXJzZSBsaWVmZXJ0IGZyaXNjaGUgS29waWVuIHZvbiBrb250YWt0L25hY2h3ZWlzZS9wb3NpdGlvbmVuLCBkYW1pdCBkZXIKICAgIC8vIFVyc3BydW5ncy1TbmFwc2hvdCBuaWNodCB1ZWJlciBnZXRlaWx0ZSBSZWZlcmVuemVuIG1pdG11dGllcnQgd2lyZC4KICAgIE9iamVjdC5hc3NpZ24oc3RhdGUsIEpTT04ucGFyc2UoVVJTUFJVTkcpKTsKICAgIGlmIChmcy5vcGVuKSBmc0Nsb3NlKCk7ICAgICAgICAgIC8vIFZvbGxiaWxkIHplaWd0IHNvbnN0IGRpZSBaZWljaG51bmcgZGVzIGFsdGVuIFN0YW5kZXMKICAgIHByaWNlQ3VyID0gMDsgICAgICAgICAgICAgICAgICAgIC8vIFByZWlzLUFuaW1hdGlvbiBuaWNodCB2b20gYWx0ZW4gV2VydCBoZXJ1bnRlcnphZWhsZW4gbGFzc2VuCiAgICByZW5kZXJBbGwoKTsgICAgICAgICAgICAgICAgICAgICAvLyByZW5kZXJBbGwoKSBydWZ0IHJlcG9ydEhlaWdodCgpIGJlcmVpdHMgbWl0IGF1ZiAuLi4KICAgIHNjcm9sbFRvcCgpOwogICAgcmVwb3J0SGVpZ2h0KCk7ICAgICAgICAgICAgICAgICAgLy8gLi4uIGhpZXIgbm9jaG1hbCwgbmFjaGRlbSBkYXMgTGF5b3V0IGF1ZiBTY2hyaXR0IDEgc3RlaHQKICB9CgogIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSRU5ERVIgKi8KICBmdW5jdGlvbiByZW5kZXJBbGwoKSB7IHJlbmRlclByb2dyZXNzKCk7IHJlbmRlclBhbmVsKCk7IHJlbmRlclByZXZpZXcoKTsgcmVuZGVyTmF2KCk7IHJlcG9ydEhlaWdodCgpOyB9CgogIGZ1bmN0aW9uIHJlbmRlclByb2dyZXNzKCkgewogICAgY29uc3Qgd3JhcCA9ICQoJyN3ei1wcm9ncmVzcycpOwogICAgY29uc3Qga2xhbW1lciA9IGlzdEtsYW1tZXIodHlwT2JqKHN0YXRlLnR5cCkpOwogICAgd3JhcC5pbm5lckhUTUwgPSBTVEVQUy5maWx0ZXIocyA9PiBhcHBsaWNhYmxlKHMubikpLm1hcChzID0+IHsKICAgICAgY29uc3QgY2xzID0gcy5uID09PSBzdGF0ZS5zdGVwID8gJ2FjdGl2ZScgOiAoY29tcGxldGUocy5uKSAmJiBzLm4gPCBzdGF0ZS5zdGVwID8gJ2RvbmUnIDogJycpOwogICAgICBjb25zdCBjYW5DbGljayA9IHJlYWNoYWJsZShzLm4pOwogICAgICAvLyBSMi00OiBCZWkgZGVyIEtsYW1tZXIgZW50ZmFlbGx0IGRpZSBPYmVyZmxhZWNoZW4tV2FobCAtPiBTY2hyaXR0IDUgaGVpc3N0IG51ciAiV2Vya3N0b2ZmIi4KICAgICAgY29uc3QgbGFiZWwgPSAocy5uID09PSA1ICYmIGtsYW1tZXIpID8gJ1dlcmtzdG9mZicgOiBzLmxhYmVsOwogICAgICByZXR1cm4gYDxidXR0b24gY2xhc3M9InBzdGVwICR7Y2xzfSIgZGF0YS1hY3Q9ImdvdG8iIGRhdGEtbj0iJHtzLm59IiAke2NhbkNsaWNrID8gJycgOiAnZGlzYWJsZWQnfT4KICAgICAgICA8c3BhbiBjbGFzcz0ibnVtIj4ke2NvbXBsZXRlKHMubikgJiYgcy5uIDwgc3RhdGUuc3RlcCA\\\/IGljKCdjaGVjaycsICdpYycpIDogc3RlcFBvcyhzLm4pfTwvc3Bhbj4ke2VzYyhsYWJlbCl9PC9idXR0b24+YDsKICAgIH0pLmpvaW4oJycpOwogIH0KCiAgZnVuY3Rpb24gdGlsZShzZWwsIGFjdCwgaWQsIHRpdGxlLCBzdWIsIGJhZGdlLCBpY29uKSB7CiAgICByZXR1cm4gYDxidXR0b24gY2xhc3M9InRpbGUgJHtzZWwgPyAnc2VsJyA6ICcnfSIgZGF0YS1hY3Q9IiR7YWN0fSIgZGF0YS1pZD0iJHtpZH0iPgogICAgICAke2ljb24gPyBpYyhpY29uKSA6ICcnfQogICAgICA8c3BhbiBjbGFzcz0idCI+JHtlc2ModGl0bGUpfTwvc3Bhbj4KICAgICAgJHtzdWIgPyBgPHNwYW4gY2xhc3M9ImQiPiR7ZXNjKHN1Yil9PC9zcGFuPmAgOiAnJ30KICAgICAgJHtiYWRnZSA\\\/IGA8c3BhbiBjbGFzcz0iYmFkZ2UgJHtiYWRnZS5jbHN9Ij4ke2VzYyhiYWRnZS50eHQpfTwvc3Bhbj5gIDogJyd9CiAgICA8L2J1dHRvbj5gOwogIH0KICAvKiBLb3BmemVpbGUgamVkZXMgU2Nocml0dHMuIERlciBadXJ1ZWNrc2V0emVuLUJ1dHRvbiAoQTUpIGhhZW5ndCBiZXd1c3N0IGhpZXIKICAgKiBkcmluOiBoZWFkKCkgYmF1ZW4gQUxMRSBhY2h0IFNjaHJpdHRlLCBkYW1pdCBzaXR6dCBlciB1ZWJlcmFsbCBhbiBkZXJzZWxiZW4KICAgKiBTdGVsbGUgLSB1bmQgZGllIFJlaWhlIGRlciBTY2hyaXR0LVBpbGxlbiAoI3d6LXByb2dyZXNzKSBibGVpYnQgc2F1YmVyLgogICAqIFNvbGFuZ2UgbmljaHRzIGdld2FlaGx0IGlzdCAoPSBVcnNwcnVuZ3N6dXN0YW5kKSwgd2FlcmUgZXIgZWluIE5vLU9wIC0+IGRpc2FibGVkLiAqLwogIGZ1bmN0aW9uIGhlYWQoa2lja2VyLCB0aXRsZSwgZGVzYykgewogICAgY29uc3QgZnJpc2NoID0gaXN0VXJzcHJ1bmcoKTsKICAgIC8vIEtpY2tlci1OdW1tZXIgYXVmIGRpZSBsdWVja2xvc2UgQW56ZWlnZS1Qb3NpdGlvbiBkZXMgYWt0dWVsbGVuIFNjaHJpdHRzIHNldHplbgogICAgLy8gKHNvbnN0IHplaWd0IGRpZSBQaWxsZSAiNiIsIGRpZSBVZWJlcnNjaHJpZnQgYWJlciAiU2Nocml0dCA3IikuCiAgICBraWNrZXIgPSBTdHJpbmcoa2lja2VyKS5yZXBsYWNlKC9cZCsvLCBzdGVwUG9zKHN0YXRlLnN0ZXApKTsKICAgIHJldHVybiBgPGRpdiBjbGFzcz0ic3RlcC1oZWFkIj4KICAgICAgPGRpdiBjbGFzcz0ic3RlcC1oZWFkLXRvcCI+PGRpdiBjbGFzcz0ia2lja2VyIj4ke2VzYyhraWNrZXIpfTwvZGl2PgogICAgICAgIDxidXR0b24gY2xhc3M9InJlc2V0YnRuIiBkYXRhLWFjdD0icmVzZXQiICR7ZnJpc2NoID8gJ2Rpc2FibGVkJyA6ICcnfQogICAgICAgICAgdGl0bGU9IiR7ZnJpc2NoID8gJ0VzIGlzdCBub2NoIG5pY2h0cyBrb25maWd1cmllcnQuJyA6ICdLb25maWd1cmF0aW9uIGF1ZiBkZW4gVXJzcHJ1bmdzenVzdGFuZCB6dXLDvGNrc2V0emVuJ30iCiAgICAgICAgICA+JHtyZXNldExhYmVsKCdadXLDvGNrc2V0emVuJyl9PC9idXR0b24+PC9kaXY+CiAgICAgIDxoMj4ke2VzYyh0aXRsZSl9PC9oMj4ke2Rlc2MgPyBgPHA+JHtlc2MoZGVzYyl9PC9wPmAgOiAnJ308L2Rpdj5gOwogIH0KCiAgZnVuY3Rpb24gcmVuZGVyUGFuZWwoKSB7CiAgICBjb25zdCBwID0gJCgnI3d6LXBhbmVsJyk7IGxldCBoID0gJyc7CiAgICBzd2l0Y2ggKHN0YXRlLnN0ZXApIHsKICAgICAgY2FzZSAxOgogICAgICAgIGggPSBoZWFkKCdTY2hyaXR0IDEnLCAnV29mw7xyIHdpcmQgZGFzIEZpdHRpbmcgZWluZ2VzZXR6dD8nLCAnQXVzIGRlciBBbndlbmR1bmcgc2NobGFnZW4gd2lyIFdlcmtzdG9mZiwgT2JlcmZsw6RjaGUgdW5kIERpY2h0dW5nIHNpbm52b2xsIHZvci4gQW5wYXNzZW4ga2FubnN0IGR1IGFsbGVzIHNww6R0ZXIuJyk7CiAgICAgICAgaCArPSAnPGRpdiBjbGFzcz0idGlsZXMiPicgKyBELmFud2VuZHVuZ2VuLm1hcChhID0+IHRpbGUoc3RhdGUuYW53ZW5kdW5nID09PSBhLmlkLCAnYW53ZW5kdW5nJywgYS5pZCwgYS5sYWJlbCwgYS5zdWIsIG51bGwsIGEuaWQpKS5qb2luKCcnKSArICc8L2Rpdj4nOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDI6CiAgICAgICAgaCA9IGhlYWQoJ1NjaHJpdHQgMicsICdWZXJiaW5kdW5nc2FydCB3w6RobGVuJywgJ0Zpcm1hIFdlaXNzIGthbGt1bGllcnQgYmVpZGUgUHJvZHVrdGdydXBwZW4gaW5kaXZpZHVlbGwgYXVmIEFuZnJhZ2UuJyk7CiAgICAgICAgaCArPSAnPGRpdiBjbGFzcz0idGlsZXMiPicgKyBELm5vcm1lbi5tYXAobiA9PiB0aWxlKHN0YXRlLm5vcm0gPT09IG4uaWQsICdub3JtJywgbi5pZCwgbi5sYWJlbCArICcg4oCTICcgKyBuLnN1Yiwgbi5oaW53ZWlzLAogICAgICAgICAgbi5wcmVpc01vZHVzID09PSAnbGl2ZScgJiYgRC5wcmVpc2UuZnJlaWdlZ2ViZW4gPT09IHRydWUgPyB7IGNsczonbGl2ZScsIHR4dDonbWl0IGZyZWlnZWdlYmVuZW0gUHJlaXMnIH0gOiB7IGNsczonYW5mcmFnZScsIHR4dDonYXVmIEFuZnJhZ2UnIH0pKS5qb2luKCcnKSArICc8L2Rpdj4nOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDM6IHsKICAgICAgICBjb25zdCB0cyA9IEQudHlwZW4uZmlsdGVyKHQgPT4gdC5ub3JtID09PSBzdGF0ZS5ub3JtICYmIHQuYWt0aXYgJiYgIWlzVHlwZUJsb2NrZWQodCkpOwogICAgICAgIGggPSBoZWFkKCdTY2hyaXR0IDMnLCAnQmF1dGVpbCB3w6RobGVuJywgJ0FiIGhpZXIgd8OkY2hzdCBkaWUgWmVpY2hudW5nIHJlY2h0cyBsaXZlIG1pdCBkZWluZXIgQXVzd2FobC4nKTsKICAgICAgICAvLyBCYWRnZS1SZWloZW5mb2xnZTogbWFzc2VGb2xndCAoQ0YvQ0ZJIC0gZ2FyIGtlaW5lIE1hc3NlKSBnZWh0IHZvciBtYXNzZVBsYXR6aGFsdGVyCiAgICAgICAgLy8gKERJTiAxMTg2NSAtIE1hc3NlIGRhLCBhYmVyIG5vY2ggbmljaHQgV2Vpc3MtdmVyaWZpemllcnQpLiBEZXIgS3VuZGUgc2llaHQgYW0KICAgICAgICAvLyBCYXV0ZWlsIHNlbGJzdCwgd29yYW4gZXIgaXN0LCBiZXZvciBlciBoaW5laW5rbGlja3QuCiAgICAgICAgaCArPSAnPGRpdiBjbGFzcz0idGlsZXMiPicgKyB0cy5tYXAodCA9PiB0aWxlKHN0YXRlLnR5cCA9PT0gdC5pZCwgJ3R5cCcsIHQuaWQsIHQubGFiZWwsIHQuc3ViLAogICAgICAgICAgdC5tYXNzZUZvbGd0ID8geyBjbHM6J2FuZnJhZ2UnLCB0eHQ6J01hw59lIGZvbGdlbicgfQogICAgICAgICAgOiB0Lm1hc3NlUGxhdHpoYWx0ZXIgPyB7IGNsczonYW5mcmFnZScsIHR4dDonTWHDn2Ugdm9ybMOkdWZpZycgfSA6IG51bGwpKS5qb2luKCcnKSArICc8L2Rpdj4nOwogICAgICAgIC8vIFIzLTE6IE9yYml0YWxzY2h3ZWlzcy1IaW53ZWlzIGZ1ZXIgZGllIGdlc2Nod2Vpc3N0ZW4gRml0dGluZ3MuIEVyc2V0enQgZGVuIGZydWVoZXJlbgogICAgICAgIC8vICJPcmJpdGFsIGdlc2Nod2Vpw590Ii1VbnRlcnRpdGVsIGRlciBCb2VnZW4gKGpldHp0ICJGb3JtIEJMLTkwL0JMLTQ1IikgYW4gZWluZXIgU3RlbGxlCiAgICAgICAgLy8gZnVlciBkaWUgZ2FuemUgRElOLTExODY1LUZhbWlsaWUuCiAgICAgICAgaWYgKHN0YXRlLm5vcm0gPT09ICdkaW4xMTg2NScpIGggKz0gYDxkaXYgY2xhc3M9Im5vdGUtcGxoIj4ke2ljKCdpbmZvJyl9PHNwYW4+QWxsZSBESU4tMTE4NjUtRml0dGluZ3MgZsO8ciBPcmJpdGFsc2Nod2Vpw591bmcuPC9zcGFuPjwvZGl2PmA7CiAgICAgICAgaWYgKHN0YXRlLm5vcm0gPT09ICdkaW4xMTg2NScgJiYgRC5tYXNzZS5kaW4xMTg2NS50U3R1ZWNrUmVkdXppZXJ0LnN0YXR1cyA9PT0gJ2Jsb2NraWVydCcpIHsKICAgICAgICAgIGggKz0gYDxkaXYgY2xhc3M9Im5vdGUtcGxoIj4ke2ljKCdpbmZvJyl9PHNwYW4+UmVkdXppZXJ0ZSBULVN0w7xja2UgYmxlaWJlbiBhdXNnZWJsZW5kZXQsIGJpcyBGaXJtYSBXZWlzcyBkaWUgZmVobGVuZGVuIEdyw7bDn2Vua29tYmluYXRpb25lbiB1bmQgTWHDn2UgbGllZmVydC48L3NwYW4+PC9kaXY+YDsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgY2FzZSA0OiBoID0gcmVuZGVyU3RlcDQoKTsgYnJlYWs7CiAgICAgIGNhc2UgNTogewogICAgICAgIC8vIFdlcmtzdG9mZmxpc3RlIGlzdCB0eXBhYmhhZW5naWc6IEtsYW1tZXJuIGhhYmVuIGVpZ2VuZSBXZXJrc3RvZmZlICgxLjQzMDgvMS40NDA4LAogICAgICAgIC8vIEFic2Nobml0dCBFKSwgZ2VmaWx0ZXJ0IG5hY2ggZGVtIGdld2FlaGx0ZW4gS2xhbW1lcnR5cC4gQWxsZXMgYW5kZXJlOiAxLjQ0MDQvMS40NDM1LgogICAgICAgIGNvbnN0IHdMaXN0ZSA9IHdlcmtzdG9mZk9wdGlvbmVuKHN0YXRlKSwgd1NlbCA9IGVmZldlcmtzdG9mZihzdGF0ZSksIGtsYW1tZXIgPSBpc3RLbGFtbWVyKHR5cE9iaihzdGF0ZS50eXApKTsKICAgICAgICAvLyBSMi00OiBEaWUgS2xhbW1lciBoYXQgS0VJTkUgT2JlcmZsYWVjaGVuLVdhaGwgLT4gU2Nocml0dCA1IHplaWd0IGJlaSBpaHIgbnVyIGRlbgogICAgICAgIC8vIFdlcmtzdG9mZiAoMS40MzA4LzEuNDQwOCkgdW5kIGRlciBUaXRlbC9VbnRlcnRpdGVsIHNwYXJ0IGRpZSBPYmVyZmxhZWNoZSBhdXMuCiAgICAgICAgaCA9IGhlYWQoJ1NjaHJpdHQgNScsIGtsYW1tZXIgPyAnV2Vya3N0b2ZmJyA6ICdXZXJrc3RvZmYgJiBPYmVyZmzDpGNoZScsIGtsYW1tZXIKICAgICAgICAgID8gJ0tsYW1tZXJuIHdlcmRlbiBhdXMgYW5kZXJlbiBXZXJrc3RvZmZlbiBnZWZlcnRpZ3QgYWxzIGRpZSBGaXR0aW5ncyDigJMgd8OkaGxiYXIgaXN0LCB3YXMgZGVyIEtsYW1tZXJ0eXAgenVsw6Rzc3QuIEVpbmUgT2JlcmZsw6RjaGVua2xhc3NlIHdpcmQgYmVpIEtsYW1tZXJuIG5pY2h0IGdld8OkaGx0LicKICAgICAgICAgIDogJ0JlaWRlIHNpbmQgYXVzIGRlciBBbndlbmR1bmcgdm9yYmVsZWd0LicpOwogICAgICAgIGggKz0gJzxzcGFuIGNsYXNzPSJmaWVsZC1sYWJlbCI+V2Vya3N0b2ZmPC9zcGFuPjxkaXYgY2xhc3M9Im9wdHMiPicgKyB3TGlzdGUubWFwKHcgPT4gewogICAgICAgICAgLy8gc3ViL2hpbndlaXMgc2luZCBiZWkgZGVuIEtsYW1tZXItV2Vya3N0b2ZmZW4gYmV3dXNzdCBsZWVyIChXZWlzcyBoYXQgZGF6dSBuaWNodHMKICAgICAgICAgIC8vIGdlbGllZmVydCkgLT4gbnVyIGF1c2dlYmVuLCB3YXMgd2lya2xpY2ggZGEgaXN0LiBOaWNodHMgZGF6dWVyZmluZGVuLgogICAgICAgICAgY29uc3QgZCA9IFt3LnN1Yiwgdy5oaW53ZWlzXS5maWx0ZXIoQm9vbGVhbikuam9pbignIMK3ICcpOwogICAgICAgICAgcmV0dXJuIGA8YnV0dG9uIGNsYXNzPSJvcHQgJHt3U2VsID09PSB3LmlkID8gJ3NlbCcgOiAnJ30iIGRhdGEtYWN0PSJ3ZXJrc3RvZmYiIGRhdGEtaWQ9IiR7dy5pZH0iPgogICAgICAgICAgICAgPHNwYW4gY2xhc3M9InQiPiR7ZXNjKHcubGFiZWwpfTwvc3Bhbj4ke2QgPyBgPHNwYW4gY2xhc3M9ImQiPiR7ZXNjKGQpfTwvc3Bhbj5gIDogJyd9PC9idXR0b24+YDsKICAgICAgICB9KS5qb2luKCcnKSArICc8L2Rpdj4nOwogICAgICAgIGlmIChrbGFtbWVyKSB7CiAgICAgICAgICBjb25zdCBrdCA9IGtsYW1tZXJUeXBPYmooc3RhdGUua2xhbW1lclR5cCk7CiAgICAgICAgICBpZiAoa3QgJiYga3Qud2Vya3N0b2ZmZS5sZW5ndGggPT09IDEpIGggKz0gYDxkaXYgY2xhc3M9Im5vdGUtcGxoIj4ke2ljKCdpbmZvJyl9PHNwYW4+JHtlc2Moa3QubGFiZWwpfSAoJHtlc2Moa3Quc3ViKX0pIHdpcmQgaW4gJHtlc2Moa3Qud2Vya3N0b2ZmZVswXSl9IGdlZmVydGlndC48L3NwYW4+PC9kaXY+YDsKICAgICAgICB9CiAgICAgICAgLy8gT2JlcmZsYWVjaGVuLUJsb2NrIG51ciBmdWVyIE5JQ0hULUtsYW1tZXItVHlwZW4gKFIyLTQpLgogICAgICAgIGlmICgha2xhbW1lcikgewogICAgICAgICAgY29uc3Qgb0xpc3RlID0gb2JlcmZsYWVjaGVuT3B0aW9uZW4oc3RhdGUpOwogICAgICAgICAgY29uc3QgZW1wZiA9IChzdGF0ZS5vYmVyZmxhZWNoZSA9PT0gJ0g0bycpID8gJzEuNDQzNScgOiBudWxsOwogICAgICAgICAgaCArPSAnPHNwYW4gY2xhc3M9ImZpZWxkLWxhYmVsIj5PYmVyZmzDpGNoZSAoRElOIDExODY2KTwvc3Bhbj48ZGl2IGNsYXNzPSJvcHRzIj4nICsgb0xpc3RlLm1hcChvID0+CiAgICAgICAgICAgIGA8YnV0dG9uIGNsYXNzPSJvcHQgJHtzdGF0ZS5vYmVyZmxhZWNoZSA9PT0gby5pZCA\\\/ICdzZWwnIDogJyd9IiBkYXRhLWFjdD0ib2JlcmZsYWVjaGUiIGRhdGEtaWQ9IiR7by5pZH0iPgogICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0idCI+JHtlc2Moby5sYWJlbCl9PC9zcGFuPjxzcGFuIGNsYXNzPSJkIj4ke2VzYyhvLnN1Yil9IMK3ICR7ZXNjKG8udmVyZmFocmVuKX08L3NwYW4+PC9idXR0b24+YCkuam9pbignJykgKyAnPC9kaXY+JzsKICAgICAgICAgIGlmIChlbXBmICYmIHN0YXRlLndlcmtzdG9mZiAhPT0gZW1wZikgaCArPSBgPGRpdiBjbGFzcz0ibm90ZS1wbGgiPiR7aWMoJ2luZm8nKX08c3Bhbj5Gw7xyIEg0byAoZWxla3Ryb3BvbGllcnQpIGVtcGZlaGxlbiB3aXIgV2Vya3N0b2ZmIDEuNDQzNS48L3NwYW4+PC9kaXY+YDsKICAgICAgICAgIGlmIChpc0Nvbm5lY3QodHlwT2JqKHN0YXRlLnR5cCkpKSBoICs9IGA8ZGl2IGNsYXNzPSJub3RlLW9rIj4ke2ljKCdjaGVjaycsICdpYycpfTxzcGFuPkRpZSBBdXN3YWhsIGlzdCBhdWYgZGllIGluIGRlbiBnZXByw7xmdGVuIERhdGVuYmzDpHR0ZXJuIGJlbGVndGVuIE9iZXJmbMOkY2hlbiBlaW5nZXNjaHLDpG5rdC48L3NwYW4+PC9kaXY+YDsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgY2FzZSA2OiB7CiAgICAgICAgY29uc3Qgc3AgPSBzcGVyckRpY2h0dW5nZW4oKTsKICAgICAgICAvLyBEZXIgS29uZm9ybWl0YWV0cy1adXNhdHogZm9sZ3Qgc2VpdCBkZW0gMTEuMDguMjAyNiBkZXIgQW53ZW5kdW5nIGF1cyBTY2hyaXR0IDEKICAgICAgICAvLyAoQmVybmQ6IFBoYXJtYS9TdGVyaWx0ZWNobmlrIC0+IFVTUCBDbGFzcyBWSSwgTGViZW5zbWl0dGVsL0NoZW1pZSAtPiBFRyAxOTM1LzIwMDQpLgogICAgICAgIC8vIFZvcmhlciBzdGFuZCBoaWVyIGZ1ZXIgYWxsZSB2aWVyIEFud2VuZHVuZ2VuIHBhdXNjaGFsICJGREEvVVNQLWtvbmZvcm0iLgogICAgICAgIGNvbnN0IGZkYUsgPSBmZGFLdXJ6VGV4dCgpOwogICAgICAgIGggPSBoZWFkKCdTY2hyaXR0IDYnLCAnRGljaHR1bmcgd8OkaGxlbicsICdEaWUgRGljaHR1bmdzZmFyYmUgZXJzY2hlaW50IGRpcmVrdCBpbiBkZXIgWmVpY2hudW5nLiBBbGxlIFN0YW5kYXJkZGljaHR1bmdlbiB2b24gRmlybWEgV2Vpc3Mgc2luZCAnCiAgICAgICAgICArIChmZGFLID8gJ0ZEQS0gdW5kICcgKyBmZGFLICsgJy1rb25mb3JtLicgOiAnRkRBLWtvbmZvcm0uJykpOwogICAgICAgIGggKz0gJzxkaXYgY2xhc3M9Im9wdHMiPicgKyBELmRpY2h0dW5nZW4ubWFwKGQgPT4gewogICAgICAgICAgY29uc3QgZGlzID0gc3AuaGFzKGQuaWQpOwogICAgICAgICAgcmV0dXJuIGA8YnV0dG9uIGNsYXNzPSJvcHQgJHtzdGF0ZS5kaWNodHVuZyA9PT0gZC5pZCA\\\/ICdzZWwnIDogJyd9ICR7ZGlzID8gJ2Rpc2FibGVkJyA6ICcnfSIgZGF0YS1hY3Q9ImRpY2h0dW5nIiBkYXRhLWlkPSIke2QuaWR9IiAke2RpcyA\\\/ICdkaXNhYmxlZCcgOiAnJ30+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0Ij48c3BhbiBzdHlsZT0id2lkdGg6MTJweDtoZWlnaHQ6MTJweDtib3JkZXItcmFkaXVzOjNweDtib3JkZXI6MXB4IHNvbGlkICMxYzFjMWM7YmFja2dyb3VuZDoke2QuZmFyYmV9Ij48L3NwYW4+JHtlc2MoZC5sYWJlbCl9JHtkaXMgPyAnPHNwYW4gY2xhc3M9ImxvY2siPmdlc3BlcnJ0PC9zcGFuPicgOiAnJ308L3NwYW4+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJkIj4ke2VzYyhkLnN1Yil9JHtkLmZkYSA9PT0gdHJ1ZSA\\\/ICcgwrcgRkRBJyA6ICcnfSR7KGQudXNwVkkgPT09IHRydWUgJiYgZmRhSykgPyAnIMK3ICcgKyBlc2MoZmRhSykgOiAnJ308L3NwYW4+PC9idXR0b24+YDsKICAgICAgICB9KS5qb2luKCcnKSArICc8L2Rpdj4nOwogICAgICAgIGNvbnN0IGF2TCA9IGF1c2Z1ZWhydW5nQXZhaWwoc3RhdGUpOwogICAgICAgIGggKz0gJzxzcGFuIGNsYXNzPSJmaWVsZC1sYWJlbCI+QXVzZsO8aHJ1bmc8L3NwYW4+PGRpdiBjbGFzcz0ic2VnIj4nICsKICAgICAgICAgIEQuZGljaHR1bmdBdXNmdWVocnVuZy5maWx0ZXIoYSA9PiBhdkwuaW5kZXhPZihhLmlkKSA+PSAwKS5tYXAoYSA9PiBgPGJ1dHRvbiBjbGFzcz0iJHtlZmZMaXBwZShzdGF0ZSkgPT09IGEuaWQgPyAnc2VsJyA6ICcnfSIgZGF0YS1hY3Q9ImxpcHBlIiBkYXRhLWlkPSIke2EuaWR9Ij4ke2VzYyhhLmxhYmVsKX08L2J1dHRvbj5gKS5qb2luKCcnKSArICc8L2Rpdj4nOwogICAgICAgIGggKz0gYDxkaXYgY2xhc3M9Im5vdGUtb2siPiR7aWMoJ2NoZWNrJywgJ2ljJyl9PHNwYW4+JHtlc2MoZmRhVGV4dCgpKX0gKFN0YW5kYXJkKSDigJQgYmVpIGFsbGVuIFN0YW5kYXJkZGljaHR1bmdlbiB2b24gRmlybWEgV2Vpc3MgaW5rbHVzaXZlLjwvc3Bhbj48L2Rpdj5gOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGNhc2UgNzogaCA9IHJlbmRlclN0ZXA3KCk7IGJyZWFrOwogICAgICBjYXNlIDg6IGggPSByZW5kZXJTdGVwOCgpOyBicmVhazsKICAgIH0KICAgIHAuaW5uZXJIVE1MID0gaDsKICAgIGlmIChzdGF0ZS5zdGVwID09PSA4KSBiaW5kRm9ybSgpOwogIH0KCiAgLyogU2Nocml0dCA0IGZ1ZXIgQmxpbmRkZWNrZWwgKyBLbGFtbWVyIChBYnNjaG5pdHQgRCk6IEtFSU4gUmVpaGVuLVVtc2NoYWx0ZXIuCiAgICogQmVybmQ6ICJtZXRyaXNjaCBETiwgSVNPL09EIHVuZCBab2xsIGthbm5zdCBkdSBpZ25vcmllcmVuLiBFaW5mYWNoIG5hY2ggZGVyCiAgICogRmxhbnNjaGdyb2Vzc2UgYXVmbGlzdGVuLiIgLT4gbnVyIGVpbmUgTGlzdGUgbWl0IGRlbiAxOCBGbGFuc2NoLcOYLgogICAqIEZ1ZXIgZGllIEdyb2Vzc2VuIG9obmUgaGludGVybGVndGUgTWFzc2UgKDE0NCw1IC8gMjE3LDUgLyAyNjggLyAyODYsMSAvIDMxOSkKICAgKiB3aXJkIGF1c3NjaGxpZXNzbGljaCBkZXIgRmxhbnNjaC3DmCBnZWZ1ZWhydCwgYWxsZXMgYW5kZXJlIHN0ZWh0IGF1ZiAiZm9sZ3QiLiAqLwogIGZ1bmN0aW9uIHJlbmRlclN0ZXA0RmxhbnNjaCh0KSB7CiAgICBjb25zdCBmID0gZmxhbnNjaEZvcihzdGF0ZSk7CiAgICBsZXQgaCA9IGhlYWQoJ1NjaHJpdHQgNCcsICdGbGFuc2NoZ3LDtsOfZSB3w6RobGVuJywKICAgICAgdC5sYWJlbCArICcgd2lyZCBudXIgbmFjaCBkZW0gRmxhbnNjaC3DmCB1bnRlcnNjaGllZGVuIOKAkyBSZWloZSAobWV0cmlzY2ggRE4gLyBJU08gLyBab2xsKSBzcGllbHQgaGllciBrZWluZSBSb2xsZS4nKTsKICAgIGlmIChpc3RLbGFtbWVyKHQpKSB7CiAgICAgIGggKz0gJzxzcGFuIGNsYXNzPSJmaWVsZC1sYWJlbCI+S2xhbW1lcnR5cDwvc3Bhbj48ZGl2IGNsYXNzPSJvcHRzIj4nICsgKEQua2xhbW1lclR5cGVuIHx8IFtdKS5tYXAoayA9PgogICAgICAgIGA8YnV0dG9uIGNsYXNzPSJvcHQgJHtzdGF0ZS5rbGFtbWVyVHlwID09PSBrLmlkID8gJ3NlbCcgOiAnJ30iIGRhdGEtYWN0PSJrbGFtbWVydHlwIiBkYXRhLWlkPSIke2suaWR9Ij4KICAgICAgICAgICA8c3BhbiBjbGFzcz0idCI+JHtlc2Moay5sYWJlbCl9PC9zcGFuPjxzcGFuIGNsYXNzPSJkIj4ke2VzYyhrLnN1Yil9IMK3IFdlcmtzdG9mZiAke2VzYyhrLndlcmtzdG9mZmUuam9pbignIG9kZXIgJykpfTwvc3Bhbj48L2J1dHRvbj5gKS5qb2luKCcnKSArICc8L2Rpdj4nOwogICAgICAvLyBNdXR0ZXItQXJ0IChSMi00KTogTXV0dGVyID0gU3RhbmRhcmQsIFNlY2hza2FudG11dHRlciBnZWdlbiBBdWZwcmVpcy4gRGVmYXVsdCA9IE0uCiAgICAgIGlmICgoRC5rbGFtbWVyTXV0dGVybiB8fCBbXSkubGVuZ3RoKSB7CiAgICAgICAgaCArPSAnPHNwYW4gY2xhc3M9ImZpZWxkLWxhYmVsIj5NdXR0ZXI8L3NwYW4+PGRpdiBjbGFzcz0ic2VnIj4nICsgRC5rbGFtbWVyTXV0dGVybi5tYXAobSA9PgogICAgICAgICAgYDxidXR0b24gY2xhc3M9IiR7c3RhdGUua2xhbW1lck11dHRlciA9PT0gbS5pZCA\\\/ICdzZWwnIDogJyd9IiBkYXRhLWFjdD0ia2xhbW1lcm11dHRlciIgZGF0YS1pZD0iJHttLmlkfSI+JHtlc2MobS5sYWJlbCl9PC9idXR0b24+YCkuam9pbignJykgKyAnPC9kaXY+JzsKICAgICAgICBpZiAoRC5rbGFtbWVyTXV0dGVySGlud2VpcykgaCArPSBgPGRpdiBjbGFzcz0ibm90ZS1wbGgiPiR7aWMoJ2luZm8nKX08c3Bhbj4ke2VzYyhELmtsYW1tZXJNdXR0ZXJIaW53ZWlzKX08L3NwYW4+PC9kaXY+YDsKICAgICAgfQogICAgfQogICAgLy8gRGVyIFp1c2F0eiBoYWVuZ3QgYW0gQmF1dGVpbCAoZmxhbnNjaE1hc3NPZmZlbiksIE5JQ0hUIG1laHIgYW4gYmxpbmRUaGs6IGZ1ZXIgZGVuCiAgICAvLyBCbGluZGRlY2tlbCBpc3QgaW56d2lzY2hlbiBqZWRlIEdyb2Vzc2UgYmVtYXNzdCwgYmVpIGRlciBLbGFtbWVyIGJsZWliZW4gMjg2LDEgLwogICAgLy8gMzE5IC8gMzM4IGxhdXQgQmVybmQgIkF1ZiBBbmZyYWdlIiAtIGRlciBIaW53ZWlzIG11c3MgZG9ydCBzdGVoZW5ibGVpYmVuLgogICAgaCArPSBgPHNwYW4gY2xhc3M9ImZpZWxkLWxhYmVsIj5GbGFuc2NoLeKMgDwvc3Bhbj4KICAgICAgPGRpdiBjbGFzcz0ic2VsZWN0LXdyYXAiPjxzZWxlY3QgY2xhc3M9InN6IiBpZD0id3otZmxhbnNjaCIgZGF0YS1yb2xlPSJmbGFuc2NoIj4keyhELmZsYW5zY2hncm9lc3NlbiB8fCBbXSkubWFwKHggPT4KICAgICAgICBgPG9wdGlvbiB2YWx1ZT0iJHt4LmlkfSIgJHtzdGF0ZS5mbGFuc2NoID09PSB4LmlkID8gJ3NlbGVjdGVkJyA6ICcnfT7ijIAgJHtlc2MoeC5sYWJlbCl9IG1tJHtmbGFuc2NoTWFzc09mZmVuKHQsIHgsIHN0YXRlLmtsYW1tZXJUeXApID8gJyDCtyB3ZWl0ZXJlIE1hw59lIGZvbGdlbicgOiAnJ308L29wdGlvbj5gKS5qb2luKCcnKX08L3NlbGVjdD48L2Rpdj5gOwogICAgaWYgKGZsYW5zY2hNYXNzT2ZmZW4odCwgZiwgc3RhdGUua2xhbW1lclR5cCkpIHsKICAgICAgaCArPSBgPGRpdiBjbGFzcz0ibm90ZS1wbGgiPiR7aWMoJ2luZm8nKX08c3Bhbj4ke2lzdEtsYW1tZXIodCkKICAgICAgICA\\\/ICdGw7xyIEZsYW5zY2gt4oyAICcgKyBlc2MoZi5sYWJlbCkgKyAnIG1tIGlzdCBkaWUgS2xhbW1lciBub2NoIG5pY2h0IGJlbWHDn3Qg4oCTIGRhcyBNYcOfIEEgYmxlaWJ0IGhpZXIgYXVmIEFuZnJhZ2UuIEFuZnJhZ2VuIGzDpHNzdCBzaWNoIGRpZSBHcsO2w59lIHRyb3R6ZGVtLicKICAgICAgICA6ICdGw7xyIEZsYW5zY2gt4oyAICcgKyBlc2MoZi5sYWJlbCkgKyAnIG1tIGxpZWd0IHVucyBiaXNoZXIgbnVyIGRlciBGbGFuc2NoLUR1cmNobWVzc2VyIHZvci4gRGllIMO8YnJpZ2VuIE1hw59lIHJlaWNodCBGaXJtYSBXZWlzcyBuYWNoIOKAkyBhbmJpZXRlbiBsw6Rzc3Qgc2ljaCBkaWUgR3LDtsOfZSB0cm90emRlbS4nfTwvc3Bhbj48L2Rpdj5gOwogICAgfQogICAgaCArPSBgPGJ1dHRvbiBjbGFzcz0ibGlua2J0biIgZGF0YS1hY3Q9InNvbmRlciI+JHtpYygncGx1cycsICdpYycpfSBTb25kZXJhYm1lc3N1bmcgYW5mcmFnZW48L2J1dHRvbj5gOwogICAgcmV0dXJuIGg7CiAgfQoKICAvKiBTY2hyaXR0IDQgZnVlciBUeXBlbiBvaG5lIGJlbGVndGUgTWFzc3F1ZWxsZSAoQ0YvQ0ZJLCBBYnNjaG5pdHQgRykuCiAgICogQmV3dXNzdCBLRUlORSBSZWloZW4tL0dyb2Vzc2VuYXVzd2FobDogRGllIExpc3RlIGhhZXR0ZSBudXIgZGllIGR1ZW5ud2FuZGlnZW4KICAgKiBESU4tMzI2NzYtTWFzc2UgYW56dWJpZXRlbiwgZGllIGZ1ZXIgQ0YvQ0ZJIG5pY2h0IGJlbGVndCBzaW5kLiBMaWViZXIgZWluZSBlaHJsaWNoZQogICAqIEx1ZWNrZSBhbHMgZWluZSBmYWxzY2hlIEdyb2Vzc2UgLSBkZXIgS3VuZGUga2FubiBzZWluZSBXdW5zY2hncm9lc3NlIGltIEZyZWl0ZXh0CiAgICogKCJTb25kZXJhYm1lc3N1bmcgYW5mcmFnZW4iKSBtaXRnZWJlbiwgV2Vpc3Mga2xhZXJ0IHNpZSBtaXQgZGVtIERhdGVuYmxhdHQuICovCiAgZnVuY3Rpb24gcmVuZGVyU3RlcDRNYXNzZUZvbGd0KHQpIHsKICAgIGxldCBoID0gaGVhZCgnU2Nocml0dCA0JywgJ01hw59lIGZvbGdlbicsCiAgICAgICdGw7xyICcgKyB0LmxhYmVsICsgJyBsaWVnZW4gdW5zIG5vY2gga2VpbmUgZnJlaWdlZ2ViZW5lbiBNYcOfZSB2b3IuJyk7CiAgICBoICs9IGA8ZGl2IGNsYXNzPSJub3RlLXBsaCI+JHtpYygnaW5mbycpfTxzcGFuPlNvYmFsZCB1bnMgZGFzIHBhc3NlbmRlIERhdGVuYmxhdHQgdm9uIEZpcm1hIFdlaXNzIHZvcmxpZWd0LAogICAgICBrYW5uc3QgZHUgaGllciBkaWUgR3LDtsOfZSB3w6RobGVuIHVuZCBkaWUgWmVpY2hudW5nIGJhdXQgc2ljaCBhdWYuIEJpcyBkYWhpbiB6ZWlnZW4gd2lyIGJld3Vzc3QKICAgICAgd2VkZXIgTWHDn2Ugbm9jaCBlaW5lbiBSaWNodHByZWlzIOKAkyBsaWViZXIgZWluZSBMw7xja2UgYWxzIGVpbmUgZ2VzY2jDpHR6dGUgWmFobC4KICAgICAgV2Vya3N0b2ZmLCBPYmVyZmzDpGNoZSB1bmQgRGljaHR1bmcga2FubnN0IGR1IHRyb3R6ZGVtIHNjaG9uIGZlc3RsZWdlbjsgZGVpbmUgQW5mcmFnZSBnZWh0CiAgICAgIG1pdCBkaWVzZW4gQW5nYWJlbiByYXVzIHVuZCBGaXJtYSBXZWlzcyBtZWxkZXQgc2ljaCBtaXQgZGVuIE1hw59lbi48L3NwYW4+PC9kaXY+YDsKICAgIGggKz0gYDxidXR0b24gY2xhc3M9ImxpbmtidG4iIGRhdGEtYWN0PSJzb25kZXIiPiR7aWMoJ3BsdXMnLCAnaWMnKX0gV3Vuc2NobWHDnyAvIFNvbmRlcmFibWVzc3VuZyBhbmZyYWdlbjwvYnV0dG9uPmA7CiAgICByZXR1cm4gaDsKICB9CgogIGZ1bmN0aW9uIHJlbmRlclN0ZXA0Q29ubmVjdCh0KSB7CiAgICBjb25zdCBydyA9IHJvd0ZvcihzdGF0ZSk7CiAgICAvLyBCZXJuZCAyNy4wNy4yMDI2OiBrZWluZSBIZXJzdGVsbGVyYmV6ZWljaG51bmdlbiBtZWhyIGltIFRleHQgLSBudXIgbm9jaAogICAgLy8gZGllIG5ldXRyYWxlbiBLdWVyemVsIENGIHVuZCBDRkkuCiAgICBsZXQgaCA9IGhlYWQoJ1NjaHJpdHQgNCcsIHQuaWQgPT09ICdDRicgPyAnQ29ubmVjdC1NYcOfZSBmZXN0bGVnZW4nIDogJ0Nvbm5lY3QtSW5saW5lLU1hw59lIGZlc3RsZWdlbicsCiAgICAgIHQuaWQgPT09ICdDRicKICAgICAgICA\\\/ICdSb2hyc3RhbmRhcmQsIEdyw7bDn2UgdW5kIEVpbmJhdWzDpG5nZSBiZXN0aW1tZW4gZGllIEdlb21ldHJpZS4gRGllIFplaWNobnVuZyB1bmQgZGllIE1hw59rZXR0ZW4gd2FjaHNlbiBsaXZlIG1pdC4nCiAgICAgICAgOiAnUm9ocmFuc2NobHVzcyB1bmQgUm9ocmdyw7bDn2UgYmVzdGltbWVuIGRpZSBHZW9tZXRyaWUuIERpZSBaZWljaG51bmcgdW5kIGRpZSBNYcOfa2V0dGVuIHdhY2hzZW4gbGl2ZSBtaXQuJyk7CiAgICBpZiAodC5pZCA9PT0gJ0NGJykgewogICAgICBoICs9ICc8c3BhbiBjbGFzcz0iZmllbGQtbGFiZWwiPlJvaHJzdGFuZGFyZDwvc3Bhbj48ZGl2IGNsYXNzPSJzZWciPicgKwogICAgICAgIE9iamVjdC5lbnRyaWVzKEQubWFzc2UuY29ubmVjdC5jZi5yZWloZW4pLm1hcCgoW2lkLCBncnVwcGVdKSA9PgogICAgICAgICAgYDxidXR0b24gY2xhc3M9IiR7c3RhdGUuY29ubmVjdE5vcm0gPT09IGlkID8gJ3NlbCcgOiAnJ30iIGRhdGEtYWN0PSJjb25uZWN0bm9ybSIgZGF0YS1pZD0iJHtpZH0iPiR7ZXNjKGdydXBwZS5sYWJlbCl9PC9idXR0b24+YCkuam9pbignJykgKyAnPC9kaXY+JzsKICAgICAgY29uc3QgcnMgPSByb3dzRm9yKHN0YXRlKTsKICAgICAgaCArPSBgPHNwYW4gY2xhc3M9ImZpZWxkLWxhYmVsIj5HcsO2w59lPC9zcGFuPjxkaXYgY2xhc3M9InNlbGVjdC13cmFwIj48c2VsZWN0IGNsYXNzPSJzeiIgZGF0YS1yb2xlPSJzaXplIj4ke3JzLm1hcChyID0+CiAgICAgICAgYDxvcHRpb24gdmFsdWU9IiR7ZXNjKHIuaWQpfSIgJHtzdGF0ZS5ncm9lc3NlID09PSByLmlkID8gJ3NlbGVjdGVkJyA6ICcnfT4ke2VzYyhsYmwocikpfSDCtyBEZSAke2ZtdE1NKHIuRGUpfSDCtyBEZiAke2ZtdE1NKHIuRGYpfSDCtyBEaSAke2ZtdE1NKHIuRGkpfSBtbTwvb3B0aW9uPmApLmpvaW4oJycpfTwvc2VsZWN0PjwvZGl2PmA7CiAgICAgIGlmIChydykgewogICAgICAgIGggKz0gJzxzcGFuIGNsYXNzPSJmaWVsZC1sYWJlbCI+RWluYmF1bMOkbmdlIEw8L3NwYW4+PGRpdiBjbGFzcz0ic2VnIj4nICsgcncubGFlbmdlbi5tYXAoeCA9PgogICAgICAgICAgYDxidXR0b24gY2xhc3M9IiR7TnVtYmVyKHN0YXRlLmNvbm5lY3RMYWVuZ2UpID09PSBOdW1iZXIoeC5MKSA\\\/ICdzZWwnIDogJyd9IiBkYXRhLWFjdD0iY29ubmVjdGxhZW5nZSIgZGF0YS1pZD0iJHt4Lkx9Ij4ke2ZtdE1NKHguTCl9IG1tPC9idXR0b24+YCkuam9pbignJykgKyAnPC9kaXY+JzsKICAgICAgICBoICs9IGA8ZGl2IGNsYXNzPSJwdi1jaGlwcyI+PHNwYW4gY2xhc3M9ImNoaXAiPjxiPlR5cDwvYj4ke2VzYyh0LmlkKX08L3NwYW4+PHNwYW4gY2xhc3M9ImNoaXAiPjxiPkRlPC9iPiR7Zm10TU0ocncuRGUpfSBtbTwvc3Bhbj48c3BhbiBjbGFzcz0iY2hpcCI+PGI+RGY8L2I+JHtmbXRNTShydy5EZil9IG1tPC9zcGFuPjxzcGFuIGNsYXNzPSJjaGlwIj48Yj5EaTwvYj4ke2ZtdE1NKHJ3LkRpKX0gbW08L3NwYW4+PC9kaXY+YDsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgaCArPSAnPHNwYW4gY2xhc3M9ImZpZWxkLWxhYmVsIj5Sb2hyYW5zY2hsdXNzPC9zcGFuPjxkaXYgY2xhc3M9InNlZyI+JyArCiAgICAgICAgW1snQlcnLCdCdXR0IFdlbGQnXSxbJ1RDJywnVHJpLUNsYW1wJ11dLm1hcCgoW2lkLGxhYmVsXSkgPT4gYDxidXR0b24gY2xhc3M9IiR7c3RhdGUuY29ubmVjdEFuc2NobHVzcyA9PT0gaWQgPyAnc2VsJyA6ICcnfSIgZGF0YS1hY3Q9ImNvbm5lY3RhbnNjaGx1c3MiIGRhdGEtaWQ9IiR7aWR9Ij4ke2xhYmVsfTwvYnV0dG9uPmApLmpvaW4oJycpICsgJzwvZGl2Pic7CiAgICAgIGNvbnN0IHJzID0gcm93c0ZvcihzdGF0ZSk7CiAgICAgIGggKz0gYDxzcGFuIGNsYXNzPSJmaWVsZC1sYWJlbCI+Um9ocmdyw7bDn2U8L3NwYW4+PGRpdiBjbGFzcz0ic2VsZWN0LXdyYXAiPjxzZWxlY3QgY2xhc3M9InN6IiBkYXRhLXJvbGU9InNpemUiPiR7cnMubWFwKHIgPT4KICAgICAgICBgPG9wdGlvbiB2YWx1ZT0iJHtlc2Moci5pZCl9IiAke3N0YXRlLmdyb2Vzc2UgPT09IHIuaWQgPyAnc2VsZWN0ZWQnIDogJyd9PiR7ZXNjKGxibChyKSl9IMK3IERlICR7Zm10TU0oci5EZSl9IMK3IERpICR7Zm10TU0oci5EaSl9IG1tPC9vcHRpb24+YCkuam9pbignJyl9PC9zZWxlY3Q+PC9kaXY+YDsKICAgICAgaWYgKHJ3KSB7CiAgICAgICAgY29uc3QgZW5kID0gY29ubmVjdEVuZEZvcihzdGF0ZSwgcncpOwogICAgICAgIGNvbnN0IHVwcGVyID0gRC5tYXNzZS5jb25uZWN0LmNmaS5vYmVyZXJBbnNjaGx1c3M7CiAgICAgICAgaCArPSBgPGRpdiBjbGFzcz0icHYtY2hpcHMiPjxzcGFuIGNsYXNzPSJjaGlwIj48Yj5UeXA8L2I+JHtlc2ModC5pZCl9PC9zcGFuPjxzcGFuIGNsYXNzPSJjaGlwIj48Yj5Sb2hyIERlIC8gRGk8L2I+JHtmbXRNTShydy5EZSl9IC8gJHtmbXRNTShydy5EaSl9IG1tPC9zcGFuPjxzcGFuIGNsYXNzPSJjaGlwIj48Yj5PYmVyZXIgQW5zY2hsdXNzIERlIC8gRGk8L2I+JHtmbXRNTSh1cHBlci5EZSl9IC8gJHtmbXRNTSh1cHBlci5EaSl9IG1tPC9zcGFuPjxzcGFuIGNsYXNzPSJjaGlwIj48Yj5ZPC9iPiR7Zm10TU0ocncuWSl9IG1tPC9zcGFuPiR7ZW5kID8gYDxzcGFuIGNsYXNzPSJjaGlwIj48Yj5MPC9iPiR7Zm10TU0oZW5kLkwpfSBtbTwvc3Bhbj48c3BhbiBjbGFzcz0iY2hpcCI+PGI+JHtzdGF0ZS5jb25uZWN0QW5zY2hsdXNzID09PSAnVEMnID8gJ1RDJyA6ICdBJ308L2I+JHtmbXRNTShzdGF0ZS5jb25uZWN0QW5zY2hsdXNzID09PSAnVEMnID8gZW5kLlRDIDogZW5kLkEpfSBtbTwvc3Bhbj5gIDogJyd9PC9kaXY+YDsKICAgICAgfQogICAgfQogICAgaCArPSBgPGJ1dHRvbiBjbGFzcz0ibGlua2J0biIgZGF0YS1hY3Q9InNvbmRlciI+JHtpYygncGx1cycsICdpYycpfSBTb25kZXJhYm1lc3N1bmcgYW5mcmFnZW48L2J1dHRvbj5gOwogICAgcmV0dXJuIGg7CiAgfQoKICBmdW5jdGlvbiByZW5kZXJTdGVwNCgpIHsKICAgIGNvbnN0IHQgPSB0eXBPYmooc3RhdGUudHlwKTsgY29uc3QgcnMgPSByb3dzRm9yKHN0YXRlKTsKICAgIGlmIChpc3RNYXNzZUZvbGd0KHQpKSByZXR1cm4gcmVuZGVyU3RlcDRNYXNzZUZvbGd0KHQpOwogICAgaWYgKGlzdE51ckZsYW5zY2godCkpIHJldHVybiByZW5kZXJTdGVwNEZsYW5zY2godCk7CiAgICBpZiAoaXNDb25uZWN0KHQpKSByZXR1cm4gcmVuZGVyU3RlcDRDb25uZWN0KHQpOwogICAgbGV0IGggPSBoZWFkKCdTY2hyaXR0IDQnLCAnTWHDn2UgZmVzdGxlZ2VuJywgJ1JlaWhlIHVuZCBHcsO2w59lIGJlc3RpbW1lbiBkaWUgR2VvbWV0cmllLiBEaWUgWmVpY2hudW5nIHVuZCBkaWUgTWHDn2tldHRlbiB3YWNoc2VuIGxpdmUgbWl0LicpOwogICAgaCArPSAnPHNwYW4gY2xhc3M9ImZpZWxkLWxhYmVsIj5SZWloZTwvc3Bhbj48ZGl2IGNsYXNzPSJzZWciPicgKwogICAgICBbJ0EnLCAnQicsICdDJ10ubWFwKHIgPT4geyBjb25zdCBvayA9IHJlaWhlQXZhaWxhYmxlKHQsIHIpOyByZXR1cm4gYDxidXR0b24gY2xhc3M9IiR7c3RhdGUucmVpaGUgPT09IHIgPyAnc2VsJyA6ICcnfSIgZGF0YS1hY3Q9InJlaWhlIiBkYXRhLWlkPSIke3J9IiAke29rID8gJycgOiAnZGlzYWJsZWQnfT4ke2VzYygoaXNCZW5kKHQpID8geyBBOidtZXRyaXNjaCcsIEI6J0lTTy9PRCcsIEM6J1pvbGwnIH0gOiB7IEE6J21ldHJpc2NoIEROJywgQjonSVNPL09EJywgQzonWm9sbCcgfSlbcl0pfSR7b2sgPyAnJyA6ICcgwrcgZmVobHQnfTwvYnV0dG9uPmA7IH0pLmpvaW4oJycpICsgJzwvZGl2Pic7CiAgICBoICs9ICc8ZGl2IGNsYXNzPSJyb3cyIiBzdHlsZT0ibWFyZ2luLXRvcDoxNnB4Ij4nOwogICAgaCArPSBgPGRpdj48c3BhbiBjbGFzcz0iZmllbGQtbGFiZWwiIHN0eWxlPSJtYXJnaW4tdG9wOjAiPiR7ZXNjKGlzQmVuZCh0KSA\\\/ICdHcsO2w59lIChPRCknIDogKHN0YXRlLnJlaWhlID09PSAnQScgPyAnTmVubndlaXRlJyA6ICdHcsO2w59lJykpfTwvc3Bhbj4KICAgICAgPGRpdiBjbGFzcz0ic2VsZWN0LXdyYXAiPjxzZWxlY3QgY2xhc3M9InN6IiBpZD0id3otc2l6ZSIgZGF0YS1yb2xlPSJzaXplIj4ke3JzLm1hcChyID0+IGA8b3B0aW9uIHZhbHVlPSIke3IuaWR9IiAke3N0YXRlLmdyb2Vzc2UgPT09IHIuaWQgPyAnc2VsZWN0ZWQnIDogJyd9PiR7ZXNjKGxibChyKSl9IMK3IOKMgCAke2ZtdE1NKG9kT2YocikpfSDDlyAke2ZtdE1NKHdhbGxPZihyKSl9IG1tJHt0Lm5vcm0gPT09ICdkaW4zMjY3NicgJiYgci5mbGFuZ2VPRCA\\\/ICcgwrcgS2xlbW0t4oyAICcgKyBmbXRNTShyLmZsYW5nZU9EKSA6ICcnfTwvb3B0aW9uPmApLmpvaW4oJycpfTwvc2VsZWN0PjwvZGl2PjwvZGl2PmA7CiAgICBpZiAodCAmJiB0Lnp3ZWl0ZUdyb2Vzc2UpIHsKICAgICAgLy8gUjMtMi9SMy00OiAiUmVkdXppZXJ0IGF1ZiIgLyAiQWJnYW5nIiBiaWV0ZXQgTlVSIEdyw7bDn2VuIGtsZWluZXIgYWxzIGRpZSBOZW5ud2VpdGUgYW4uCiAgICAgIGNvbnN0IHJyID0gcm93czJGb3Ioc3RhdGUpLCBmbGQgPSB0LnN2Z1R5cGUgPT09ICdyZWR1emllcnVuZycgPyAnUmVkdXppZXJ0IGF1ZicgOiAnQWJnYW5nJzsKICAgICAgaWYgKHJyLmxlbmd0aCkgewogICAgICAgIGggKz0gYDxkaXY+PHNwYW4gY2xhc3M9ImZpZWxkLWxhYmVsIiBzdHlsZT0ibWFyZ2luLXRvcDowIj4ke2VzYyhmbGQpfTwvc3Bhbj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNlbGVjdC13cmFwIj48c2VsZWN0IGNsYXNzPSJzeiIgaWQ9Ind6LXNpemUyIiBkYXRhLXJvbGU9InNpemUyIj4ke3JyLm1hcChyID0+IGA8b3B0aW9uIHZhbHVlPSIke3IuaWR9IiAke3N0YXRlLmdyb2Vzc2UyID09PSByLmlkID8gJ3NlbGVjdGVkJyA6ICcnfT4ke2VzYyhsYmwocikpfSDCtyDijIAgJHtmbXRNTShvZE9mKHIpKX0gbW08L29wdGlvbj5gKS5qb2luKCcnKX08L3NlbGVjdD48L2Rpdj48L2Rpdj5gOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIEtsZWluc3RlIEdyw7bDn2UgZGVyIFJlaWhlIGdld8OkaGx0IC0+IGVzIGdpYnQga2VpbmUga2xlaW5lcmUuIEtlaW4gbGVlcmVzIERyb3Bkb3duLAogICAgICAgIC8vIHNvbmRlcm4gZWluIGtsYXJlciBIaW53ZWlzOyBkaWUgWmVpY2hudW5nIHplaWd0IHNvIGxhbmdlIGRlbiAiZm9sZ3QiLVBsYXR6aGFsdGVyLgogICAgICAgIGggKz0gYDxkaXY+PHNwYW4gY2xhc3M9ImZpZWxkLWxhYmVsIiBzdHlsZT0ibWFyZ2luLXRvcDowIj4ke2VzYyhmbGQpfTwvc3Bhbj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im5vdGUtcGxoIj4ke2ljKCdpbmZvJyl9PHNwYW4+RsO8ciBkaWUga2xlaW5zdGUgR3LDtsOfZSBkZXIgUmVpaGUgZ2lidCBlcyBrZWluZSBrbGVpbmVyZSBOZW5ud2VpdGUuIFfDpGhsZSBlaW5lIGdyw7bDn2VyZSBOZW5ud2VpdGUsIGRhbm4gbMOkc3N0IHNpY2gg4oCeJHtlc2MoZmxkKX3igJwgZmVzdGxlZ2VuLjwvc3Bhbj48L2Rpdj48L2Rpdj5gOwogICAgICB9CiAgICB9CiAgICBoICs9ICc8L2Rpdj4nOwogICAgaWYgKHQgJiYgdC5sYWVuZ2VWYXJpYW50ZSkgewogICAgICBoICs9ICc8c3BhbiBjbGFzcz0iZmllbGQtbGFiZWwiPlN0dXR6ZW5sw6RuZ2U8L3NwYW4+PGRpdiBjbGFzcz0ic2VnIj4nICsKICAgICAgICBbWydLSycsICdrdXJ6IChLSyknXSwgWydLTCcsICdsYW5nIChLTCknXV0ubWFwKChbdiwgbF0pID0+IGA8YnV0dG9uIGNsYXNzPSIke3N0YXRlLmxhZW5nZVZhcmlhbnRlID09PSB2ID8gJ3NlbCcgOiAnJ30iIGRhdGEtYWN0PSJsYWVuZ2UiIGRhdGEtaWQ9IiR7dn0iPiR7ZXNjKGwpfTwvYnV0dG9uPmApLmpvaW4oJycpICsgJzwvZGl2Pic7CiAgICB9CiAgICAvLyBUQ0QgKGRpY2t3YW5kaWcpOiBLRUlORSBLSy9LTC1BdXN3YWhsIC0gZGllIFplaWxlbiB0cmFnZW4gZGllIGZlc3RlIEhvZWhlIGggPSA2MCBtbQogICAgLy8gKFdlaXNzLVN0YW5kYXJkIGxhdXQgQmVybmQpLiBEZXIgV2VydCBrb21tdCBhdXMgZGVyIFRhYmVsbGUsIG5pY2h0IGF1cyBkaWVzZW0gVGV4dC4KICAgIC8vIE9GRkVOIChCZXJuZCk6IG9iIGRlciBLdW5kZSB2b24gZGVuIDYwIG1tIGFid2VpY2hlbiBkYXJmLCBpc3QgbmljaHQgZ2VzYWd0IC0+IGJpcyB6dXIKICAgIC8vIEtsYWVydW5nIGZlc3QsIEtFSU5FTiBBdXN3YWhsc2NoYWx0ZXIgZXJmaW5kZW4uCiAgICBjb25zdCByd0wgPSB0ICYmICFpc3ROdXJGbGFuc2NoKHQpICYmICFpc3RNYXNzZUZvbGd0KHQpID8gcm93Rm9yKHN0YXRlKSA6IG51bGw7CiAgICBpZiAocndMICYmIHJ3TC5ob2VoZSAhPSBudWxsKSB7CiAgICAgIGggKz0gYDxzcGFuIGNsYXNzPSJmaWVsZC1sYWJlbCI+SMO2aGU8L3NwYW4+PGRpdiBjbGFzcz0ibm90ZS1wbGgiPiR7aWMoJ2luZm8nKX08c3Bhbj48Yj4ke2VzYyhmbXRNTShyd0wuaG9laGUpKX0gbW08L2I+IOKAkyBTdGFuZGFyZGjDtmhlIHZvbiBGaXJtYSBXZWlzcyBmw7xyIGRpY2t3YW5kaWdlIFRhbmtzdHV0emVuLgogICAgICAgIEJyYXVjaHN0IGR1IGVpbmUgYW5kZXJlIEjDtmhlLCBnaWIgc2llIGJpdHRlIHVudGVyIOKAnlNvbmRlcmFibWVzc3VuZyBhbmZyYWdlbuKAnCBhbi48L3NwYW4+PC9kaXY+YDsKICAgIH0KICAgIGlmICh0ICYmIHQuaWQgPT09ICdUQycpIHsKICAgICAgaCArPSAnPHNwYW4gY2xhc3M9ImZpZWxkLWxhYmVsIj5LbGFtbWVyIGRlciBrb21wbGV0dGVuIFZlcmJpbmR1bmc8L3NwYW4+PGRpdiBjbGFzcz0ib3B0cyI+JyArIChELmtsYW1tZXJUeXBlbiB8fCBbXSkubWFwKGsgPT4KICAgICAgICBgPGJ1dHRvbiBjbGFzcz0ib3B0ICR7c3RhdGUua2xhbW1lclR5cCA9PT0gay5pZCA\\\/ICdzZWwnIDogJyd9IiBkYXRhLWFjdD0ia2xhbW1lcnR5cCIgZGF0YS1pZD0iJHtrLmlkfSI+PHNwYW4gY2xhc3M9InQiPiR7ZXNjKGsubGFiZWwpfTwvc3Bhbj48c3BhbiBjbGFzcz0iZCI+JHtlc2Moay5zdWIpfTwvc3Bhbj48L2J1dHRvbj5gKS5qb2luKCcnKSArICc8L2Rpdj4nOwogICAgfQogICAgaWYgKHQgJiYgdC5leHplbnRyaXNjaFdhaGwpIHsKICAgICAgLy8gUjMtMjoga29uemVudHJpc2NoID0gIkZvcm0gUksiLCBleHplbnRyaXNjaCA9ICJGb3JtIFJFIi4KICAgICAgaCArPSAnPHNwYW4gY2xhc3M9ImZpZWxkLWxhYmVsIj5CYXVmb3JtPC9zcGFuPjxkaXYgY2xhc3M9InNlZyI+JyArCiAgICAgICAgW1tmYWxzZSwgJ2tvbnplbnRyaXNjaCDCtyBGb3JtIFJLJ10sIFt0cnVlLCAnZXh6ZW50cmlzY2ggwrcgRm9ybSBSRSddXS5tYXAoKFt2LCBsXSkgPT4gYDxidXR0b24gY2xhc3M9IiR7c3RhdGUuZXh6ZW50cmlzY2ggPT09IHYgPyAnc2VsJyA6ICcnfSIgZGF0YS1hY3Q9ImV4eiIgZGF0YS1pZD0iJHt2fSI+JHtlc2MobCl9PC9idXR0b24+YCkuam9pbignJykgKyAnPC9kaXY+JzsKICAgIH0KICAgIGlmICh0ICYmIHQuZm9ybVdhaGwpIHsKICAgICAgLy8gUjMtMy9SMy00OiBGb3JtIFQgKGFsbGUgQWJnw6RuZ2UgZ2xlaWNoIGxhbmcpIC8gRm9ybSBUSyAoRHVyY2hnYW5nIGdsZWljaCwgQWJnYW5nIGt1cnopLgogICAgICBoICs9ICc8c3BhbiBjbGFzcz0iZmllbGQtbGFiZWwiPkJhdWZvcm08L3NwYW4+PGRpdiBjbGFzcz0ic2VnIj4nICsKICAgICAgICBbWydUJywgJ0Zvcm0gVCDCtyBBYmfDpG5nZSBnbGVpY2ggbGFuZyddLCBbJ1RLJywgJ0Zvcm0gVEsgwrcgQWJnYW5nIGt1cnonXV0ubWFwKChbdiwgbF0pID0+IGA8YnV0dG9uIGNsYXNzPSIke3N0YXRlLmZvcm1WYXJpYW50ZSA9PT0gdiA\\\/ICdzZWwnIDogJyd9IiBkYXRhLWFjdD0iZm9ybXZhciIgZGF0YS1pZD0iJHt2fSI+JHtlc2MobCl9PC9idXR0b24+YCkuam9pbignJykgKyAnPC9kaXY+JzsKICAgIH0KICAgIGlmIChpc0JlbmQodCkpIGggKz0gYDxkaXYgY2xhc3M9Im5vdGUtb2siPiR7aWMoJ2NoZWNrJywgJ2ljJyl9PHNwYW4+UiwgTDEsIEwyIHVuZCBMMyBzdGFtbWVuIGF1cyBkZXIgYXVzZ2Vmw7xsbHRlbiBXZWlzcy1NYcOfdGFiZWxsZS4gRGllIHZvbiBGaXJtYSBXZWlzcyBrb3JyaWdpZXJ0ZW4gRE4yNS1XZXJ0ZSBzaW5kIGVudGhhbHRlbi48L3NwYW4+PC9kaXY+YDsKICAgIGVsc2UgaWYgKHQgJiYgdC5pZCA9PT0gJ1InKSBoICs9IGA8ZGl2IGNsYXNzPSJub3RlLW9rIj4ke2ljKCdjaGVjaycsICdpYycpfTxzcGFuPkVzIHdlcmRlbiBhdXNzY2hsaWXDn2xpY2ggZGllIDc5IHZvbiBGaXJtYSBXZWlzcyBnZWxpZWZlcnRlbiBHcsO2w59lbnBhYXJlIHVuZCBMLVdlcnRlIGFuZ2Vib3Rlbi48L3NwYW4+PC9kaXY+YDsKICAgIGVsc2UgaWYgKHQgJiYgdC5pZCA9PT0gJ1RTJykgaCArPSBgPGRpdiBjbGFzcz0ibm90ZS1vayI+JHtpYygnY2hlY2snLCAnaWMnKX08c3Bhbj5BbGxlIGdsZWljaHdlaXRlbiBULVN0w7xja2UgKG1ldHJpc2NoLCBJU08gdW5kIFpvbGwpIHN0YW1tZW4gYXVzIGRlciBnZWxpZWZlcnRlbiBXZWlzcy1NYcOfdGFiZWxsZS4gRm9ybSBUSyDDvGJlcm5pbW10IGRlbiBBYmdhbmcgYXVzIGRlciBTcGFsdGUgTDEuPC9zcGFuPjwvZGl2PmA7CiAgICBlbHNlIGlmICh0ICYmIHQuaWQgPT09ICdUU1InKSBoICs9IGA8ZGl2IGNsYXNzPSJub3RlLW9rIj4ke2ljKCdjaGVjaycsICdpYycpfTxzcGFuPkVzIHdlcmRlbiBhdXNzY2hsaWXDn2xpY2ggZGllIHZvbiBGaXJtYSBXZWlzcyBnZWxpZWZlcnRlbiBBYnp3ZWlnLUtvbWJpbmF0aW9uZW4gYW5nZWJvdGVuLiBGb3JtIFRLIMO8YmVybmltbXQgZGVuIEFiZ2FuZyBhdXMgZGVyIFNwYWx0ZSBMMS48L3NwYW4+PC9kaXY+YDsKICAgIGggKz0gYDxidXR0b24gY2xhc3M9ImxpbmtidG4iIGRhdGEtYWN0PSJzb25kZXIiPiR7aWMoJ3BsdXMnLCAnaWMnKX0gU29uZGVyYWJtZXNzdW5nIGFuZnJhZ2VuPC9idXR0b24+YDsKICAgIHJldHVybiBoOwogIH0KCiAgZnVuY3Rpb24gcmVuZGVyU3RlcDcoKSB7CiAgICBsZXQgaCA9IGhlYWQoJ1NjaHJpdHQgNycsICdOYWNod2Vpc2UgJiBNZW5nZScsICdaZXJ0aWZpa2F0ZSB6dWJ1Y2hlbiB1bmQgU3TDvGNremFobCB3w6RobGVuLiBCZWlkZXMgZ2VodCBtaXQgaW4gZGllIEFuZnJhZ2UuJyk7CiAgICBjb25zdCBzdGQgPSBELnByZWlzZS5uYWNod2Vpc1N0YW5kYXJkIHx8IFtdOwogICAgaCArPSAnPHNwYW4gY2xhc3M9ImZpZWxkLWxhYmVsIj5OYWNod2Vpc2UgLyBaZXJ0aWZpa2F0ZTwvc3Bhbj48ZGl2IGNsYXNzPSJvcHRzIj4nICsgRC5uYWNod2Vpc2UubWFwKG53ID0+IHsKICAgICAgY29uc3Qgb24gPSBzdGF0ZS5uYWNod2Vpc2UuaW5kZXhPZihudy5pZCkgPj0gMCwgaXNTdGQgPSBzdGQuaW5kZXhPZihudy5pZCkgPj0gMDsKICAgICAgLy8gQmVybmQgTGlua2VyLCAwMS4wOS4yMDI2OiBCZWltIEFELVcyIHNvbGwgaW0gS2Flc3RjaGVuIHN0ZWhlbiwgZGFzcyBkZXIgQXVmcHJlaXMKICAgICAgLy8gamUgQ2hhcmdlIGdpbHQgdW5kIG5pY2h0IGplIFN0dWVjay4gRGVyIEJldHJhZyBrb21tdCBhdXMgZGVuIFByZWlzZGF0ZW4sIGRhbWl0IGVyCiAgICAgIC8vIG5pY2h0IGRvcHBlbHQgZ2VwZmxlZ3Qgd2VyZGVuIG11c3MgdW5kIGltIFRleHQgbmllIHZlcmFsdGV0LgogICAgICBjb25zdCBjaGFyZ2VCZXRyYWcgPSBpc3RDaGFyZ2VuTmFjaHdlaXMobncuaWQpID8gY2hhcmdlbkF1ZnByZWlzRnVlcihudy5pZCkgOiBudWxsOwogICAgICBjb25zdCBjaGFyZ2VaZWlsZSA9IGNoYXJnZUJldHJhZyAhPSBudWxsCiAgICAgICAgPyBgPHNwYW4gY2xhc3M9ImQiPkF1ZnByZWlzICR7ZXVyKGNoYXJnZUJldHJhZyl9IOKCrCBqZSBDaGFyZ2U8L3NwYW4+YAogICAgICAgIDogJyc7CiAgICAgIHJldHVybiBgPGJ1dHRvbiBjbGFzcz0ib3B0ICR7b24gPyAnc2VsJyA6ICcnfSAke2lzU3RkID8gJ2Rpc2FibGVkJyA6ICcnfSIgZGF0YS1hY3Q9Im5hY2h3ZWlzIiBkYXRhLWlkPSIke253LmlkfSIgJHtpc1N0ZCA\\\/ICdkaXNhYmxlZCcgOiAnJ30+CiAgICAgICAgPHNwYW4gY2xhc3M9InQiPiR7b24gPyBpYygnY2hlY2snLCAnaWMnKSA6ICcnfSR7ZXNjKG5hY2h3ZWlzTGFiZWwobncpKX0ke2lzU3RkID8gJzxzcGFuIGNsYXNzPSJsb2NrIj5TdGFuZGFyZDwvc3Bhbj4nIDogJyd9PC9zcGFuPgogICAgICAgIDxzcGFuIGNsYXNzPSJkIj4ke2VzYyhudy5zdWIpfTwvc3Bhbj4ke2NoYXJnZVplaWxlfTwvYnV0dG9uPmA7CiAgICB9KS5qb2luKCcnKSArICc8L2Rpdj4nOwogICAgaCArPSBgPGRpdiBjbGFzcz0ibm90ZS1wbGgiPiR7aWMoJ2luZm8nKX08c3Bhbj5EYXMgQWJuYWhtZXByw7xmemV1Z25pcyAzLjEgaXN0IGtvc3Rlbmxvcy4gMy4xIG5hY2ggQUQtVzIsIEZlcnJpdC1NZXNzdW5nIHVuZCBSYS1NZXNzcHJvdG9rb2xsIGdpYnQgZXMgZ2VnZW4gTWVocmtvc3Rlbi48L3NwYW4+PC9kaXY+YDsKICAgIGggKz0gJzxzcGFuIGNsYXNzPSJmaWVsZC1sYWJlbCI+U3TDvGNremFobDwvc3Bhbj48ZGl2IGNsYXNzPSJzdGVwcGVyIj48YnV0dG9uIGRhdGEtYWN0PSJtZW5nZS0iIGFyaWEtbGFiZWw9IndlbmlnZXIiPuKIkjwvYnV0dG9uPicgKwogICAgICBgPGlucHV0IGlkPSJ3ei1tZW5nZSIgZGF0YS1yb2xlPSJtZW5nZSIgaW5wdXRtb2RlPSJudW1lcmljIiB2YWx1ZT0iJHtzdGF0ZS5tZW5nZX0iLz5gICsgJzxidXR0b24gZGF0YS1hY3Q9Im1lbmdlKyIgYXJpYS1sYWJlbD0ibWVociI+KzwvYnV0dG9uPjwvZGl2Pic7CiAgICBoICs9ICc8ZGl2IGNsYXNzPSJzdGFmZmVsIj4nICsgbWVuZ2VuU3BydW5nbWFya2VuKCkubWFwKG0gPT4gYDxzcGFuIGNsYXNzPSJzICR7c3RhdGUubWVuZ2UgPj0gbSA\\\/ICdvbicgOiAnJ30iIGRhdGEtYWN0PSJzdGFmZmVsIiBkYXRhLWFiPSIke219Ij5hYiAke219PC9zcGFuPmApLmpvaW4oJycpICsgJzwvZGl2Pic7CiAgICByZXR1cm4gaDsKICB9CgogIGZ1bmN0aW9uIHBvc2l0aW9uc0ZvclJmcSgpIHsKICAgIGNvbnN0IG91dCA9IHN0YXRlLnBvc2l0aW9uZW4uc2xpY2UoKTsKICAgIGlmIChzdGF0ZS50eXApIG91dC5wdXNoKHNuYXBzaG90KCkpOwogICAgcmV0dXJuIG91dDsKICB9CgogIC8qIFN1bW1lIHVlYmVyIGRpZSBQb3NpdGlvbnNsaXN0ZS4gQXVmc3VtbWllcnQgd2lyZCBBVVNTQ0hMSUVTU0xJQ0ggdWViZXIgUG9zaXRpb25lbiBtaXQKICAgKiBlY2h0ZW0gUHJlaXMgKG1vZGUgJ2xpdmUnLCBrZWluIFBsYXR6aGFsdGVyKS4gRWluZSBQb3NpdGlvbiAiYXVmIEFuZnJhZ2UiIGRhcmYgbmllbWFscwogICAqIHN0aWxsc2Nod2VpZ2VuZCBhbHMgMCBFVVIgaW4gZWluZSBTdW1tZSBsYXVmZW4gLSBzaWUgd2lyZCBnZXRyZW5udCBnZXphZWhsdCB1bmQgaW0KICAgKiBXYXJlbmtvcmIgd2llIGluIGRlciBBbmZyYWdlLU1haWwgYXVzZHJ1ZWNrbGljaCBhdXNnZXdpZXNlbi4gc3R1ZWNrIHphZWhsdCBhdXMgZGVtCiAgICogZ2xlaWNoZW4gR3J1bmQgbnVyIGRpZSBTdHVlY2t6YWhsZW4gZGVyIGJlcHJlaXN0ZW4gUG9zaXRpb25lbjogc29uc3Qgc3R1ZW5kZSB1ZWJlciBkZXIKICAgKiBTdW1tZSBlaW5lIE1lbmdlLCBkaWUgc2llIGdhciBuaWNodCBhYmRlY2t0LiAqLwogIGZ1bmN0aW9uIGNhcnRTdW1tYXJ5KHBvcykgewogICAgbGV0IHN1bW1lID0gMCwgbWl0UHJlaXMgPSAwLCBvaG5lUHJlaXMgPSAwLCBzdHVlY2sgPSAwOwogICAgKHBvcyB8fCBbXSkuZm9yRWFjaChwcyA9PiB7CiAgICAgIGNvbnN0IHAgPSBwcy5wcmljZTsKICAgICAgaWYgKHAgJiYgcC5tb2RlID09PSAnbGl2ZScgJiYgIXAucGxhdHpoYWx0ZXIpIHsgc3VtbWUgKz0gcC5nZXNhbXQ7IG1pdFByZWlzKys7IHN0dWVjayArPSBOdW1iZXIocHMubWVuZ2UpIHx8IDA7IH0KICAgICAgZWxzZSBvaG5lUHJlaXMrKzsKICAgIH0pOwogICAgcmV0dXJuIHsgc3VtbWUsIG1pdFByZWlzLCBvaG5lUHJlaXMsIHN0dWVjayB9OwogIH0KICBjb25zdCBwb3NXb3J0ID0gbiA9PiBuID09PSAxID8gJ1Bvc2l0aW9uJyA6ICdQb3NpdGlvbmVuJzsKICBmdW5jdGlvbiBzbmFwc2hvdCgpIHsKICAgIGNvbnN0IHMgPSBzdGF0ZSwgdCA9IHR5cE9iaihzLnR5cCksIHBpID0gcHJpY2VJbmZvKHMpOwogICAgcmV0dXJuIHsgYW53ZW5kdW5nOnMuYW53ZW5kdW5nLCB0eXA6cy50eXAsIG5vcm06cy5ub3JtLCByZWloZTpzLnJlaWhlLCBncm9lc3NlOnMuZ3JvZXNzZSwgZ3JvZXNzZTI6cy5ncm9lc3NlMiwgbGFlbmdlVmFyaWFudGU6cy5sYWVuZ2VWYXJpYW50ZSwKICAgICAgY29ubmVjdE5vcm06cy5jb25uZWN0Tm9ybSwgY29ubmVjdExhZW5nZTpzLmNvbm5lY3RMYWVuZ2UsIGNvbm5lY3RBbnNjaGx1c3M6cy5jb25uZWN0QW5zY2hsdXNzLAogICAgICAvLyBGbGFuc2NoLS9LbGFtbWVyLUFuZ2FiZW4gbWl0c2NobmVpZGVuLCBzb25zdCBmZWhsZW4gc2llIGluIFdhcmVua29yYiArIFJGUS1NYWlsLgogICAgICBmbGFuc2NoOnMuZmxhbnNjaCwga2xhbW1lclR5cDpzLmtsYW1tZXJUeXAsIGtsYW1tZXJXZXJrc3RvZmY6cy5rbGFtbWVyV2Vya3N0b2ZmLCBrbGFtbWVyTXV0dGVyOnMua2xhbW1lck11dHRlciwKICAgICAgZXh6ZW50cmlzY2g6cy5leHplbnRyaXNjaCwgZm9ybVZhcmlhbnRlOnMuZm9ybVZhcmlhbnRlLCB3ZXJrc3RvZmY6ZWZmV2Vya3N0b2ZmKHMpLCBvYmVyZmxhZWNoZTpzLm9iZXJmbGFlY2hlLCBkaWNodHVuZzp0ICYmIHQuZGljaHR1bmcgPyBzLmRpY2h0dW5nIDogbnVsbCwKICAgICAgbmFjaHdlaXNlOnMubmFjaHdlaXNlLnNsaWNlKCksIGxpcHBlOnMubGlwcGUsIG1lbmdlOnMubWVuZ2UsIHZpZXc6cy52aWV3LAogICAgICBjb2RlOnR5cGVjb2RlKHMpLCBjb25maWd1cmF0aW9uQ29kZTp0eXBlY29kZShzKSwgYXJ0aWNsZU51bWJlcjphcnRpY2xlTnVtYmVyKHMpLCBwcmljZTpwaSB9OwogIH0KCiAgZnVuY3Rpb24gYWRkUG9zaXRpb24oKSB7CiAgICBpZiAoIXN0YXRlLnR5cCkgcmV0dXJuOwogICAgc3RhdGUucG9zaXRpb25lbi5wdXNoKHNuYXBzaG90KCkpOwogICAgLy8gRGllIGdlc3BlaWNoZXJ0ZSBQb3NpdGlvbiBibGVpYnQgdW52ZXLDpG5kZXJ0LiBGw7xyIGRpZSBuw6RjaHN0ZSBQb3NpdGlvbiBtdXNzCiAgICAvLyBiZXd1c3N0IGVpbiBuZXVlcyBCYXV0ZWlsIGdld8OkaGx0IHdlcmRlbiwgZGFtaXQgZGVyIGFrdHVlbGxlIFN0YW5kIG5pY2h0IGRvcHBlbHQKICAgIC8vIGluIFdhcmVua29yYiwgQW5mcmFnZSBvZGVyIFBvc2l0aW9uc2xpbmtzIGxhbmRldC4KICAgIHN0YXRlLnR5cCA9IG51bGw7IHN0YXRlLmdyb2Vzc2UgPSBudWxsOyBzdGF0ZS5ncm9lc3NlMiA9IG51bGw7CiAgICBzdGF0ZS5jb25uZWN0TGFlbmdlID0gbnVsbDsgc3RhdGUuZmxhbnNjaCA9IG51bGw7IHN0YXRlLnN0ZXAgPSAzOwogICAgcmVuZGVyQWxsKCk7IHNjcm9sbFRvcCgpOwogIH0KCiAgZnVuY3Rpb24gcmVuZGVyU3RlcDgoKSB7CiAgICBjb25zdCBwb3MgPSBwb3NpdGlvbnNGb3JSZnEoKTsKICAgIGxldCBoID0gaGVhZCgnU2Nocml0dCA4JywgJ0FuZnJhZ2UgenVzYW1tZW5zdGVsbGVuJywgJ1Byw7xmZSBkaWUgYmVsZWd0ZW4gQW5nYWJlbiB1bmQgZXJnw6RuemUgZGVpbmVuIEtvbnRha3QuIE9mZmVuZSBXZXJ0ZSBibGVpYmVuIGRldXRsaWNoIGdla2VubnplaWNobmV0LicpOwogICAgY29uc3Qgc3VtID0gY2FydFN1bW1hcnkocG9zKTsKICAgIGggKz0gJzxkaXYgY2xhc3M9ImNhcnQiPicgKyBwb3MubWFwKChwcywgaSkgPT4gewogICAgICBjb25zdCB0ID0gdHlwT2JqKHBzLnR5cCksIGxpdmUgPSBwcy5wcmljZS5tb2RlID09PSAnbGl2ZScgJiYgIXBzLnByaWNlLnBsYXR6aGFsdGVyOwogICAgICBjb25zdCBwciA9IGxpdmUgPyBldXIocHMucHJpY2UuZ2VzYW10KSArICcg4oKsJyA6ICdhdWYgQW5mcmFnZSc7CiAgICAgIC8vIFJlY2hlbndlZyBkZXIgWmVpbGUgb2ZmZW5sZWdlbjogb2huZSAiU3R1ZWNrcHJlaXMgeCBNZW5nZSIgaXN0IGltIFdhcmVua29yYiBuaWNodAogICAgICAvLyBuYWNodm9sbHppZWhiYXIsIHdpZSBkZXIgWmVpbGVuYmV0cmFnIHp1c3RhbmRlIGtvbW10IC0gdW5kIGRpZSBNZW5nZW5zdGFmZmVsIHdhZXJlCiAgICAgIC8vIHVuc2ljaHRiYXIgaW4gZGVuIEJldHJhZyBlaW5nZXJlY2huZXQuCiAgICAgIGNvbnN0IHJlY2hudW5nID0gbGl2ZQogICAgICAgID8gJyDCtyAnICsgZXVyKHBzLnByaWNlLnN0dWVjaykgKyAnIOKCrCAvIFN0w7xjaycgKyAocHMucHJpY2UucmFiYXR0ID8gJyDCtyDiiJInICsgcHMucHJpY2UucmFiYXR0ICsgJyAlIGFiICcgKyBwcy5wcmljZS5hYiA6ICcnKQogICAgICAgICAgKyAocHMucHJpY2UuY2hhcmdlQXVmcHJlaXMgPyAnIMK3IHBsdXMgJyArIGV1cihwcy5wcmljZS5jaGFyZ2VBdWZwcmVpcykgKyAnIOKCrCBqZSBDaGFyZ2UnIDogJycpCiAgICAgICAgOiAnJzsKICAgICAgY29uc3QgZGVsQnRuID0gaSA8IHN0YXRlLnBvc2l0aW9uZW4ubGVuZ3RoID8gYDxidXR0b24gY2xhc3M9ImRlbCIgZGF0YS1hY3Q9ImRlbHBvcyIgZGF0YS1pPSIke2l9IiBhcmlhLWxhYmVsPSJlbnRmZXJuZW4iPsOXPC9idXR0b24+YCA6ICcnOwogICAgICByZXR1cm4gYDxkaXYgY2xhc3M9ImNpIj48ZGl2PjxkaXYgY2xhc3M9ImNvZGUiPiR7ZXNjKHBzLmNvZGUpfTwvZGl2PjxkaXYgY2xhc3M9Im1ldGEiPiR7ZXNjKHQgPyB0LmxhYmVsIDogJycpfSDCtyAke2VzYyhwcy5tZW5nZSl9IFN0w7xjayR7ZXNjKHJlY2hudW5nKX08L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJwciI+JHtlc2MocHIpfTwvZGl2PiR7ZGVsQnRufTwvZGl2PmA7CiAgICB9KS5qb2luKCcnKQogICAgLy8gT2huZSBlaW5lIGVpbnppZ2UgYmVwcmVpc3RlIFBvc2l0aW9uIChvZWZmZW50bGljaGUgU2VpdGUgb2huZSBQcmVpc2ZyZWlnYWJlLCBESU4gMTE4NjUsCiAgICAvLyBQbGF0emhhbHRlci1Nb2R1cykgZW50ZmFlbGx0IGRlciBTdW1tZW5ibG9jayBrb21wbGV0dCAtIGRvcnQgZ2FlYmUgZXMgbmljaHRzIHp1IHN1bW1pZXJlbgogICAgLy8gdW5kICJHZXNhbXQgMCwwMCDigqwiIHdhZXJlIHNjaGxpY2h0IGZhbHNjaC4KICAgICsgKHN1bS5taXRQcmVpcyA\\\/IGA8ZGl2IGNsYXNzPSJzdW0iPgogICAgICAke3N1bS5vaG5lUHJlaXMgPyBgPGRpdiBjbGFzcz0ic3Igb3BlbiI+JHtpYygnaW5mbycpfTxzcGFuPiR7c3VtLm9obmVQcmVpc30gJHtwb3NXb3J0KHN1bS5vaG5lUHJlaXMpfSBhdWYgQW5mcmFnZSDigJQgbmljaHQgaW4gZGVyIFN1bW1lIGVudGhhbHRlbjwvc3Bhbj48L2Rpdj5gIDogJyd9CiAgICAgIDxkaXYgY2xhc3M9InNyIHRvdCI+PGRpdj48ZGl2IGNsYXNzPSJ0Ij5HZXNhbXQ8L2Rpdj48ZGl2IGNsYXNzPSJzIj4ke3N1bS5taXRQcmVpc30gJHtwb3NXb3J0KHN1bS5taXRQcmVpcyl9IMK3ICR7c3VtLnN0dWVja30gU3TDvGNrPC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0idiBtb25vIj4ke2V1cihzdW0uc3VtbWUpfSDigqw8L2Rpdj48L2Rpdj4KICAgIDwvZGl2PmAgOiAnJykgKyAnPC9kaXY+JzsKICAgIGggKz0gYDxidXR0b24gY2xhc3M9ImxpbmtidG4iIGRhdGEtYWN0PSJhZGRwb3MiPiR7aWMoJ3BsdXMnLCAnaWMnKX0gV2VpdGVyZSBQb3NpdGlvbiBoaW56dWbDvGdlbjwvYnV0dG9uPmA7CiAgICBoICs9IGA8Zm9ybSBpZD0id3otZm9ybSIgY2xhc3M9ImZvcm0iIG5vdmFsaWRhdGU+CiAgICAgIDxkaXYgY2xhc3M9ImZsZCI+PGxhYmVsPkZpcm1hIDxzcGFuIGNsYXNzPSJyZXEiPio8L3NwYW4+PC9sYWJlbD48aW5wdXQgZGF0YS1rPSJmaXJtYSIgdmFsdWU9IiR7ZXNjKHN0YXRlLmtvbnRha3QuZmlybWEpfSIgYXV0b2NvbXBsZXRlPSJvcmdhbml6YXRpb24iLz48L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iZmxkIj48bGFiZWw+QW5zcHJlY2hwYXJ0bmVyIDxzcGFuIGNsYXNzPSJyZXEiPio8L3NwYW4+PC9sYWJlbD48aW5wdXQgZGF0YS1rPSJuYW1lIiB2YWx1ZT0iJHtlc2Moc3RhdGUua29udGFrdC5uYW1lKX0iIGF1dG9jb21wbGV0ZT0ibmFtZSIvPjwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJmbGQiPjxsYWJlbD5FLU1haWwgPHNwYW4gY2xhc3M9InJlcSI+Kjwvc3Bhbj48L2xhYmVsPjxpbnB1dCBkYXRhLWs9ImVtYWlsIiB0eXBlPSJlbWFpbCIgdmFsdWU9IiR7ZXNjKHN0YXRlLmtvbnRha3QuZW1haWwpfSIgYXV0b2NvbXBsZXRlPSJlbWFpbCIvPjxzcGFuIGNsYXNzPSJlcnJtc2ciIGlkPSJ3ei1lcnItZW1haWwiPjwvc3Bhbj48L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iZmxkIj48bGFiZWw+VGVsZWZvbjwvbGFiZWw+PGlucHV0IGRhdGEtaz0idGVsZWZvbiIgdHlwZT0idGVsIiB2YWx1ZT0iJHtlc2Moc3RhdGUua29udGFrdC50ZWxlZm9uKX0iIGF1dG9jb21wbGV0ZT0idGVsIi8+PC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImZsZCBmdWxsIj48bGFiZWw+V3Vuc2NodGVybWluIC8gUHJvamVrdCAob3B0aW9uYWwpPC9sYWJlbD48aW5wdXQgZGF0YS1rPSJ0ZXJtaW4iIHZhbHVlPSIke2VzYyhzdGF0ZS5rb250YWt0LnRlcm1pbil9Ii8+PC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImZsZCBmdWxsIj48bGFiZWw+U29uZGVyYW5mb3JkZXJ1bmdlbiAob3B0aW9uYWwpPC9sYWJlbD48dGV4dGFyZWEgZGF0YS1rPSJmcmVpdGV4dCIgcGxhY2Vob2xkZXI9InouIEIuIGJlc29uZGVyZSBUb2xlcmFuemVuLCB3ZWl0ZXJlIFplcnRpZmlrYXRlLCBMaWVmZXJiZWRpbmd1bmdlbiI+JHtlc2Moc3RhdGUua29udGFrdC5mcmVpdGV4dCl9PC90ZXh0YXJlYT48L2Rpdj4KICAgIDwvZm9ybT5gOwogICAgLy8gRGllIFBsYW5za2l6emUgd2lyZCBhdXMgZGVyIExpdmUtWmVpY2hudW5nIGRlcyBha3R1ZWxsZW4gU3RhbmRlcyBnZWJhdXQuIEZ1ZXIgZGllCiAgICAvLyBudXJGbGFuc2NoLVR5cGVuIChCbGluZGRlY2tlbC9LbGFtbWVyLCBBYnNjaG5pdHQgRCkgZ2lidCBlcyBub2NoIGtlaW5lIGJlbWFzc3RlCiAgICAvLyBaZWljaG51bmcgLT4gYnVpbGREYXRhc2hlZXQoKSBoYWV0dGUgbmljaHRzIHp1IHJlbmRlcm4gdW5kIGRlciBCdXR0b24gbGllZmUgaW5zCiAgICAvLyBMZWVyZS4gRGVzaGFsYiBudXIgYW5iaWV0ZW4sIHdlbm4gd2lya2xpY2ggZWluZSBaZWljaG51bmcgZXhpc3RpZXJ0LgogICAgY29uc3QgaGF0U2tpenplID0gISEoc3RhdGUudHlwICYmIHBhcmFtc0ZvcihzdGF0ZSkpOwogICAgaCArPSBgPGRpdiBjbGFzcz0ibmF2IiBzdHlsZT0icG9zaXRpb246c3RhdGljO2JveC1zaGFkb3c6bm9uZTtib3JkZXI6bm9uZTtwYWRkaW5nOjA7bWFyZ2luLXRvcDo2cHgiPgogICAgICAke2hhdFNraXp6ZSA\\\/IGA8YnV0dG9uIGNsYXNzPSJidG4gZ2hvc3QiIGRhdGEtYWN0PSJwZGYiPiR7aWMoJ3BkZicsICdpYycpfSBQbGFuc2tpenplIGFscyBQREY8L2J1dHRvbj5gIDogJyd9CiAgICAgIDxidXR0b24gY2xhc3M9ImJ0biBnaG9zdCIgZGF0YS1hY3Q9InNoYXJlIj4ke2ljKCdzaGFyZScsICdpYycpfSAke3Bvcy5sZW5ndGggPiAxID8gJ1Bvc2l0aW9uc2xpbmtzIGtvcGllcmVuJyA6ICdLb25maWd1cmF0aW9uIHRlaWxlbid9PC9idXR0b24+PC9kaXY+CiAgICAke2hhdFNraXp6ZSA\\\/ICc8cCBjbGFzcz0iaGVscGVyIj5UaXBwOiBMYWRlIGRpZSBQbGFuc2tpenplIGFscyBQREYgaGVydW50ZXIgdW5kIGjDpG5nIHNpZSBkZWluZXIgQW5mcmFnZS1NYWlsIGFuIOKAlCBGaXJtYSBXZWlzcyBiZWtvbW10IGRhbWl0IGRpcmVrdCBkaWUgZmVydGlnZSBTa2l6emUgbWl0IGFsbGVuIE1hw59lbi48L3A+JyA6ICcnfWA7CiAgICAvLyBEZXIgU2F0eiAiTWHDn2UgRElOIDMyNjc2IC4uLiBzaW5kIGZpbmFsIiBnaWx0IE5JQ0hULCBzb2JhbGQgZWluZSBQb3NpdGlvbiBlaW5lbgogICAgLy8gbWFzc2VGb2xndC1UeXAgKENGL0NGSSkgZW50aGFlbHQgLSBmdWVyIGRpZSBnaWJ0IGVzIHVlYmVyaGF1cHQga2VpbmUgTWFzc2UuIFNvbnN0CiAgICAvLyBzdHVlbmRlIGhpZXIgImZpbmFsIiB1bmQgendlaSBaZW50aW1ldGVyIHdlaXRlciBvYmVuICJNYcOfZSBmb2xnZW4iLiBEZXNoYWxiIGRlbgogICAgLy8gVW1mYW5nIGRlciBGaW5hbC1BdXNzYWdlIGFuIGRlbiB0YXRzYWVjaGxpY2hlbiBQb3NpdGlvbmVuIGF1c3JpY2h0ZW4uCiAgICAvLyBTb2JhbGQgb2JlbiBlaW4gR2VzYW10YmV0cmFnIHN0ZWh0LCBkYXJmIGhpZXIgbmljaHQgbWVociAiUHJlaXNlIHdlcmRlbiBpbmRpdmlkdWVsbAogICAgLy8gYW5nZWJvdGVuIiBzdGVoZW4gLSBkYXMgd2lkZXJzcHJhZWNoZSBkZXIgU3VtbWUgendlaSBaZW50aW1ldGVyIGRhcnVlYmVyLiBEZXIgU2F0egogICAgLy8gYmxlaWJ0IG51ciBmdWVyIGRlbiBGYWxsIG9obmUgamVkZW4gYmVsZWd0ZW4gUHJlaXMuCiAgICBoICs9IGA8ZGl2IGNsYXNzPSJub3RlLXBsaCI+JHtpYygnaW5mbycpfTxzcGFuPiR7c3VtLm1pdFByZWlzCiAgICAgID8gJ0RpZSBnZXplaWd0ZW4gQmV0csOkZ2Ugc3RhbW1lbiBhdXMgZGVyIGhpbnRlcmxlZ3RlbiBQcmVpc2xpc3RlIHZvbiBGaXJtYSBXZWlzcyB1bmQgd2VyZGVuIG1pdCBkZW0gQW5nZWJvdCB2ZXJiaW5kbGljaC4nCiAgICAgIDogJ1ByZWlzZSB3ZXJkZW4gaW5kaXZpZHVlbGwgYW5nZWJvdGVuLid9IE5pY2h0IGJlbGVndGUgTWHDn2Ugb2RlciBBcnRpa2VsbnVtbWVybiBlcmfDpG56dCBGaXJtYSBXZWlzcyBpbSBBbmdlYm90OyB3aWRlcnNwcsO8Y2hsaWNoZSBvZGVyIG5pY2h0IGdlbGllZmVydGUgQmVyZWljaGUgYmxlaWJlbiBnZXNwZXJydCB1bmQgd2VyZGVuIG5pY2h0IGdlc2Now6R0enQuPC9zcGFuPjwvZGl2PmA7CiAgICByZXR1cm4gaDsKICB9CgogIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJldmlldyAqLwogIGxldCBwcmljZUN1ciA9IG51bGwsIHByaWNlUkFGID0gbnVsbDsKICBmdW5jdGlvbiBhbmltYXRlUHJpY2UoZWwsIHRvKSB7CiAgICBpZiAoIWVsKSByZXR1cm47IGNhbmNlbEFuaW1hdGlvbkZyYW1lKHByaWNlUkFGKTsKICAgIC8vIEJlaW0gZXJzdGVuIFJlbmRlcm4gZGVuIGVjaHRlbiBCZXRyYWcgc29mb3J0IGFuemVpZ2VuLiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUKICAgIC8vIHdpcmQgaW4gbm9jaCBuaWNodCBzaWNodGJhcmVuIGlGcmFtZXMgZ2Vkcm9zc2VsdDsgbWl0IFN0YXJ0d2VydCAwLDAwIHN0YW5kCiAgICAvLyBzb25zdCBpbSB6d2VpdGVuIFByZWlzYmVyZWljaCB2b3IgZGVtIFNjcm9sbGVuIGVpbiBmYWxzY2hlciBTdMO8Y2twcmVpcy4KICAgIGlmIChwcmljZUN1ciA9PSBudWxsKSB7CiAgICAgIGVsLnRleHRDb250ZW50ID0gZXVyKHRvKTsKICAgICAgcHJpY2VDdXIgPSB0bzsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgZnJvbSA9IHByaWNlQ3VyLCB0MCA9IHBlcmZvcm1hbmNlLm5vdygpLCBkdXIgPSAzODA7CiAgICAoZnVuY3Rpb24gdGljayh0KSB7CiAgICAgIGNvbnN0IGsgPSBNYXRoLm1pbigxLCAodCAtIHQwKSAvIGR1ciksIGUgPSAxIC0gTWF0aC5wb3coMSAtIGssIDMpLCB2ID0gZnJvbSArICh0byAtIGZyb20pICogZTsKICAgICAgZWwudGV4dENvbnRlbnQgPSBldXIodik7CiAgICAgIGlmIChrIDwgMSkgcHJpY2VSQUYgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGljayk7IGVsc2UgcHJpY2VDdXIgPSB0bzsKICAgIH0pKHQwKTsKICB9CgogIC8qICJaZWljaG51bmcgZm9sZ3QiLUthcnRlIGZ1ZXIgYWxsZSBUeXBlbiBvaG5lICh2b2xsc3RhZW5kaWdlKSBNYXNzcXVlbGxlLgogICAqIFp3ZWkgRmFlbGxlLCBiZXd1c3N0IGdldHJlbm50OgogICAqICBhKSBudXJGbGFuc2NoIChCbGluZGRlY2tlbC9LbGFtbWVyLCBBYnNjaG5pdHQgRCk6IERlciBGbGFuc2NoLcOYIElTVCBiZWxlZ3QsIGRlciBSZXN0CiAgICogICAgIGZlaGx0IC0+IEthcnRlIHplaWd0IGRlbiBGbGFuc2NoLcOYICsgd2FzIHNvbnN0IGdlc2ljaGVydCBpc3QsIGFsbGVzIGFuZGVyZSAiZm9sZ3QiLgogICAqICBiKSBtYXNzZUZvbGd0IChDRi9DRkksIEFic2Nobml0dCBHKTogRXMgaXN0IEdBUiBOSUNIVFMgYmVsZWd0IC0ga2VpbiBGbGFuc2NoLcOYLCBrZWluZQogICAqICAgICBOZW5ud2VpdGUuIERlc2hhbGIgaGllciBLRUlOIGZsYW5zY2hGb3IoKTogZGFzIHd1ZXJkZSBzdHVtcGYgZGllIGVyc3RlIEZsYW5zY2gtCiAgICogICAgIGdyb2Vzc2UgKOKMgDI1KSBhdXMgZGVyIExpc3RlIHppZWhlbiB1bmQgYWxzIENGLU1hc3MgYW56ZWlnZW4uIEdlemVpZ3Qgd2lyZCBudXIsIHdhcwogICAqICAgICBkZXIgS3VuZGUgc2VsYnN0IGdld2FlaGx0IGhhdCAoV2Vya3N0b2ZmL09iZXJmbGFlY2hlL0RpY2h0dW5nKS4KICAgKiBJbiBiZWlkZW4gRmFlbGxlbiBiZXd1c3N0IEtFSU5FIFNWRy1aZWljaG51bmc6IGRyYXcuanMgd3VlcmRlIG9obmUgTWFzc2Ugc3RpbGwgYXVmIHNlaW5lCiAgICogRGVmYXVsdHMgKOKMgDI1IC8gczEsNSAvIEwxMDApIHp1cnVlY2tmYWxsZW4gdW5kIGRlbSBLdW5kZW4gZXJmdW5kZW5lIE1hc3NlIHplaWdlbi4gKi8KICBmdW5jdGlvbiB6ZWljaG51bmdGb2xndENhcmQodCkgewogICAgY29uc3QgbWFzc2VGb2xndCA9IGlzdE1hc3NlRm9sZ3QodCk7CiAgICAvLyBFaW5lbiBGbGFuc2NoLcOYIGdpYnQgZXMgTlVSIGJlaSBkZW4gbnVyRmxhbnNjaC1UeXBlbiAoQmxpbmRkZWNrZWwvS2xhbW1lcikuIEZ1ZXIgZGllCiAgICAvLyBSZWR1emllcnVuZyAoTmFjaHBydWVmLUJlZnVuZCBhKSB3YWVyZSBmbGFuc2NoRm9yKHN0YXRlKSBkaWUgZXJzdGUgRmxhbnNjaGdyb2Vzc2UgZGVyCiAgICAvLyBMaXN0ZSAo4oyAMjUpIC0gZWluIGVyZnVuZGVuZXMgTWFzcy4gRGVzaGFsYiBoaWVyIGdlemllbHQgbnVyIGJlaSBudXJGbGFuc2NoIHppZWhlbi4KICAgIGNvbnN0IGYgPSBpc3ROdXJGbGFuc2NoKHQpID8gZmxhbnNjaEZvcihzdGF0ZSkgOiBudWxsOwogICAgY29uc3Qgcm93cyA9IFtdOwogICAgaWYgKGYpIHJvd3MucHVzaChbJ0ZsYW5zY2gt4oyAJywgZi5sYWJlbCArICcgbW0nXSk7CiAgICBpZiAoaXN0S2xhbW1lcih0KSkgewogICAgICBjb25zdCBrdCA9IGtsYW1tZXJUeXBPYmooc3RhdGUua2xhbW1lclR5cCk7IGlmIChrdCkgcm93cy5wdXNoKFsnS2xhbW1lcnR5cCcsIGt0LmxhYmVsICsgJyDigJMgJyArIGt0LnN1Yl0pOwogICAgICBpZiAoZiAmJiBmLmtsYW1tZXJBKSByb3dzLnB1c2goWydNYcOfIEEnLCBmLmtsYW1tZXJBW3N0YXRlLmtsYW1tZXJUeXBdID09IG51bGwgPyAnYXVmIEFuZnJhZ2UnIDogZm10TU0oZi5rbGFtbWVyQVtzdGF0ZS5rbGFtbWVyVHlwXSkgKyAnIG1tJ10pOwogICAgICBjb25zdCBtdSA9IChELmtsYW1tZXJNdXR0ZXJuIHx8IFtdKS5maW5kKG0gPT4gbS5pZCA9PT0gc3RhdGUua2xhbW1lck11dHRlcik7IGlmIChtdSkgcm93cy5wdXNoKFsnTXV0dGVyJywgbXUubGFiZWxdKTsKICAgIH0KICAgIC8vIERlY2tlbHN0YWVya2UgTCBpc3Qgc2VpdCBSdW5kZSA1IGJlbGVndDogRGllIFdlcnRlIGluIGRhdGEuanMgKEJMSU5EREVDS0VMX0wpCiAgICAvLyBzdGFtbWVuIGF1cyBkZXIgV2Vpc3MtRGF0ZWkgIk1hc3NlIEtsZW1tZW4sIEJsaW5kZGVja2VsLnhsc3giICgyMi4wNy4yMDI2KSB1bmQKICAgIC8vIGR1ZXJmZW4gZGVtIEt1bmRlbiBnZXplaWd0IHdlcmRlbi4gbnVsbCAoRmxhbnNjaCAyODYsMS8zMTkvMzM4KSBiZWRldXRldAogICAgLy8gImF1ZiBBbmZyYWdlIiAtIGRlciBudWxsLUZhbGwgc3RldWVydCBhdWNoIGluIHJlbmRlclN0ZXA0RmxhbnNjaCBkaWUgS2VubnplaWNobnVuZwogICAgLy8gIndlaXRlcmUgTWHDn2UgZm9sZ2VuIi4KICAgIGlmICh0LnN2Z1R5cGUgPT09ICdibGluZGRlY2tlbCcpIHJvd3MucHVzaChbJ0RlY2tlbHN0w6Rya2UgTCcsIGYgJiYgZi5ibGluZFRoayAhPSBudWxsID8gZm10TU0oZi5ibGluZFRoaykgKyAnIG1tJyA6ICdhdWYgQW5mcmFnZSddKTsKICAgIC8vIFJlZHV6aWVydW5nIG9obmUgendlaXRlbiDDmCAoTmFjaHBydWVmLUJlZnVuZCBhKTogZGVyIEVSU1RFIMOYIGlzdCBiZWxlZ3QgKHJlaWhlK2dyb2Vzc2UpLAogICAgLy8gbnVyIGRlciDDmCwgYXVmIGRlbiByZWR1emllcnQgd2lyZCwgZmVobHQuIEVocmxpY2ggemVpZ2VuLCB3YXMgZGEgaXN0IC0gZGVyIHp3ZWl0ZSDDmAogICAgLy8gc3RlaHQgYXVmICJmb2xndCIsIHN0YXR0IGlobiBhdXMgZGVtIEZha3RvciAwLjY2IHp1IGVyZmluZGVuLgogICAgaWYgKHQuc3ZnVHlwZSA9PT0gJ3JlZHV6aWVydW5nJykgewogICAgICBjb25zdCByd1IgPSByb3dGb3Ioc3RhdGUpOwogICAgICBpZiAocndSKSByb3dzLnB1c2goWydSZWR1emllcnQgdm9uJywgbGJsKHJ3UikgKyAnIMK3IOKMgCAnICsgZm10TU0ob2RPZihyd1IpKSArICcgbW0nXSk7CiAgICAgIHJvd3MucHVzaChbJ1JlZHV6aWVydCBhdWYnLCAnZm9sZ3QnXSk7CiAgICB9CiAgICBpZiAoaXN0Rm9ybU9obmVNYXNzZShzdGF0ZSkpIHJvd3MucHVzaChbJ0JhdWZvcm0nLCAnRm9ybSBUSyDCtyBMMSBuaWNodCBiZW1hw590J10pOwogICAgLy8gRGljaHR1bmdzLUF1w59lbi3ijIAgaGFlbmd0IGFtIEZsYW5zY2gtw5guIEJlaSBtYXNzZUZvbGd0IGdpYnQgZXMga2VpbmVuIC0+IFplaWxlIHdlZ2xhc3NlbiwKICAgIC8vIHN0YXR0IGVpbiAiZm9sZ3QiIHp1IHplaWdlbiwgZGFzIHNvIHR1dCwgYWxzIHNlaSBkaWUgR3JvZXNzZSBzY2hvbiBlaW5nZWdyZW56dC4KICAgIGlmICh0LmRpY2h0dW5nICYmICFtYXNzZUZvbGd0KSByb3dzLnB1c2goWydEaWNodHVuZ3MtQXXDn2VuLeKMgCcsIGYgJiYgZi5nYXNrZXRPRCAhPSBudWxsID8gZm10TU0oZi5nYXNrZXRPRCkgKyAnIG1tJyA6ICdmb2xndCddKTsKICAgIGlmIChtYXNzZUZvbGd0KSByb3dzLnB1c2goWydNYcOfZScsICdmb2xnZW4nXSk7CiAgICAvLyBCZWltIEJhdXRlaWwgIkRpY2h0dW5nIiBnaWJ0IGVzIGtlaW5lbiBFZGVsc3RhaGwtV2Vya3N0b2ZmIChCZXJuZCAxMS4wOC4yMDI2KSAtCiAgICAvLyBkb3J0IHN0ZWh0IHN0YXR0ZGVzc2VuIGRlciBEaWNodHVuZ3N3ZXJrc3RvZmYuCiAgICBpZiAoaXN0RGljaHR1bmdCYXV0ZWlsKHQpKSB7CiAgICAgIGNvbnN0IGREID0gZGljaHRPYmooc3RhdGUuZGljaHR1bmcpOwogICAgICBpZiAoZEQpIHJvd3MucHVzaChbJ0RpY2h0dW5nJywgZEQubGFiZWxdKTsKICAgIH0gZWxzZSB7CiAgICAgIHJvd3MucHVzaChbJ1dlcmtzdG9mZicsIGVmZldlcmtzdG9mZihzdGF0ZSkgfHwgJ2ZvbGd0J10pOwogICAgfQogICAgY29uc3QgbGkgPSByb3dzLm1hcCgoW2ssIHZdKSA9PiBgPGRpdiBjbGFzcz0iY2hpcCI+PGI+JHtlc2Moayl9PC9iPiR7ZXNjKHYpfTwvZGl2PmApLmpvaW4oJycpOwogICAgY29uc3QgaGludCA9IG1hc3NlRm9sZ3QKICAgICAgPyBgPGI+TWHDn2UgdW5kIFplaWNobnVuZyBmb2xnZW4uPC9iPiBGw7xyICR7ZXNjKHQubGFiZWwpfSBsaWVndCB1bnMgbm9jaCBrZWluIGZyZWlnZWdlYmVuZXMKICAgICAgICAgRGF0ZW5ibGF0dCB2b24gRmlybWEgV2Vpc3Mgdm9yLiBTb2JhbGQgZXMgZGEgaXN0LCDDvGJlcm5laG1lbiB3aXIgZGllIE1hw59lIDE6MSB1bmQgZGllIFplaWNobnVuZwogICAgICAgICBiYXV0IHNpY2ggaGllciBhdWYg4oCTIGJpcyBkYWhpbiB6ZWlnZW4gd2lyIGxpZWJlciBuaWNodHMgYWxzIGdlc2Now6R0enRlIE1hw59lLmAKICAgICAgOiBpc3ROdXJGbGFuc2NoKHQpCiAgICAgIC8vIERpZXNlIEthcnRlIGVyc2NoZWludCBudXIsIHdlbm4gcGFyYW1zRm9yKCkga2VpbiBiZWxlZ3RlcyBNYXNzIGdlZnVuZGVuIGhhdC4KICAgICAgLy8gU2VpdCBkZW0gQmxpbmRkZWNrZWwtTmFjaHRyYWcgdm9tIDI3LjA3LjIwMjYgdHJhZWd0IGplZGVyIEZsYW5zY2gtw5ggZWluZQogICAgICAvLyBEZWNrZWxzdGFlcmtlIEwsIHVuZCBzZWl0IEJlcm5kcyBOYWNodHJhZyB2b20gMTEuMDguMjAyNiAoMjg2LDEgLyAzMTkgLyAzMzgpCiAgICAgIC8vIGF1Y2ggamVkZXIgZWluIE1hc3MgQS4gRnVlciBkaWUgbnVyRmxhbnNjaC1UeXBlbiBncmVpZnQgZGllIEthcnRlIGRhbWl0CiAgICAgIC8vIGFrdHVlbGwgbmlyZ2VuZHMgbWVociAtIGRlciBUZXh0IGJsZWlidCBhbHMgTmV0eiBmdWVyIGt1ZW5mdGlnZSBHcm9lc3NlbgogICAgICAvLyBzdGVoZW4sIG5lbm50IGFiZXIga2VpbmUga29ua3JldGVuIEZsYW5zY2gtw5ggbWVociwgZGllIGxhZW5nc3QgYmVsZWd0IHNpbmQuCiAgICAgID8gKGlzdEtsYW1tZXIodCkKICAgICAgICA\\\/IGA8Yj5LbGFtbWVyIGluIGRpZXNlciBHcsO2w59lIG5vY2ggbmljaHQgYmVtYcOfdC48L2I+IEbDvHIgRmxhbnNjaC3ijIAKICAgICAgICAgICAke2VzYyhmID8gZi5sYWJlbCA6ICcnKX0gbW0gbGllZ3QgdW5zIGbDvHIgZGllIEtsYW1tZXJuIGtlaW4gTWHDnyBBIHZvciDigJMKICAgICAgICAgICBkb3J0IGJsZWliZW4gZGllIE1hw59lIGF1ZiBBbmZyYWdlLiBBbmZyYWdlbiBsw6Rzc3Qgc2ljaCBkaWUgR3LDtsOfZSB0cm90emRlbS5gCiAgICAgICAgOiBgPGI+TWHDn2UgZm9sZ2VuLjwvYj4gRsO8ciBGbGFuc2NoLeKMgCAke2VzYyhmID8gZi5sYWJlbCA6ICcnKX0gbW0gbGllZ3QgdW5zIGJpc2hlciBudXIgZGVyCiAgICAgICAgICAgRmxhbnNjaC1EdXJjaG1lc3NlciB2b3Ig4oCTIGRpZSDDvGJyaWdlbiBNYcOfZSByZWljaHQgRmlybWEgV2Vpc3MgbmFjaC5gKQogICAgICA6IGlzdEZvcm1PaG5lTWFzc2Uoc3RhdGUpCiAgICAgID8gYDxiPkZvcm0gVEsgaXN0IGluIGRpZXNlciBHcsO2w59lIG5vY2ggb2ZmZW4uPC9iPiBJbiBkZXIgV2Vpc3MtTWHDn3RhYmVsbGUgc3RlaHQgYmVpCiAgICAgICAgIEwxIGbDvHIgZGllc2UgR3LDtsOfZSBlaW4gU3RyaWNoLCBkYXJhdXMgbMOkc3N0IHNpY2ggZGVyIGt1cnplIEFiZ2FuZyBuaWNodCBiZW1hw59lbi4KICAgICAgICAgV8OkaGxlIEZvcm0gVCDigJMgb2RlciBmcmFnIGRlbiBBYmdhbmcgw7xiZXIg4oCeU29uZGVyYWJtZXNzdW5nIGFuZnJhZ2Vu4oCcIGFuLmAKICAgICAgOiBgPGI+WndlaXRlciBEdXJjaG1lc3NlciBmZWhsdC48L2I+IEbDvHIgZGllICR7ZXNjKHQubGFiZWwpfSBpc3Qgbm9jaCBuaWNodCBnZXfDpGhsdCwgYXVmCiAgICAgICAgIHdlbGNoZSBHcsO2w59lIHJlZHV6aWVydCB3aXJkLiBTb2JhbGQgZGVyIHp3ZWl0ZSBEdXJjaG1lc3NlciBmZXN0c3RlaHQsIGJhdXQgc2ljaCBkaWUKICAgICAgICAgYmVtYcOfdGUgWmVpY2hudW5nIGhpZXIgYXVmIOKAkyBiaXMgZGFoaW4gemVpZ2VuIHdpciBsaWViZXIgbmljaHRzIGFscyBlaW5lIGdlc2Now6R0enRlIFphaGwuYDsKICAgIHJldHVybiBgPGRpdiBjbGFzcz0icHYtaGVhZCI+PHNwYW4gY2xhc3M9ImxibCI+Vm9yc2NoYXU8L3NwYW4+PC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9InB2LXN0YWdlIHB2LXNhbXBsZSIgc3R5bGU9ImRpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47anVzdGlmeS1jb250ZW50OmNlbnRlcjtnYXA6MTRweDtwYWRkaW5nOjI0cHgiPgogICAgICAgIDxkaXYgY2xhc3M9InB2LWNoaXBzIiBzdHlsZT0ianVzdGlmeS1jb250ZW50OmNlbnRlciI+JHtsaX08L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJwdi1zYW1wbGUtaGludCI+JHtpYygnZHJhdycsICdpYycpfTxzcGFuPiR7aGludH08L3NwYW4+PC9kaXY+CiAgICAgIDwvZGl2PmA7CiAgfQoKICBmdW5jdGlvbiByZW5kZXJQcmV2aWV3KCkgewogICAgY29uc3QgYm94ID0gJCgnI3d6LXByZXZpZXcnKTsKICAgIGNvbnN0IHQgPSB0eXBPYmooc3RhdGUudHlwKTsKICAgIGNvbnN0IHAgPSBzdGF0ZS50eXAgPyBwYXJhbXNGb3Ioc3RhdGUpIDogbnVsbDsKICAgIGNvbnN0IHBpID0gcHJpY2VJbmZvKHN0YXRlKTsKICAgIGxldCBzdGFnZTsKICAgIC8vIG1hc3NlRm9sZ3QgKENGL0NGSSkgTVVTUyBoaWVyIG1pdCByZWluOiBwYXJhbXNGb3IoKSBsaWVmZXJ0IG51bGwsIHNvbnN0IGxpZWZlIGRpZQogICAgLy8gVm9yc2NoYXUgaW4gZGVuIGVsc2UtWndlaWcgdW50ZW4gdW5kIHd1ZXJkZSBkaWUgIkJlaXNwaWVsLURhcnN0ZWxsdW5nIiByZW5kZXJuIC0KICAgIC8vIGVpbiBmZXJ0aWcgYmVtYXNzdGVzIEZpdHRpbmcgKOKMgDI5w5cxLDUgLyBGbGFuc2NoIDUwLDUpLiBHZW5hdSBkaWUgWmFobGVuLCBkaWUgZXMKICAgIC8vIGZ1ZXIgQ0YvQ0ZJIG5pY2h0IGdpYnQuCiAgICAvLyBudXJGbGFuc2NoIG1pdCBiZWxlZ3RlbiBNYXNzZW4gKHBhcmFtcyB2b3JoYW5kZW4pIGJla29tbXQgc2VpdCBSdW5kZSA3IChXLTA1OSkKICAgIC8vIGRpZSBlY2h0ZSBaZWljaG51bmc7IG51ciBvaG5lIGJlbGVndGUgTWFzc2UgYmxlaWJ0IGRpZSAiWmVpY2hudW5nIGZvbGd0Ii1LYXJ0ZS4KICAgIGlmIChzdGF0ZS50eXAgJiYgKChpc3ROdXJGbGFuc2NoKHQpICYmICFwKSB8fCBpc3RNYXNzZUZvbGd0KHQpIHx8IGlzdFJlZHV6aWVydW5nT2huZVp3ZWl0T0Qoc3RhdGUpIHx8IGlzdEZvcm1PaG5lTWFzc2Uoc3RhdGUpKSkgeyBzdGFnZSA9IHplaWNobnVuZ0ZvbGd0Q2FyZCh0KTsgfQogICAgZWxzZSBpZiAocCkgewogICAgICBjb25zdCBSID0gd2luZG93LldlaXNzRml0dGluZ1JlbmRlcjsKICAgICAgY29uc3Qgc3ZnU3RyID0gKHN0YXRlLnZpZXcgPT09ICdhbnNpY2h0JyAmJiBSKQogICAgICAgID8gUi5yZW5kZXJGaXR0aW5nKHAsIHsgd2lkdGg6IDc2MCwgaGVpZ2h0OiA0NDAgfSkKICAgICAgICA6IFNWRy5yZW5kZXJGaXR0aW5nKHAsIHsgd2lkdGg6IDc2MCwgaGVpZ2h0OiA0NDAgfSk7CiAgICAgIGNvbnN0IHRvZ2dsZSA9IGA8ZGl2IGNsYXNzPSJwdi1oZWFkIj48c3BhbiBjbGFzcz0ibGJsIj5Wb3JzY2hhdTwvc3Bhbj4KICAgICAgICA8ZGl2IGNsYXNzPSJwdi1hY3Rpb25zIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InB2LXRvZ2dsZSIgcm9sZT0iZ3JvdXAiIGFyaWEtbGFiZWw9IkRhcnN0ZWxsdW5nIj4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iJHtzdGF0ZS52aWV3ID09PSAnemVpY2hudW5nJyA\\\/ICdzZWwnIDogJyd9IiBkYXRhLWFjdD0idmlldyIgZGF0YS1pZD0iemVpY2hudW5nIj5aZWljaG51bmc8L2J1dHRvbj4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iJHtzdGF0ZS52aWV3ID09PSAnYW5zaWNodCcgPyAnc2VsJyA6ICcnfSIgZGF0YS1hY3Q9InZpZXciIGRhdGEtaWQ9ImFuc2ljaHQiPkFuc2ljaHQ8L2J1dHRvbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGJ1dHRvbiBjbGFzcz0icHYtZnNidG4iIGRhdGEtYWN0PSJmcy1vcGVuIiBhcmlhLWxhYmVsPSJWb2xsYmlsZCDDtmZmbmVuIiB0aXRsZT0iVm9sbGJpbGQgKyBab29tIj4ke2ljKCdleHBhbmQnLCAnaWMnKX08L2J1dHRvbj4KICAgICAgICA8L2Rpdj48L2Rpdj5gOwogICAgICBzdGFnZSA9IHRvZ2dsZSArIGA8ZGl2IGNsYXNzPSJwdi1zdGFnZSIgaWQ9Ind6LXN0YWdlIj4ke3N2Z1N0cn08L2Rpdj5gOwogICAgfQogICAgZWxzZSB7CiAgICAgIGNvbnN0IFIwID0gd2luZG93LldlaXNzRml0dGluZ1JlbmRlcjsKICAgICAgY29uc3Qgc2FtcGxlID0gUjAgPyBSMC5yZW5kZXJGaXR0aW5nKHsgdHlwZTonY2xhbXBzdHV0emVuJywgZG46MjUsIG9kOjI5LCB3YWxsOjEuNSwgbGVuZ3RoOjM2LCBmbGFuZ2VPZDo1MC41LCBnYXNrZXRNYXRlcmlhbDonRVBETScsIHN1cmZhY2U6J0gzJywgd2Vya3N0b2ZmOicxLjQ0MDQnIH0sIHsgd2lkdGg6NzYwLCBoZWlnaHQ6NDQwIH0pIDogJyc7CiAgICAgIHN0YWdlID0gYDxkaXYgY2xhc3M9InB2LXN0YWdlIHB2LXNhbXBsZSI+JHtzYW1wbGV9CiAgICAgICAgPGRpdiBjbGFzcz0icHYtc2FtcGxlLWhpbnQiPiR7aWMoJ2RyYXcnLCAnaWMnKX08c3Bhbj48Yj5CZWlzcGllbC1EYXJzdGVsbHVuZy48L2I+IFfDpGhsZSBsaW5rcyBkaWUgQW53ZW5kdW5nIOKAlCBkYW5uIGJhdXQgc2ljaCBoaWVyIGRlaW4gRml0dGluZyBsaXZlIG1pdCBaZWljaG51bmcgdW5kIGJlbGVndGVuIE1hw59lbiBhdWYuPC9zcGFuPjwvZGl2PjwvZGl2PmA7CiAgICB9CgogICAgbGV0IHByaWNlSHRtbCA9ICcnOwogICAgaWYgKHN0YXRlLnR5cCkgewogICAgICBpZiAocGkubW9kZSA9PT0gJ2FuZnJhZ2UnKSB7CiAgICAgICAgLy8gQmVncnVlbmR1bmcga29tbXQgYXVzIHByaWNlSW5mbygpIC0gamUgbmFjaCBGYWxsIERJTiAxMTg2NSwgZmVobGVuZGVyIEdydW5kcHJlaXMKICAgICAgICAvLyBvZGVyIG51ckZsYW5zY2gtVHlwIG9obmUgUHJlaXNzdGFmZmVsIG5hY2ggRmxhbnNjaC3DmC4KICAgICAgICBwcmljZUh0bWwgPSBgPGRpdiBjbGFzcz0icHYtcHJpY2UgYW5mcmFnZSI+PGRpdj48ZGl2IGNsYXNzPSJhbXQiPkF1ZiBBbmZyYWdlPC9kaXY+PGRpdiBjbGFzcz0ic3ViIj4ke2VzYyhwaS5ncnVuZCB8fCAnRmlybWEgV2Vpc3Mga2Fsa3VsaWVydCBpbmRpdmlkdWVsbC4nKX08L2Rpdj48L2Rpdj48L2Rpdj5gOwogICAgICB9IGVsc2UgaWYgKHBpLnBsYXR6aGFsdGVyKSB7CiAgICAgICAgcHJpY2VIdG1sID0gYDxkaXYgY2xhc3M9InB2LXByaWNlIGFuZnJhZ2UiPjxkaXY+PGRpdiBjbGFzcz0iYW10Ij5BdWYgQW5mcmFnZTwvZGl2PjxkaXYgY2xhc3M9InN1YiI+RmlybWEgV2Vpc3Mga2Fsa3VsaWVydCBpbmRpdmlkdWVsbC48L2Rpdj48L2Rpdj48L2Rpdj5gOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFNvYmFsZCBlaW4gQ2hhcmdlbmF1ZnByZWlzIGFuZmFlbGx0LCBpc3QgU3R1ZWNrcHJlaXMgbWFsIE1lbmdlIE5JQ0hUIG1laHIgZGllCiAgICAgICAgLy8gR2VzYW10c3VtbWUuIERhcyBtdXNzIGRhc3RlaGVuLCBzb25zdCB3aXJrdCBkaWUgUmVjaG51bmcgZmFsc2NoLgogICAgICAgIGNvbnN0IGNoYXJnZUhpbndlaXMgPSBwaS5jaGFyZ2VBdWZwcmVpcwogICAgICAgICAgPyAnIMK3IHBsdXMgZWlubWFsaWcgJyArIGV1cihwaS5jaGFyZ2VBdWZwcmVpcykgKyAnIOKCrCBqZSBDaGFyZ2UnCiAgICAgICAgICA6ICcnOwogICAgICAgIHByaWNlSHRtbCA9IGA8ZGl2IGNsYXNzPSJwdi1wcmljZSI+PGRpdj48ZGl2IGNsYXNzPSJhbXQiPjxzcGFuIGlkPSJ3ei1hbW91bnQiPiR7ZXVyKHBpLnN0dWVjayl9PC9zcGFuPjxzcGFuIGNsYXNzPSJjdXIiPuKCrCAvIFN0w7xjazwvc3Bhbj48L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InN1YiI+JHtzdGF0ZS5tZW5nZX0gU3TDvGNrJHtwaS5yYWJhdHQgPyAnIMK3IOKIkicgKyBwaS5yYWJhdHQgKyAnICUgYWIgJyArIHBpLmFiIDogJyd9JHtjaGFyZ2VIaW53ZWlzfTwvZGl2PjwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0idG90YWwiPjxkaXYgY2xhc3M9InQiPkdlc2FtdDwvZGl2PjxkaXYgY2xhc3M9InYgbW9ubyI+JHtldXIocGkuZ2VzYW10KX0g4oKsPC9kaXY+PC9kaXY+PC9kaXY+YDsKICAgICAgfQogICAgfQoKICAgIGxldCBjaGlwcyA9ICcnOwogICAgaWYgKHN0YXRlLnR5cCkgewogICAgICBjb25zdCBydyA9IHJvd0ZvcihzdGF0ZSk7CiAgICAgIGNvbnN0IHBhcnRzID0gW107CiAgICAgIGlmIChzdGF0ZS5ub3JtKSBwYXJ0cy5wdXNoKFsnTm9ybScsIEQubm9ybWVuLmZpbmQobiA9PiBuLmlkID09PSBzdGF0ZS5ub3JtKS5sYWJlbF0pOwogICAgICBpZiAoaXN0TnVyRmxhbnNjaCh0KSkgewogICAgICAgIGNvbnN0IGYgPSBmbGFuc2NoRm9yKHN0YXRlKTsKICAgICAgICBpZiAoZikgcGFydHMucHVzaChbJ0ZsYW5zY2gt4oyAJywgZi5sYWJlbCArICcgbW0nXSk7CiAgICAgICAgaWYgKGlzdEtsYW1tZXIodCkpIHsKICAgICAgICAgIGNvbnN0IGt0ID0ga2xhbW1lclR5cE9iaihzdGF0ZS5rbGFtbWVyVHlwKTsgaWYgKGt0KSBwYXJ0cy5wdXNoKFsnS2xhbW1lcnR5cCcsIGt0LmxhYmVsXSk7CiAgICAgICAgICBjb25zdCBtdSA9IChELmtsYW1tZXJNdXR0ZXJuIHx8IFtdKS5maW5kKG0gPT4gbS5pZCA9PT0gc3RhdGUua2xhbW1lck11dHRlcik7IGlmIChtdSkgcGFydHMucHVzaChbJ011dHRlcicsIG11LmxhYmVsXSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGVsc2UgaWYgKGlzQ29ubmVjdCh0KSAmJiBydykgewogICAgICAgIHBhcnRzLnB1c2goWydHcsO2w59lJywgbGJsKHJ3KV0pOwogICAgICAgIC8vIEJlcm5kIDI3LjA3LjIwMjY6IHN0YXR0IGRlciBIZXJzdGVsbGVyc2VyaWUgbnVyIG5vY2ggZGFzIEvDvHJ6ZWwuCiAgICAgICAgcGFydHMucHVzaChbJ1R5cCcsIHQuaWRdKTsKICAgICAgICBwYXJ0cy5wdXNoKFsnRGUgLyBEaScsIGZtdE1NKHJ3LkRlKSArICcgLyAnICsgZm10TU0ocncuRGkpICsgJyBtbSddKTsKICAgICAgICBpZiAodC5pZCA9PT0gJ0NGJykgewogICAgICAgICAgcGFydHMucHVzaChbJ0RmIC8gTCcsIGZtdE1NKHJ3LkRmKSArICcgLyAnICsgZm10TU0oc3RhdGUuY29ubmVjdExhZW5nZSkgKyAnIG1tJ10pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb25zdCBlbmQgPSBjb25uZWN0RW5kRm9yKHN0YXRlLCBydyk7CiAgICAgICAgICBjb25zdCB1cHBlciA9IEQubWFzc2UuY29ubmVjdC5jZmkub2JlcmVyQW5zY2hsdXNzOwogICAgICAgICAgcGFydHMucHVzaChbJ0Fuc2NobHVzcycsIHN0YXRlLmNvbm5lY3RBbnNjaGx1c3MgPT09ICdUQycgPyAnVHJpLUNsYW1wJyA6ICdCdXR0IFdlbGQnXSk7CiAgICAgICAgICBpZiAoZW5kKSBwYXJ0cy5wdXNoKFsnWSAvIEwnLCBmbXRNTShydy5ZKSArICcgLyAnICsgZm10TU0oZW5kLkwpICsgJyBtbSddKTsKICAgICAgICAgIHBhcnRzLnB1c2goWydPYmVyZXIgQW5zY2hsdXNzIERlIC8gRGknLCBmbXRNTSh1cHBlci5EZSkgKyAnIC8gJyArIGZtdE1NKHVwcGVyLkRpKSArICcgbW0nXSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGVsc2UgaWYgKHJ3KSB7CiAgICAgICAgcGFydHMucHVzaChbJ0dyw7bDn2UnLCBsYmwocncpICsgJyDCtyDijIAnICsgZm10TU0ob2RPZihydykpICsgJ8OXJyArIGZtdE1NKHdhbGxPZihydykpXSk7CiAgICAgICAgLy8gVENEOiBmZXN0ZSBIb2VoZSBzdGF0dCBLSy9LTCAtPiBhbHMgZWlnZW5lciBDaGlwLCBzb25zdCBmYWVsbHQgZGFzIGVpbnppZ2UKICAgICAgICAvLyBMYWVuZ2VubWFzcyBkZXMgU3R1dHplbnMgaW4gZGVyIFZvcnNjaGF1IGdhbnogd2VnLgogICAgICAgIGNvbnN0IGxnID0gbGFlbmdlT2YodCwgcncsIHN0YXRlLmxhZW5nZVZhcmlhbnRlKTsKICAgICAgICBpZiAobGcgJiYgbGcubGFiZWwgPT09ICdoJykgcGFydHMucHVzaChbJ0jDtmhlJywgZm10TU0obGcud2VydCkgKyAnIG1tJ10pOwogICAgICB9CiAgICAgIC8vIFR5cCBEIChCYXV0ZWlsIERpY2h0dW5nKToga2VpbiBFZGVsc3RhaGwtV2Vya3N0b2ZmLCBrZWluZSBPYmVyZmxhZWNoZSAtCiAgICAgIC8vIGRpZSBEaWNodHVuZyBzZWxic3Qga29tbXQgZ2xlaWNoIGFscyBlaWdlbmVyIENoaXAgKEJlcm5kIDExLjA4LjIwMjYpLgogICAgICBpZiAoIWlzdERpY2h0dW5nQmF1dGVpbCh0KSkgewogICAgICAgIHBhcnRzLnB1c2goWydXZXJrc3RvZmYnLCBlZmZXZXJrc3RvZmYoc3RhdGUpIHx8ICdmb2xndCddKTsKICAgICAgICAvLyBSMi00OiBEaWUgS2xhbW1lciBoYXQga2VpbmUgT2JlcmZsYWVjaGUgLT4ga2VpbmVuIE9iZXJmbGFlY2hlbi1DaGlwIHplaWdlbi4KICAgICAgICBpZiAoIWlzdEtsYW1tZXIodCkpIHBhcnRzLnB1c2goWydPYmVyZmzDpGNoZScsIHN0YXRlLm9iZXJmbGFlY2hlXSk7CiAgICAgIH0KICAgICAgaWYgKHQgJiYgdC5kaWNodHVuZyAmJiBzdGF0ZS5kaWNodHVuZykgcGFydHMucHVzaChbJ0RpY2h0dW5nJywgZGljaHRPYmooc3RhdGUuZGljaHR1bmcpLmxhYmVsXSk7CiAgICAgIC8vIEVpbnNhdHpncmVuemVuIHNpbmQgbmFjaCBST0hSLUF1c3NlbmR1cmNobWVzc2VyIGdlc3RhZmZlbHQgKEQuZWluc2F0ei5kcnVja0JhbmRzKS4KICAgICAgLy8gQmVpIG51ckZsYW5zY2gtVHlwZW4gZmVobHQgZGVyIC0+IENoaXAgZW50ZmFlbGx0LCBzdGF0dCBkYXMgZmFsc2NoZSBCYW5kIHp1IHplaWdlbi4KICAgICAgLy8gVENEIChkaWNrd2FuZGlnKTogRGllIEJhZW5kZXIgc2luZCBkaWUgQUQtU3RhZmZlbCBkZXIgRFVFTk5XQU5ESUdFTiBESU4tMzI2NzYtUmVpaGUKICAgICAgLy8gKCJSb2hyLUFEIDYsMzUgYmlzIDQyLDQgbW0iIHVzdy4pLiBGdWVyIGRlbiBkaWNrd2FuZGlnZW4gU3R1dHplbiAoV2FuZCA0IG1tKSBsaWVndAogICAgICAvLyBLRUlORSBEcnVja2FuZ2FiZSB2b3IgLSB3ZWRlciBiZWkgQmVybmQgbm9jaCBpbSB6aW1tZXJsaW4tQXVzenVnLiBEZW4gZGlja3dhbmRpZ2VuCiAgICAgIC8vIGF1c3NlbkQgaW4gZGllc2UgU3RhZmZlbCB6dSBzdGVja2VuIHdhZXJlIGdlcmF0ZW4gdW5kIHRlaWxzIHNvZ2FyIGFid2VpY2hlbmQKICAgICAgLy8gKFRDRC9ETjQwOiBhdXNzZW5EIDQ2IC0+IDE2IGJhciwgZHVlbm53YW5kaWcg4oyANDEgLT4gMjUgYmFyKS4gRGVzaGFsYiAiZm9sZ3QiLgogICAgICBpZiAodCAmJiB0LmlkID09PSAnVEMnICYmIHJ3ICYmIEQuZWluc2F0eiAmJiBELmVpbnNhdHouZHJ1Y2tCYW5kcykgewogICAgICAgIGNvbnN0IGViID0gRC5laW5zYXR6LmRydWNrQmFuZHMuZmluZChiID0+IHJ3LnR1YmVPRCA8PSBiLmFkTWF4KTsKICAgICAgICBpZiAoZWIpIHBhcnRzLnB1c2goWydFaW5zYXR6JywgZWIuYmFyICsgJyBiYXIgwrcgJyArIEQuZWluc2F0ei50ZW1wTWluICsgJyBiaXMgJyArIEQuZWluc2F0ei50ZW1wTWF4ICsgJyDCsEMnXSk7CiAgICAgIH0gZWxzZSBpZiAodCAmJiB0Lm5vcm0gPT09ICdkaW4xMTg2NScpIHsKICAgICAgICBwYXJ0cy5wdXNoKFsnRWluc2F0eicsICdhdWYgQW5mcmFnZSddKTsKICAgICAgfQogICAgICBjb25zdCBwcm9kdWt0QXJ0ID0gYXJ0aWNsZU51bWJlcihzdGF0ZSk7CiAgICAgIC8vIEJlaSBDRi9DRkkgaXN0IGRpZSBBcnRpa2VsLU5yLiBqZXR6dCBpZGVudGlzY2ggbWl0IGRlciBLb25maWd1cmF0aW9ucy1Oci4KICAgICAgLy8gKEJlcm5kIDI3LjA3LjIwMjYpIC0gZGFubiBuaWNodCB6d2VpbWFsIGRhc3NlbGJlIGFuemVpZ2VuLgogICAgICBpZiAocHJvZHVrdEFydCAmJiBwcm9kdWt0QXJ0ICE9PSB0eXBlY29kZShzdGF0ZSkpIHBhcnRzLnB1c2goWydBcnRpa2VsLU5yLicsIHByb2R1a3RBcnRdKTsKICAgICAgY2hpcHMgPSAnPGRpdiBjbGFzcz0icHYtY2hpcHMiPicgKyBwYXJ0cy5tYXAoKFtrLCB2XSkgPT4gYDxzcGFuIGNsYXNzPSJjaGlwIj48Yj4ke2VzYyhrKX08L2I+JHtlc2Modil9PC9zcGFuPmApLmpvaW4oJycpICsgJzwvZGl2Pic7CiAgICB9CgogICAgY29uc3QgY29kZSA9IHN0YXRlLnR5cCA\\\/IHR5cGVjb2RlKHN0YXRlKSA6ICfigJMnLCBwcm9kdWt0QXJ0ID0gc3RhdGUudHlwID8gYXJ0aWNsZU51bWJlcihzdGF0ZSkgOiBudWxsOwogICAgY29uc3QgYXJ0R2xlaWNoQ29kZSA9ICEhcHJvZHVrdEFydCAmJiBwcm9kdWt0QXJ0ID09PSBjb2RlOwogICAgYm94LmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPSJwdi1jYXJkIj4KICAgICAgJHtzdGFnZX0KICAgICAgPGRpdiBjbGFzcz0icHYtdHlwZWNvZGUiPjxzcGFuIGNsYXNzPSJsYmwiPiR7YXJ0R2xlaWNoQ29kZSA\\\/ICdLb25maWd1cmF0aW9ucy0gLyBBcnRpa2VsLU5yLicgOiAnS29uZmlndXJhdGlvbnMtTnIuJ308L3NwYW4+PHNwYW4gY2xhc3M9ImNvZGUiIGlkPSJ3ei1jb2RlIj4ke2VzYyhjb2RlKX08L3NwYW4+CiAgICAgICAgPGJ1dHRvbiBjbGFzcz0iY29weSIgZGF0YS1hY3Q9ImNvcHljb2RlIj4ke2ljKCdjb3B5JywgJ2ljJyl9IGtvcGllcmVuPC9idXR0b24+PC9kaXY+CiAgICAgICR7cHJvZHVrdEFydCAmJiAhYXJ0R2xlaWNoQ29kZSA\\\/IGA8ZGl2IGNsYXNzPSJwdi10eXBlY29kZSI+PHNwYW4gY2xhc3M9ImxibCI+QXJ0aWtlbC1Oci48L3NwYW4+PHNwYW4gY2xhc3M9ImNvZGUiPiR7ZXNjKHByb2R1a3RBcnQpfTwvc3Bhbj48L2Rpdj5gIDogJyd9CiAgICAgICR7cHJpY2VIdG1sfSR7Y2hpcHN9PC9kaXY+YDsKCiAgICBpZiAocGkubW9kZSA9PT0gJ2xpdmUnICYmICFwaS5wbGF0emhhbHRlcikgYW5pbWF0ZVByaWNlKCQoJyN3ei1hbW91bnQnKSwgcGkuc3R1ZWNrKTsgZWxzZSBwcmljZUN1ciA9IG51bGw7CiAgfQoKICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE5hdiAqLwogIGZ1bmN0aW9uIHJlbmRlck5hdigpIHsKICAgIGNvbnN0IG5hdiA9ICQoJyN3ei1uYXYnKTsKICAgIGNvbnN0IGEgPSBhcHBTdGVwcygpLCBpID0gYS5pbmRleE9mKHN0YXRlLnN0ZXApLCBsYXN0ID0gaSA9PT0gYS5sZW5ndGggLSAxOwogICAgY29uc3QgcGkgPSBwcmljZUluZm8oc3RhdGUpOwogICAgY29uc3Qgbm9ybSA9IEQubm9ybWVuLmZpbmQobiA9PiBuLmlkID09PSBzdGF0ZS5ub3JtKTsKICAgIGNvbnN0IG1pbmkgPSBzdGF0ZS50eXAgPyAoKHBpLm1vZGUgPT09ICdsaXZlJyAmJiAhcGkucGxhdHpoYWx0ZXIpCiAgICAgID8gYDxkaXYgY2xhc3M9Im1pbmlwcmljZSI+PHNwYW4gY2xhc3M9ImEgbW9ubyI+JHtldXIocGkuZ2VzYW10KX0g4oKsPC9zcGFuPjxzcGFuIGNsYXNzPSJiIj4ke3N0YXRlLm1lbmdlfSBTdMO8Y2s8L3NwYW4+PC9kaXY+YAogICAgICA6IHBpLm1vZGUgPT09ICdsaXZlJwogICAgICA\\\/IGA8ZGl2IGNsYXNzPSJtaW5pcHJpY2UiPjxzcGFuIGNsYXNzPSJhIj5BdWYgQW5mcmFnZTwvc3Bhbj48c3BhbiBjbGFzcz0iYiI+JHtzdGF0ZS5tZW5nZX0gU3TDvGNrPC9zcGFuPjwvZGl2PmAKICAgICAgOiBgPGRpdiBjbGFzcz0ibWluaXByaWNlIj48c3BhbiBjbGFzcz0iYSI+QXVmIEFuZnJhZ2U8L3NwYW4+PHNwYW4gY2xhc3M9ImIiPiR7ZXNjKG5vcm0gPyBub3JtLmxhYmVsIDogJycpfTwvc3Bhbj48L2Rpdj5gKSA6ICcnOwogICAgY29uc3QgYmFjayA9IGkgPiAwID8gYDxidXR0b24gY2xhc3M9ImJ0biBnaG9zdCIgZGF0YS1hY3Q9ImJhY2siPiR7aWMoJ2Fycm93TCcsICdpYycpfSBadXLDvGNrPC9idXR0b24+YCA6ICc8c3Bhbj48L3NwYW4+JzsKICAgIGxldCBmd2Q7CiAgICBpZiAobGFzdCkgZndkID0gYDxidXR0b24gY2xhc3M9ImJ0biBwcmltYXJ5IHdpZGUiIGRhdGEtYWN0PSJzZW5kIiBpZD0id3otc2VuZCI+QW5mcmFnZSBwZXIgRS1NYWlsIHNlbmRlbiAke2ljKCdhcnJvd1InLCAnaWMnKX08L2J1dHRvbj5gOwogICAgZWxzZSBmd2QgPSBgPGJ1dHRvbiBjbGFzcz0iYnRuIHByaW1hcnkgd2lkZSIgZGF0YS1hY3Q9Im5leHQiICR7Y29tcGxldGUoc3RhdGUuc3RlcCkgPyAnJyA6ICdkaXNhYmxlZCd9PldlaXRlciAke2ljKCdhcnJvd1InLCAnaWMnKX08L2J1dHRvbj5gOwogICAgbmF2LmlubmVySFRNTCA9IGJhY2sgKyBtaW5pICsgZndkOwogICAgaWYgKGxhc3QpIHZhbGlkYXRlU2VuZCgpOwogIH0KCiAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBSRlEgLyBBa3Rpb25lbiAqLwogIGZ1bmN0aW9uIGNvbnRhY3RWYWxpZCgpIHsKICAgIGNvbnN0IGsgPSBzdGF0ZS5rb250YWt0OwogICAgcmV0dXJuIGsuZmlybWEudHJpbSgpICYmIGsubmFtZS50cmltKCkgJiYgL15bXlxzQF0rQFteXHNAXStcLlteXHNAXSskLy50ZXN0KGsuZW1haWwudHJpbSgpKTsKICB9CiAgZnVuY3Rpb24gdmFsaWRhdGVTZW5kKCkgeyBjb25zdCBiID0gJCgnI3d6LXNlbmQnKTsgaWYgKGIpIGIuZGlzYWJsZWQgPSAhY29udGFjdFZhbGlkKCk7IH0KCiAgZnVuY3Rpb24gYmluZEZvcm0oKSB7CiAgICBjb25zdCBmID0gJCgnI3d6LWZvcm0nKTsgaWYgKCFmKSByZXR1cm47CiAgICBmLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWtdJykuZm9yRWFjaChpbnAgPT4gewogICAgICBpbnAuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7CiAgICAgICAgc3RhdGUua29udGFrdFtpbnAuZ2V0QXR0cmlidXRlKCdkYXRhLWsnKV0gPSBpbnAudmFsdWU7CiAgICAgICAgaWYgKGlucC5nZXRBdHRyaWJ1dGUoJ2RhdGEtaycpID09PSAnZW1haWwnKSB7CiAgICAgICAgICBjb25zdCBlbSA9ICQoJyN3ei1lcnItZW1haWwnKTsKICAgICAgICAgIGlmIChlbSkgZW0udGV4dENvbnRlbnQgPSAoaW5wLnZhbHVlICYmICEvXlteXHNAXStAW15cc0BdK1wuW15cc0BdKyQvLnRlc3QoaW5wLnZhbHVlLnRyaW0oKSkpID8gJ0JpdHRlIGfDvGx0aWdlIEUtTWFpbCBlaW5nZWJlbi4nIDogJyc7CiAgICAgICAgfQogICAgICAgIHZhbGlkYXRlU2VuZCgpOwogICAgICB9KTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gcG9zTGluZShwcywgaWR4KSB7CiAgICBjb25zdCB0ID0gdHlwT2JqKHBzLnR5cCksIG4gPSBELm5vcm1lbi5maW5kKHggPT4geC5pZCA9PT0gcHMubm9ybSk7CiAgICBjb25zdCBhbncgPSBELmFud2VuZHVuZ2VuLmZpbmQoYSA9PiBhLmlkID09PSBwcy5hbndlbmR1bmcpOwogICAgLy8gbnVyRmxhbnNjaC1UeXBlbiBoYWJlbiBrZWluZSBOZW5ud2VpdGUgLT4gZ2FyIG5pY2h0IGVyc3QgaW4gZGVuIFJlaWhlbiBzdWNoZW4uCiAgICAvLyByb3dzUXVlbGxlIHN0YXR0IGRlciBmZXN0IHZlcmRyYWh0ZXRlbiBkaW4zMjY3Ni1SZWloZTogc29uc3QgemllaHQgZGllIEFuZnJhZ2UtTWFpbAogICAgLy8gZnVlciBUQ0QgZGllIERVRU5OV0FORElHRU4gTWFzc2UgKEROMjUgLT4g4oyAMjkgeCAxLDUgc3RhdHQg4oyAMzQgeCA0KS4gRGllIE1haWwgZ2VodCBhbgogICAgLy8gV2Vpc3MgdW5kIGlzdCBkaWUgQmVzdGVsbGdydW5kbGFnZSAtIGhpZXIgZGFyZiBrZWluZSBmcmVtZGUgVGFiZWxsZSBncmVpZmVuLgogICAgY29uc3QgcncgPSBpc3ROdXJGbGFuc2NoKHQpID8gbnVsbCA6IHJvd0Zvcihwcyk7CiAgICBjb25zdCByMiA9ICghaXN0TnVyRmxhbnNjaCh0KSAmJiBwcy5ncm9lc3NlMikgPyByb3cyRm9yKHBzKSA6IG51bGw7CiAgICBjb25zdCBudyA9IHBzLm5hY2h3ZWlzZS5tYXAoaWQgPT4gbmFjaHdlaXNMYWJlbEJ5SWQoaWQpKS5maWx0ZXIoQm9vbGVhbikuam9pbignLCAnKSB8fCAn4oCUJzsKICAgIC8vIFplaWxlbnN1bW1lIG1pdCBpbiBkaWUgTWFpbDogT2huZSBzaWUgbXVlc3N0ZSBXZWlzcyBTdHVlY2twcmVpcyBtYWwgTWVuZ2UgbWludXMKICAgIC8vIE1lbmdlbnN0YWZmZWwgdm9uIEhhbmQgbmFjaHJlY2huZW4sIHVuZCBkZXIgR2VzYW10YmV0cmFnIGFtIEVuZGUgZGVyIE1haWwgaGFldHRlCiAgICAvLyBrZWluZSBuYWNodm9sbHppZWhiYXJlbiBFaW56ZWxwb3N0ZW4uCiAgICAvLyBEZXIgQ2hhcmdlbmF1ZnByZWlzIHN0ZWNrdCBpbiBkZXIgUG9zaXRpb25zc3VtbWUsIGFiZXIgbmljaHQgaW0gU3R1ZWNrcHJlaXMuCiAgICAvLyBPaG5lIGRpZXNlbiBadXNhdHoga29lbm50ZSBXZWlzcyBkaWUgWmVpbGUgbmljaHQgbmFjaHJlY2huZW4uCiAgICBjb25zdCBwcmVpcyA9IChwcy5wcmljZS5tb2RlID09PSAnbGl2ZScgJiYgIXBzLnByaWNlLnBsYXR6aGFsdGVyKQogICAgICA\\\/IChldXIocHMucHJpY2Uuc3R1ZWNrKSArICcgRVVSIC8gU3TDvGNrJyArIChwcy5wcmljZS5yYWJhdHQgPyAnIGFiesO8Z2xpY2ggJyArIHBzLnByaWNlLnJhYmF0dCArICcgJSBhYiAnICsgcHMucHJpY2UuYWIgKyAnIFN0w7xjaycgOiAnJykKICAgICAgICAgKyAocHMucHJpY2UuY2hhcmdlQXVmcHJlaXMgPyAnIHp1esO8Z2xpY2ggZWlubWFsaWcgJyArIGV1cihwcy5wcmljZS5jaGFyZ2VBdWZwcmVpcykgKyAnIEVVUiBqZSBDaGFyZ2UnIDogJycpCiAgICAgICAgICsgJyDCtyBQb3NpdGlvbiAnICsgZXVyKHBzLnByaWNlLmdlc2FtdCkgKyAnIEVVUicpCiAgICAgIDogJ2F1ZiBBbmZyYWdlJzsKICAgIGNvbnN0IEwgPSBbXTsKICAgIEwucHVzaCgnLS0tIFBvc2l0aW9uICcgKyAoaWR4ICsgMSkgKyAnIC0tLScpOwogICAgaWYgKGFudykgTC5wdXNoKCdBbndlbmR1bmc6ICcgKyBhbncubGFiZWwpOwogICAgTC5wdXNoKCdLb25maWd1cmF0aW9ucy1Oci46ICcgKyAocHMuY29uZmlndXJhdGlvbkNvZGUgfHwgcHMuY29kZSkpOwogICAgaWYgKHBzLmFydGljbGVOdW1iZXIpIEwucHVzaCgnQXJ0aWtlbC1Oci46ICcgKyBwcy5hcnRpY2xlTnVtYmVyKTsKICAgIEwucHVzaCgnTm9ybTogJyArIChuID8gbi5sYWJlbCArICcgKCcgKyBuLnN1YiArICcpJyA6ICcnKSk7CiAgICBMLnB1c2goJ0JhdXRlaWw6ICcgKyAodCA\\\/IHQubGFiZWwgOiAnJykpOwogICAgLy8gbnVyRmxhbnNjaC1UeXBlbiAoQmxpbmRkZWNrZWwvS2xhbW1lciwgQWJzY2huaXR0IEQpOiBFcyBnaWJ0IGtlaW5lIE5lbm53ZWl0ZSAtIGRlcgogICAgLy8gRmxhbnNjaC3DmCBpc3QgZGFzIEVJTlpJR0UgR3JvZXNzZW5tYXNzLiBPaG5lIGRpZXNlIFplaWxlIGJla2FlbWUgV2Vpc3MgZWluZSBQb3NpdGlvbgogICAgLy8gdm9lbGxpZyBvaG5lIEdyb2Vzc2VuYW5nYWJlLiBLbGFtbWVydHlwIChBYnNjaG5pdHQgRSkgZ2Vob2VydCBlYmVuc28gaW4gZGllIEFuZnJhZ2UuCiAgICBpZiAoaXN0TnVyRmxhbnNjaCh0KSkgewogICAgICBjb25zdCBmID0gZmxhbnNjaE9iaihwcy5mbGFuc2NoKTsKICAgICAgTC5wdXNoKCdGbGFuc2NoLUR1cmNobWVzc2VyOiAnICsgKGYgPyBmLmxhYmVsICsgJyBtbScgOiAnZm9sZ3QnKSk7CiAgICAgIGlmIChpc3RLbGFtbWVyKHQpKSB7CiAgICAgICAgY29uc3Qga3QgPSBrbGFtbWVyVHlwT2JqKHBzLmtsYW1tZXJUeXApOwogICAgICAgIGlmIChrdCkgTC5wdXNoKCdLbGFtbWVydHlwOiAnICsga3QubGFiZWwgKyAnICgnICsga3Quc3ViICsgJyknKTsKICAgICAgICBpZiAoZiAmJiBmLmtsYW1tZXJBKSBMLnB1c2goJ01hw58gQTogJyArIChmLmtsYW1tZXJBW3BzLmtsYW1tZXJUeXBdID09IG51bGwgPyAnYXVmIEFuZnJhZ2UnIDogZm10TU0oZi5rbGFtbWVyQVtwcy5rbGFtbWVyVHlwXSkgKyAnIG1tJykpOwogICAgICAgIGNvbnN0IG11ID0gKEQua2xhbW1lck11dHRlcm4gfHwgW10pLmZpbmQobSA9PiBtLmlkID09PSBwcy5rbGFtbWVyTXV0dGVyKTsKICAgICAgICBpZiAobXUpIEwucHVzaCgnTXV0dGVyOiAnICsgbXUubGFiZWwgKyAobXUuYXVmcHJlaXMgPyAnIChnZWdlbiBBdWZwcmVpcyknIDogJycpKTsKICAgICAgfQogICAgICAvLyBEZWNrZWxzdGFlcmtlIEwgaXN0IHNlaXQgUnVuZGUgNSBiZWxlZ3QgKCJNYXNzZSBLbGVtbWVuLCBCbGluZGRlY2tlbC54bHN4IiwKICAgICAgLy8gMjIuMDcuMjAyNikgdW5kIGRhcmYgaW4gZGVyIEFuZnJhZ2UtTWFpbCBzdGVoZW4uIG51bGwgYmxlaWJ0ICJhdWYgQW5mcmFnZSIsCiAgICAgIC8vIGRhbWl0IFdlaXNzIHNpZWh0LCBkYXNzIGRhcyBNYXNzIG9mZmVuIGlzdCwgc3RhdHQgZXMgc3RpbGxzY2h3ZWlnZW5kIGFuenVuZWhtZW4uCiAgICAgIGlmICh0LnN2Z1R5cGUgPT09ICdibGluZGRlY2tlbCcpIEwucHVzaCgnRGVja2Vsc3TDpHJrZSBMOiAnICsgKGYgJiYgZi5ibGluZFRoayAhPSBudWxsID8gZm10TU0oZi5ibGluZFRoaykgKyAnIG1tJyA6ICdhdWYgQW5mcmFnZScpKTsKICAgIH0KICAgIC8vIG1hc3NlRm9sZ3QgKENGL0NGSSk6IE9obmUgZGllc2UgWmVpbGUgYmVrYWVtZSBXZWlzcyBlaW5lIFBvc2l0aW9uIHZvZWxsaWcgb2huZSBIaW53ZWlzLAogICAgLy8gZGFzcyBkaWUgR3JvZXNzZSBub2NoIG9mZmVuIGlzdCAtIHVuZCB3dWVyZGUgZWluZSBzdGlsbHNjaHdlaWdlbmQgYW5uZWhtZW4uIEVocmxpY2gKICAgIC8vIGJlbmVubmVuLCB3YXMgZmVobHQ7IGRhcyBXdW5zY2htYXNzIGtvbW10IGdnZi4gdWViZXIgZGVuIEZyZWl0ZXh0IGRhenUuCiAgICBlbHNlIGlmIChpc0Nvbm5lY3QodCkgJiYgcncpIHsKICAgICAgTC5wdXNoKCdUeXA6ICcgKyB0LmlkICsgJyAoJyArIGVmZldlcmtzdG9mZihwcykgKyAnKScpOwogICAgICBMLnB1c2goJ0dyw7bDn2U6ICcgKyBsYmwocncpKTsKICAgICAgTC5wdXNoKCdNYcOfZTogRGUgJyArIGZtdE1NKHJ3LkRlKSArICcgbW0gLyBEaSAnICsgZm10TU0ocncuRGkpICsgJyBtbScpOwogICAgICBpZiAodC5pZCA9PT0gJ0NGJykgewogICAgICAgIEwucHVzaCgnUm9ocnN0YW5kYXJkOiAnICsgcHMuY29ubmVjdE5vcm0pOwogICAgICAgIEwucHVzaCgnTWHDn2U6IERmICcgKyBmbXRNTShydy5EZikgKyAnIG1tIC8gTCAnICsgZm10TU0ocHMuY29ubmVjdExhZW5nZSkgKyAnIG1tJyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3QgZW5kID0gY29ubmVjdEVuZEZvcihwcywgcncpOwogICAgICAgIGNvbnN0IHVwcGVyID0gRC5tYXNzZS5jb25uZWN0LmNmaS5vYmVyZXJBbnNjaGx1c3M7CiAgICAgICAgTC5wdXNoKCdSb2hyYW5zY2hsdXNzOiAnICsgKHBzLmNvbm5lY3RBbnNjaGx1c3MgPT09ICdUQycgPyAnVHJpLUNsYW1wJyA6ICdCdXR0IFdlbGQnKSk7CiAgICAgICAgaWYgKGVuZCkgTC5wdXNoKCdNYcOfZTogWSAnICsgZm10TU0ocncuWSkgKyAnIG1tIC8gTCAnICsgZm10TU0oZW5kLkwpICsgJyBtbSAvICcgKyAocHMuY29ubmVjdEFuc2NobHVzcyA9PT0gJ1RDJyA\\\/ICdUQyAnIDogJ0EgJykgKyBmbXRNTShwcy5jb25uZWN0QW5zY2hsdXNzID09PSAnVEMnID8gZW5kLlRDIDogZW5kLkEpICsgJyBtbScpOwogICAgICAgIEwucHVzaCgnT2JlcmVyIEFuc2NobHVzczogRGUgJyArIGZtdE1NKHVwcGVyLkRlKSArICcgbW0gLyBEaSAnICsgZm10TU0odXBwZXIuRGkpICsgJyBtbScpOwogICAgICB9CiAgICAgIC8vIEZydWVoZXIgc3RhbmQgaGllciBlaW4gRmFsbGJhY2sgIkFydGlrZWwtTnIuOiB3aXJkIHZvbiBGaXJtYSBXZWlzcyBlcmfDpG56dCIuCiAgICAgIC8vIEVyIGtvbm50ZSBuaWUgZmV1ZXJuOiBJbiBkaWVzZW0gWndlaWcgaXN0IHJ3IGJlbGVndCwgdW5kIGZ1ZXIgQ0YvQ0ZJIGxpZWZlcnQKICAgICAgLy8gYXJ0aWNsZU51bWJlcigpIHVlYmVyIGNvbm5lY3RBcnRpY2xlTnVtYmVyKCkgLT4gdHlwZWNvZGUoKSBpbW1lciBlaW5lIE51bW1lci4KICAgICAgLy8gVG90ZXIgQ29kZSByYXVzLCBzdGF0dCBpaG4gYWxzIHZlcm1laW50bGljaGVzIFNpY2hlcmhlaXRzbmV0eiBzdGVoZW56dWxhc3Nlbi4KICAgIH0KICAgIGVsc2UgaWYgKGlzdE1hc3NlRm9sZ3QodCkpIEwucHVzaCgnR3JvZXNzZS9NYXNzZTogTk9DSCBPRkZFTiAtIGZ1ZXIgJyArICh0ID8gdC5sYWJlbCA6ICcnKSArICcgbGllZ3QgaW0gS29uZmlndXJhdG9yIG5vY2gga2VpbiBmcmVpZ2VnZWJlbmVzIERhdGVuYmxhdHQgdm9yIChrZWluZSBNYXNzZSBoaW50ZXJsZWd0KS4nKTsKICAgIGVsc2UgaWYgKHJ3KSBMLnB1c2goJ0dyw7bDn2U6ICcgKyBsYmwocncpICsgKHIyID8gJyBhdWYgJyArIGxibChyMikgOiAnJykgKyAnIC0gUm9ociAnICsgZm10TU0ob2RPZihydykpICsgJyB4ICcgKyBmbXRNTSh3YWxsT2YocncpKSArICcgbW0nICsgKHQubm9ybSA9PT0gJ2RpbjMyNjc2JyAmJiBydy5mbGFuZ2VPRCA\\\/ICcgLSBLbGVtbS1EdXJjaG1lc3NlciAnICsgcncuZmxhbmdlT0QgKyAnIG1tJyA6ICcnKSk7CiAgICAvLyBCZWRpbmd1bmcgaGFlbmd0IGFtIGxhZW5nZVZhcmlhbnRlLUZsYWcsIE5JQ0hUIGFtIHN2Z1R5cGU6IENGL0NGSSB0cmFnZW4gendhcgogICAgLy8gc3ZnVHlwZTonY2xhbXBzdHV0emVuJywgaGFiZW4gYWJlciBrZWluZSB3YWVobGJhcmUgU3R1dHplbmxhZW5nZS4gVWViZXIgZGVuIHN2Z1R5cGUKICAgIC8vIGhhZXR0ZSBkaWUgQW5mcmFnZS1NYWlsIGZ1ZXIgQ0YvQ0ZJIGVpbiAiTGFlbmdlOiBrdXJ6IChLSykiIGJlaGF1cHRldCwgZGFzIGRlciBLdW5kZQogICAgLy8gbmllIGdld2FlaGx0IGhhdC4gRnVlciBUQy9UQ1MgKGxhZW5nZVZhcmlhbnRlOnRydWUpIGFlbmRlcnQgc2ljaCBuaWNodHMuCiAgICBpZiAodCAmJiB0LmxhZW5nZVZhcmlhbnRlKSBMLnB1c2goJ0xhZW5nZTogJyArIChwcy5sYWVuZ2VWYXJpYW50ZSA9PT0gJ0tMJyA\\\/ICdsYW5nIChLTCknIDogJ2t1cnogKEtLKScpKTsKICAgIC8vIFRDRDoga2VpbiBLSy9LTCwgc29uZGVybiBkaWUgV2Vpc3MtU3RhbmRhcmRob2VoZSBhdXMgZGVyIFRhYmVsbGUuIE9obmUgZGllc2UgWmVpbGUKICAgIC8vIGJla2FlbWUgV2Vpc3MgZGVuIFN0dXR6ZW4gb2huZSBzZWluIGVpbnppZ2VzIExhZW5nZW5tYXNzLgogICAgY29uc3QgbGdQID0gbGFlbmdlT2YodCwgcncsIHBzLmxhZW5nZVZhcmlhbnRlKTsKICAgIGlmIChsZ1AgJiYgbGdQLmxhYmVsID09PSAnaCcpIEwucHVzaCgnSG9laGU6ICcgKyBmbXRNTShsZ1Aud2VydCkgKyAnIG1tIChTdGFuZGFyZCB2b24gRmlybWEgV2Vpc3MpJyk7CiAgICBpZiAodCAmJiB0LnN2Z1R5cGUgPT09ICdyZWR1emllcnVuZycpIEwucHVzaCgnQmF1Zm9ybTogJyArIChwcy5leHplbnRyaXNjaCA\\\/ICdleHplbnRyaXNjaCAoRm9ybSBSRSknIDogJ2tvbnplbnRyaXNjaCAoRm9ybSBSSyknKSk7CiAgICAvLyBSMy0zL1IzLTQ6IEJhdWZvcm0gZGVyIFQtU3TDvGNrZSBtaXQgaW4gZGllIEFuZnJhZ2UtTWFpbC4KICAgIGlmICh0ICYmIHQuZm9ybVdhaGwpIEwucHVzaCgnQmF1Zm9ybTogJyArIChwcy5mb3JtVmFyaWFudGUgPT09ICdUSycgPyAnRm9ybSBUSyAoRHVyY2hnYW5nIGdsZWljaCwgQWJnYW5nIGt1cnopJyA6ICdGb3JtIFQgKGFsbGUgQWJnw6RuZ2UgZ2xlaWNoIGxhbmcpJykpOwogICAgaWYgKHQgJiYgaXNCZW5kKHQpICYmIHJ3KSB7CiAgICAgIEwucHVzaCgnTWHDn2U6IFIgJyArIGZtdE1NKHJ3LlIpICsgJyBtbSAvICcgKyAodC5ib2dlbiA9PT0gNDUgPyAnTDIgJyArIGZtdE1NKHJ3LkwyKSA6ICdMMSAnICsgZm10TU0ocncuTDEpKSArICcgbW0gLyBMMyAnICsgZm10TU0odC5ib2dlbiA9PT0gNDUgPyBydy5MM180NSA6IHJ3LkwzXzkwKSArICcgbW0nKTsKICAgIH0KICAgIGlmICh0ICYmIHQuaWQgPT09ICdSJykgeyBjb25zdCBwYWlyID0gcmVkdWN0aW9uUGFpcihwcyk7IGlmIChwYWlyKSBMLnB1c2goJ0zDpG5nZSBMOiAnICsgZm10TU0ocGFpci5MKSArICcgbW0nKTsgfQogICAgLyogTWFzc2xpc3RlIGRlciBULVN0dWVja2UuIERlciBGaWx0ZXIgc3RhbmQgZnJ1ZWhlciBhdWYgdC5pZCA9PT0gJ1RTJyAtIGRhZHVyY2ggZ2luZwogICAgICogSkVERSByZWR1emllcnRlIFBvc2l0aW9uIChUU1IpIG9obmUgTDAvTC9BYmdhbmcgYW4gV2Vpc3MgcmF1cywgb2J3b2hsIGRpZSBXZXJ0ZSBpbQogICAgICogYmVsZWd0ZW4gUGFhciBzdGVoZW4uIFF1ZWxsZSBkZXNoYWxiIHdpZSBpbSBEYXRlbmJsYXR0OiBUUyAtPiBEdXJjaGdhbmdzemVpbGUsCiAgICAgKiBUU1IgLT4gdFN0dWVja1BhaXIoKS4gT2huZSBiZWxlZ3RlIFF1ZWxsZSBibGVpYnQgZGllIFplaWxlIHdlZyAoZmFpbC1jbG9zZWQpLAogICAgICogZGFzIEt1ZXJ6ZWwgZGVzIEFiZ2FuZ3MgZm9sZ3QgZGVyIEJhdWZvcm0gKEZvcm0gVCAtPiBMMiwgRm9ybSBUSyAtPiBMMSkuICovCiAgICBpZiAodCAmJiAodC5pZCA9PT0gJ1RTJyB8fCB0LmlkID09PSAnVFNSJykpIHsKICAgICAgY29uc3QgdFNyYyA9IHQuaWQgPT09ICdUU1InID8gdFN0dWVja1BhaXIocHMpIDogcnc7CiAgICAgIC8vIEZvcm0gVEsgb2huZSBiZWxlZ3RlIFNwYWx0ZSBMMTogdGtBYmdhbmcoKSBtYWNodCBhdXMgZGVtIFRhYmVsbGVuLVN0cmljaCBlaW5lIDAuCiAgICAgIC8vIEluIGRlciBBbmZyYWdlLU1haWwgKD0gQmVzdGVsbGdydW5kbGFnZSBmdWVyIFdlaXNzKSB3YWVyZSAiTDEgMCBtbSIgZWluIGVyZnVuZGVuZXMKICAgICAgLy8gTWFzcyAtIGRhbm4gYmxlaWJ0IGRlciBBYmdhbmcgYXVzZHJ1ZWNrbGljaCBvZmZlbiwgTDAvTCBnZWhlbiB0cm90emRlbSBtaXQuCiAgICAgIGNvbnN0IHRrT2ZmZW4gPSBwcy5mb3JtVmFyaWFudGUgPT09ICdUSycgJiYgKCF0U3JjIHx8IHRTcmMuTDEgPT0gbnVsbCk7CiAgICAgIGNvbnN0IHRBYmcgPSB0a09mZmVuID8gbnVsbCA6IGFiZ2FuZ0wyKHBzLCB0U3JjKTsKICAgICAgaWYgKHRTcmMgJiYgdFNyYy5MMCAhPSBudWxsICYmIHRTcmMuTCAhPSBudWxsKSB7CiAgICAgICAgTC5wdXNoKCdNYcOfZTogTDAgJyArIGZtdE1NKHRTcmMuTDApICsgJyBtbSAvIEwgJyArIGZtdE1NKHRTcmMuTCkgKyAnIG1tIC8gJwogICAgICAgICAgKyBhYmdhbmdLdWVyemVsKHBzKSArICcgJyArICh0QWJnICE9IG51bGwgPyBmbXRNTSh0QWJnKSArICcgbW0nIDogJ05PQ0ggT0ZGRU4nKSk7CiAgICAgIH0KICAgIH0KICAgIGlmICh0ICYmIHQuaWQgPT09ICdUQycpIEwucHVzaCgnS2xhbW1lcjogJyArIHBzLmtsYW1tZXJUeXApOwogICAgLyogVHlwIEQgKEJhdXRlaWwgRGljaHR1bmcpOiBXZWRlciBFZGVsc3RhaGwtV2Vya3N0b2ZmIG5vY2ggT2JlcmZsYWVjaGUgZ2Vob2VyZW4KICAgICAqIGluIGRpZSBBbmZyYWdlIC0gaW4gZGVyIE1haWwgYW4gV2Vpc3Mgc3R1ZW5kZSBzb25zdCAiMS40NDA0IC8gSDQiIHVlYmVyIGVpbmVyCiAgICAgKiBFUERNLURpY2h0dW5nIChCZXJuZCAxMS4wOC4yMDI2KS4gRGVyIFdlcmtzdG9mZiBkZXIgRGljaHR1bmcgc3RlaHQgZWluZSBaZWlsZQogICAgICogdGllZmVyIHVudGVyICJEaWNodHVuZyIsIGRpZSBNYXNzZSBFL0MgaW4gZGVyIGJlaWxpZWdlbmRlbiBaZWljaG51bmcuICovCiAgICBpZiAoIWlzdERpY2h0dW5nQmF1dGVpbCh0KSkgewogICAgICBMLnB1c2goJ1dlcmtzdG9mZjogJyArIHBzLndlcmtzdG9mZik7CiAgICAgIC8vIFIyLTQ6IERpZSBLbGFtbWVyIGhhdCBLRUlORSBPYmVyZmxhZWNoZSAtPiBrZWluZSBPYmVyZmxhZWNoZW4tWmVpbGUgaW4gZGVyIEFuZnJhZ2UKICAgICAgLy8gKHNvbnN0IHN0dWVuZGUgIktsYW1tZXIgdHJhZWd0IEg0IiBpbiBkZXIgTWFpbCBhbiBXZWlzcykuCiAgICAgIGlmICghaXN0S2xhbW1lcih0KSkgewogICAgICAgIGNvbnN0IG9vID0gRC5vYmVyZmxhZWNoZW4uZmluZChvID0+IG8uaWQgPT09IHBzLm9iZXJmbGFlY2hlKTsKICAgICAgICAvLyBSYS1adXNhdHogTlVSLCB3ZW5uIGJlaWRlIEdyZW56d2VydGUgYmVzdGFldGlndCBpbiBkYXRhLmpzIHN0ZWhlbi4gQmVpIEgxIHNpbmQKICAgICAgICAvLyByYUlubmVuL3JhQXVzc2VuIGJld3Vzc3QgbnVsbCAob2ZmZW5lIEZyYWdlIDQpIC0+IFp1c2F0eiBlbnRmYWVsbHQga29tcGxldHQsCiAgICAgICAgLy8gc3RhdHQgIlJhIGlubmVuIDw9bnVsbCIgenUgc2NoaWNrZW4uIEtlaW4gZ2VyYXRlbmVyIFdlcnQsIGtlaW4gImZvbGd0IiBpbiBkZXIgS2xhbW1lci4KICAgICAgICBjb25zdCByYU9rID0gb28gJiYgb28ucmFJbm5lbiAhPSBudWxsICYmIG9vLnJhQXVzc2VuICE9IG51bGw7CiAgICAgICAgTC5wdXNoKCdPYmVyZmzDpGNoZTogJyArIHBzLm9iZXJmbGFlY2hlICsgKHJhT2sgPyAnIChSYSBpbm5lbiA8PScgKyBvby5yYUlubmVuICsgJyAvIGF1w59lbiA8PScgKyBvby5yYUF1c3NlbiArICcgwrVtKScgOiAnJykpOwogICAgICB9CiAgICB9CiAgICBpZiAodCAmJiB0LmRpY2h0dW5nKSBMLnB1c2goJ0RpY2h0dW5nOiAnICsgKGRpY2h0T2JqKHBzLmRpY2h0dW5nKSA\\\/IGRpY2h0T2JqKHBzLmRpY2h0dW5nKS5sYWJlbCA6ICfigJQnKSk7CiAgICAvLyBEZXIgWnVzYXR6IGdpbHQgbnVyLCB3ZW5uIGRpZSBEaWNodHVuZyBlaW4gWlVCRUhPRVJURUlMIGRlciBQb3NpdGlvbiBpc3QgKFR5cCBUQykuCiAgICAvLyBCZWltIFR5cCBEIElTVCBkaWUgRGljaHR1bmcgZGFzIGJlc3RlbGx0ZSBCYXV0ZWlsIC0gZG9ydCBzdGVodCBpaHJlIE51bW1lciBiZXJlaXRzCiAgICAvLyBvYmVuIGluIGRlciBBcnRpa2VsLU5yLi1aZWlsZSAoU2NoZW1hIEQtPEdyb2Vzc2U+LTxSZWloZT4tPFdlcmtzdG9mZj4tPEx8Tz4pLCBkZXIKICAgIC8vIFp1c2F0eiB3YXIgZWluZSBEb3BwbHVuZyB1bmQgaGF0IGRlciBlaWdlbmVuIEFydGlrZWxudW1tZXIgd2lkZXJzcHJvY2hlbi4KICAgIGlmICh0ICYmIHQuZGljaHR1bmcgJiYgdC5pZCAhPT0gJ0QnKSBMLnB1c2goJ0RpY2h0dW5nIEFydGlrZWwtTnIuOiB3aXJkIHZvbiBGaXJtYSBXZWlzcyBlcmfDpG56dCcpOwogICAgTC5wdXNoKCdOYWNod2Vpc2U6ICcgKyBudyk7CiAgICBMLnB1c2goJ01lbmdlOiAnICsgcHMubWVuZ2UgKyAnIFN0w7xjaycpOwogICAgTC5wdXNoKCdQcmVpc3N0YXR1czogJyArIHByZWlzKTsKICAgIHJldHVybiBMLmpvaW4oJ1xuJyk7CiAgfQoKICBmdW5jdGlvbiBidWlsZFJmcUJvZHkoKSB7CiAgICBjb25zdCBrID0gc3RhdGUua29udGFrdCwgcG9zID0gcG9zaXRpb25zRm9yUmZxKCk7CiAgICBjb25zdCBhbncgPSBELmFud2VuZHVuZ2VuLmZpbmQoYSA9PiBhLmlkID09PSBzdGF0ZS5hbndlbmR1bmcpOwogICAgY29uc3QgTCA9IFtdOwogICAgTC5wdXNoKCdBbmZyYWdlIMO8YmVyIGRlbiBXZWlzcyBGaXR0aW5ncy1Lb25maWd1cmF0b3InKTsKICAgIEwucHVzaCgnJyk7CiAgICBpZiAoYW53KSBMLnB1c2goJ0Fud2VuZHVuZzogJyArIGFudy5sYWJlbCk7CiAgICBMLnB1c2goJ0tvbnRha3Q6ICcgKyBrLmZpcm1hICsgJyAvICcgKyBrLm5hbWUgKyAnIC8gJyArIGsuZW1haWwgKyAoay50ZWxlZm9uID8gJyAvICcgKyBrLnRlbGVmb24gOiAnJykpOwogICAgaWYgKGsudGVybWluKSBMLnB1c2goJ1d1bnNjaHRlcm1pbiAvIFByb2pla3Q6ICcgKyBrLnRlcm1pbik7CiAgICBMLnB1c2goJycpOwogICAgcG9zLmZvckVhY2goKHBzLCBpKSA9PiB7CiAgICAgIEwucHVzaChwb3NMaW5lKHBzLCBpKSk7CiAgICAgIEwucHVzaCgnS29uZmlndXJhdGlvbnMtTGluayBQb3NpdGlvbiAnICsgKGkgKyAxKSArICc6ICcgKyBidWlsZFNoYXJlVXJsKHBzKSk7CiAgICAgIEwucHVzaCgnJyk7CiAgICB9KTsKICAgIC8vIEdlc2FtdGJldHJhZyBkZXIgQW5mcmFnZS4gR2xlaWNoZSBRdWVsbGUgd2llIGRlciBXYXJlbmtvcmIgKGNhcnRTdW1tYXJ5KSwgZGFtaXQKICAgIC8vIEJpbGRzY2hpcm0gdW5kIE1haWwgbmljaHQgYXVzZWluYW5kZXJsYXVmZW4ga29lbm5lbi4KICAgIGNvbnN0IHN1bSA9IGNhcnRTdW1tYXJ5KHBvcyk7CiAgICBpZiAoc3VtLm1pdFByZWlzKSB7CiAgICAgIEwucHVzaCgnLS0tIEdlc2FtdCAtLS0nKTsKICAgICAgTC5wdXNoKCdTdW1tZSAnICsgc3VtLm1pdFByZWlzICsgJyAnICsgcG9zV29ydChzdW0ubWl0UHJlaXMpICsgJyAoJyArIHN1bS5zdHVlY2sgKyAnIFN0w7xjayk6ICcgKyBldXIoc3VtLnN1bW1lKSArICcgRVVSJyk7CiAgICAgIGlmIChzdW0ub2huZVByZWlzKSBMLnB1c2goc3VtLm9obmVQcmVpcyArICcgJyArIHBvc1dvcnQoc3VtLm9obmVQcmVpcykgKyAnIGF1ZiBBbmZyYWdlLCBuaWNodCBpbiBkZXIgU3VtbWUgZW50aGFsdGVuLicpOwogICAgICBMLnB1c2goJycpOwogICAgfQogICAgLy8gTnVyIHZlcnNwcmVjaGVuLCB3YXMgZXMgZ2lidDogZnVlciBCbGluZGRlY2tlbC9LbGFtbWVyIChBYnNjaG5pdHQgRCkgZXhpc3RpZXJ0CiAgICAvLyBub2NoIGtlaW5lIGJlbWFzc3RlIFplaWNobnVuZyAtPiBkYW5uIGF1Y2gga2VpbmUgUGxhbnNraXp6ZSBhbmt1ZW5kaWdlbi4KICAgIGlmIChzdGF0ZS50eXAgJiYgcGFyYW1zRm9yKHN0YXRlKSkgTC5wdXNoKCdQbGFuc2tpenplL0RhdGVuYmxhdHQ6IMO8YmVyIGRlbiBMaW5rIGFicnVmYmFyIChCdXR0b24gIkRhdGVuYmxhdHQgYWxzIFBERiIpLicpOwogICAgaWYgKGsuZnJlaXRleHQpIHsgTC5wdXNoKCcnKTsgTC5wdXNoKCdTb25kZXJhbmZvcmRlcnVuZ2VuOiAnICsgay5mcmVpdGV4dCk7IH0KICAgIEwucHVzaCgnJyk7CiAgICBMLnB1c2goc3VtLm1pdFByZWlzCiAgICAgID8gJyhEaWUgQmV0csOkZ2Ugc3RhbW1lbiBhdXMgZGVyIGhpbnRlcmxlZ3RlbiBQcmVpc2xpc3RlIHZvbiBGaXJtYSBXZWlzcyB1bmQgd2VyZGVuIG1pdCBkZW0gQW5nZWJvdCB2ZXJiaW5kbGljaC4pJwogICAgICA6ICcoUHJlaXNhbmdhYmVuIGVyZm9sZ2VuIGVyc3QgbWl0IGRlbSBpbmRpdmlkdWVsbGVuIEFuZ2Vib3Qgdm9uIEZpcm1hIFdlaXNzLiknKTsKICAgIHJldHVybiBMLmpvaW4oJ1xuJyk7CiAgfQoKICBmdW5jdGlvbiByZnFTZW5kKCkgewogICAgaWYgKCFjb250YWN0VmFsaWQoKSkgewogICAgICBjb25zdCBmID0gJCgnI3d6LWZvcm0nKTsgaWYgKGYpIHsgY29uc3QgYmFkID0gc3RhdGUua29udGFrdC5maXJtYS50cmltKCkgPyAoc3RhdGUua29udGFrdC5uYW1lLnRyaW0oKSA\\\/IGYucXVlcnlTZWxlY3RvcignW2RhdGEtaz1lbWFpbF0nKSA6IGYucXVlcnlTZWxlY3RvcignW2RhdGEtaz1uYW1lXScpKSA6IGYucXVlcnlTZWxlY3RvcignW2RhdGEtaz1maXJtYV0nKTsgaWYgKGJhZCkgeyBiYWQuY2xhc3NMaXN0LmFkZCgnZXJyJyk7IGJhZC5mb2N1cygpOyB9IH0KICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgcG9zID0gcG9zaXRpb25zRm9yUmZxKCk7CiAgICBjb25zdCBzdWJqID0gJ1JGUSAnICsgKHBvc1swXSA\\\/IHBvc1swXS5jb2RlIDogJycpICsgKHBvcy5sZW5ndGggPiAxID8gJyArJyArIChwb3MubGVuZ3RoIC0gMSkgOiAnJykgKyAnICcgKyBzdGF0ZS5rb250YWt0LmZpcm1hOwogICAgY29uc3QgaHJlZiA9ICdtYWlsdG86JyArIEQubWV0YS52ZXJ0cmllYkVtYWlsICsgJz9zdWJqZWN0PScgKyBlbmNvZGVVUklDb21wb25lbnQoc3ViaikgKyAnJmJvZHk9JyArIGVuY29kZVVSSUNvbXBvbmVudChidWlsZFJmcUJvZHkoKSk7CiAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGhyZWY7CiAgfQoKICBmdW5jdGlvbiBidWlsZFNoYXJlVXJsKHNvdXJjZSkgewogICAgY29uc3QgcyA9IHNvdXJjZSB8fCBzdGF0ZSwgcSA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKSwgdHQgPSB0eXBPYmoocy50eXApOwogICAgWydhbndlbmR1bmcnLCAnbm9ybScsICd0eXAnLCAncmVpaGUnLCAnZ3JvZXNzZSddLmZvckVhY2goayA9PiBzW2tdICYmIHEuc2V0KGssIHNba10pKTsKICAgIGlmIChzLmdyb2Vzc2UyKSBxLnNldCgnZ3JvZXNzZTInLCBzLmdyb2Vzc2UyKTsKICAgIC8vIEZsYW5zY2gtL0tsYW1tZXItQXVzd2FobCAoQWJzY2huaXR0IEQrRSkgbWl0IGluIGRlbiBMaW5rLCBzb25zdCBnZWh0IGRpZSBlaW56aWdlCiAgICAvLyBHcm9lc3NlbmFuZ2FiZSBlaW5lcyBCbGluZGRlY2tlbHMvZWluZXIgS2xhbW1lciBiZWltIFRlaWxlbiB2ZXJsb3Jlbi4KICAgIGlmIChpc3ROdXJGbGFuc2NoKHR0KSkgewogICAgICBpZiAocy5mbGFuc2NoKSBxLnNldCgnZmxhbnNjaCcsIHMuZmxhbnNjaCk7CiAgICAgIGlmIChpc3RLbGFtbWVyKHR0KSkgeyBpZiAocy5rbGFtbWVyVHlwKSBxLnNldCgna2xhbW1lcnR5cCcsIHMua2xhbW1lclR5cCk7IGlmIChzLmtsYW1tZXJXZXJrc3RvZmYpIHEuc2V0KCdrd2Vya3N0b2ZmJywgcy5rbGFtbWVyV2Vya3N0b2ZmKTsgaWYgKHMua2xhbW1lck11dHRlcikgcS5zZXQoJ2ttdXR0ZXInLCBzLmtsYW1tZXJNdXR0ZXIpOyB9CiAgICB9CiAgICBpZiAodHQgJiYgdHQuaWQgPT09ICdDRicpIHsKICAgICAgcS5zZXQoJ2NzdGFuZGFyZCcsIHMuY29ubmVjdE5vcm0pOyBpZiAocy5jb25uZWN0TGFlbmdlICE9IG51bGwpIHEuc2V0KCdjbGFlbmdlJywgcy5jb25uZWN0TGFlbmdlKTsKICAgIH0KICAgIGlmICh0dCAmJiB0dC5pZCA9PT0gJ0NGSScpIHEuc2V0KCdjYW5zY2hsdXNzJywgcy5jb25uZWN0QW5zY2hsdXNzKTsKICAgIGlmICh0dCAmJiB0dC5pZCA9PT0gJ1RDJyAmJiBzLmtsYW1tZXJUeXApIHEuc2V0KCdrbGFtbWVydHlwJywgcy5rbGFtbWVyVHlwKTsKICAgIHEuc2V0KCd3ZXJrc3RvZmYnLCBzLndlcmtzdG9mZik7IHEuc2V0KCdvYmVyZmxhZWNoZScsIHMub2JlcmZsYWVjaGUpOwogICAgaWYgKHMuZGljaHR1bmcgJiYgdHlwT2JqKHMudHlwKSAmJiB0eXBPYmoocy50eXApLmRpY2h0dW5nKSBxLnNldCgnZGljaHR1bmcnLCBzLmRpY2h0dW5nKTsKICAgIGlmIChzLmRpY2h0dW5nICYmIHR0ICYmIHR0LmRpY2h0dW5nKSBxLnNldCgnbGlwcGUnLCBlZmZMaXBwZShzKSk7CiAgICBpZiAoQXJyYXkuaXNBcnJheShzLm5hY2h3ZWlzZSkgJiYgcy5uYWNod2Vpc2UubGVuZ3RoKSBxLnNldCgnbmFjaHdlaXNlJywgcy5uYWNod2Vpc2Uuam9pbignLCcpKTsKICAgIGlmIChzLmxhZW5nZVZhcmlhbnRlKSBxLnNldCgnbGFlbmdlJywgcy5sYWVuZ2VWYXJpYW50ZSk7CiAgICBpZiAocy5leHplbnRyaXNjaCkgcS5zZXQoJ2V4eicsICcxJyk7CiAgICAvLyBCYXVmb3JtOiBGb3JtIFQgaXN0IGRlciBEZWZhdWx0IHVuZCBicmF1Y2h0IGtlaW5lbiBQYXJhbWV0ZXIsIEZvcm0gVEsgd2lyZAogICAgLy8gc2VpdCBkZXIgTWHDn2ZyZWlnYWJlIChCZXJuZCAyNy4wNy4yMDI2KSBtaXRnZXRlaWx0LgogICAgaWYgKHR0ICYmIHR0LmZvcm1XYWhsICYmIHMuZm9ybVZhcmlhbnRlID09PSAnVEsnKSBxLnNldCgnZm9ybScsICdUSycpOwogICAgaWYgKHMudmlldyAhPT0gJ3plaWNobnVuZycpIHEuc2V0KCd2aWV3Jywgcy52aWV3KTsKICAgIHEuc2V0KCdtZW5nZScsIHMubWVuZ2UpOwogICAgLy8gSW4gZGVyIFdvcmRQcmVzcy1BdXNnYWJlIGxhZXVmdCBkYXMgV2lkZ2V0IGFscyBzcmNkb2MuIERvcnQgaXN0CiAgICAvLyBsb2NhdGlvbiBrZWluIHRlaWxiYXJlciBTZWl0ZW4tTGluayAoYWJvdXQ6c3JjZG9jIGJ6dy4gZWluZSBnZWVyYnRlIFVSTCksCiAgICAvLyBkZXNoYWxiIGdpYnQgZGFzIFBsdWdpbiBkaWUgZWNodGUgV29yZFByZXNzLVNlaXRlIGFscyBXRUlTU19TSEFSRV9CQVNFIG1pdC4KICAgIC8vIEZ1ZXIgZGVuIHN0YXRpc2NoZW4gRW1iZWQgZGllbnQgZG9jdW1lbnQucmVmZXJyZXIgYWxzIEZhbGxiYWNrOyBzdGFuZGFsb25lCiAgICAvLyBibGVpYnQgZXMgYmVpIGRlciBha3R1ZWxsZW4gU2VpdGUuIFF1ZXJ5IHVuZCBIYXNoIGRlcyBSZWZlcnJlcnMgd2VyZGVuCiAgICAvLyBlbnRmZXJudCwgZGFtaXQgYWx0ZSBLb25maWd1cmF0aW9uZW4gbmljaHQgaW5laW5hbmRlciB2ZXJzY2hhY2h0ZWx0IHdlcmRlbi4KICAgIGxldCBiYXNlID0gd2luZG93LldFSVNTX1NIQVJFX0JBU0UgfHwgJyc7CiAgICBpZiAoIWJhc2UgJiYgZG9jdW1lbnQucmVmZXJyZXIpIHsKICAgICAgdHJ5IHsgY29uc3QgdSA9IG5ldyBVUkwoZG9jdW1lbnQucmVmZXJyZXIpOyB1LnNlYXJjaCA9ICcnOyB1Lmhhc2ggPSAnJzsgYmFzZSA9IHUudG9TdHJpbmcoKTsgfSBjYXRjaCAoZSkge30KICAgIH0KICAgIGlmICghYmFzZSkgYmFzZSA9IGxvY2F0aW9uLm9yaWdpbiArIGxvY2F0aW9uLnBhdGhuYW1lOwogICAgcmV0dXJuIGJhc2UgKyAnPycgKyBxLnRvU3RyaW5nKCk7CiAgfQogIGZ1bmN0aW9uIGJ1aWxkU2hhcmVUZXh0KCkgewogICAgY29uc3QgcG9zID0gcG9zaXRpb25zRm9yUmZxKCk7CiAgICBpZiAocG9zLmxlbmd0aCA8PSAxKSByZXR1cm4gYnVpbGRTaGFyZVVybChwb3NbMF0gfHwgc3RhdGUpOwogICAgcmV0dXJuIFsnV2Vpc3MgRml0dGluZ3MtS29uZmlndXJhdGlvbmVuJ10uY29uY2F0KAogICAgICBwb3MubWFwKChwcywgaSkgPT4gJ1Bvc2l0aW9uICcgKyAoaSArIDEpICsgJzogJyArIGJ1aWxkU2hhcmVVcmwocHMpKQogICAgKS5qb2luKCdcbicpOwogIH0KICBmdW5jdGlvbiBjb3B5RG9uZShidG4pIHsKICAgIGlmICghYnRuKSByZXR1cm47CiAgICBidG4uY2xhc3NMaXN0LmFkZCgnb2snKTsgY29uc3Qgb3JpZ2luYWwgPSBidG4uaW5uZXJIVE1MOwogICAgYnRuLmlubmVySFRNTCA9IGljKCdjaGVjaycsICdpYycpICsgJyBMaW5rIGtvcGllcnQnOwogICAgc2V0VGltZW91dCgoKSA9PiB7IGJ0bi5jbGFzc0xpc3QucmVtb3ZlKCdvaycpOyBidG4uaW5uZXJIVE1MID0gb3JpZ2luYWw7IH0sIDE4MDApOwogIH0KICBmdW5jdGlvbiBzaG93U2hhcmVGYWxsYmFjayh0eHQpIHsKICAgIGxldCBib3ggPSAkKCcjd3otc2hhcmUtZmFsbGJhY2snKTsKICAgIGlmICghYm94KSB7CiAgICAgIGJveCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOyBib3guaWQgPSAnd3otc2hhcmUtZmFsbGJhY2snOyBib3guY2xhc3NOYW1lID0gJ3NoYXJlLWZhbGxiYWNrJzsKICAgICAgYm94LmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPSJzaGFyZS1mYWxsYmFjay1jYXJkIiByb2xlPSJkaWFsb2ciIGFyaWEtbW9kYWw9InRydWUiIGFyaWEtbGFiZWxsZWRieT0id3otc2hhcmUtdGl0bGUiPgogICAgICAgIDxidXR0b24gY2xhc3M9InNoYXJlLWZhbGxiYWNrLWNsb3NlIiBkYXRhLWFjdD0ic2hhcmUtY2xvc2UiIGFyaWEtbGFiZWw9IlNjaGxpZcOfZW4iPsOXPC9idXR0b24+CiAgICAgICAgPGIgaWQ9Ind6LXNoYXJlLXRpdGxlIj5MaW5rIHp1bSBUZWlsZW48L2I+PHA+QXV0b21hdGlzY2hlcyBLb3BpZXJlbiBpc3QgaW4gZGllc2VtIEJyb3dzZXIgbmljaHQgdmVyZsO8Z2Jhci4gTWFya2llcmUgZGVuIFRleHQgdW5kIGtvcGllcmUgaWhuLjwvcD4KICAgICAgICA8dGV4dGFyZWEgaWQ9Ind6LXNoYXJlLXZhbHVlIiByZWFkb25seT48L3RleHRhcmVhPjwvZGl2PmA7CiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYm94KTsKICAgIH0KICAgIGNvbnN0IGZpZWxkID0gJCgnI3d6LXNoYXJlLXZhbHVlJyk7IGZpZWxkLnZhbHVlID0gdHh0OyBib3guaGlkZGVuID0gZmFsc2U7IGZpZWxkLmZvY3VzKCk7IGZpZWxkLnNlbGVjdCgpOwogIH0KICBmdW5jdGlvbiBjb3B5VGV4dCh0eHQsIGJ0bikgewogICAgY29uc3QgbGVnYWN5ID0gKCkgPT4gewogICAgICBjb25zdCB0YSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7IHRhLnZhbHVlID0gdHh0OyB0YS5zZXRBdHRyaWJ1dGUoJ3JlYWRvbmx5JywgJycpOwogICAgICB0YS5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCc7IHRhLnN0eWxlLm9wYWNpdHkgPSAnMCc7IGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGEpOyB0YS5zZWxlY3QoKTsKICAgICAgbGV0IG9rID0gZmFsc2U7IHRyeSB7IG9rID0gZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKSA9PT0gdHJ1ZTsgfSBjYXRjaCAoZSkge30gdGEucmVtb3ZlKCk7CiAgICAgIGlmIChvaykgY29weURvbmUoYnRuKTsgZWxzZSBzaG93U2hhcmVGYWxsYmFjayh0eHQpOwogICAgfTsKICAgIGlmIChuYXZpZ2F0b3IuY2xpcGJvYXJkICYmIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KSBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCh0eHQpLnRoZW4oKCkgPT4gY29weURvbmUoYnRuKSwgbGVnYWN5KTsKICAgIGVsc2UgbGVnYWN5KCk7CiAgfQogIGZ1bmN0aW9uIHNoYXJlVGV4dCh0eHQsIGJ0bikgewogICAgaWYgKG5hdmlnYXRvci5zaGFyZSkgewogICAgICBuYXZpZ2F0b3Iuc2hhcmUoeyB0aXRsZTonV2Vpc3MgRml0dGluZ3MtS29uZmlndXJhdGlvbicsIHRleHQ6dHh0IH0pLmNhdGNoKGVyciA9PiB7CiAgICAgICAgaWYgKCFlcnIgfHwgZXJyLm5hbWUgIT09ICdBYm9ydEVycm9yJykgY29weVRleHQodHh0LCBidG4pOwogICAgICB9KTsKICAgIH0gZWxzZSBjb3B5VGV4dCh0eHQsIGJ0bik7CiAgfQoKICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVm9sbGJpbGQgKyBab29tICovCiAgY29uc3QgZnMgPSB7IG9wZW46IGZhbHNlLCB6OiAxLCB0eDogMCwgdHk6IDAsIGRyYWc6IG51bGwsIHB0czogbmV3IE1hcCgpLCBwaW5jaDogbnVsbCB9OwogIGZ1bmN0aW9uIGZzRW5zdXJlKCkgewogICAgaWYgKCQoJyN3ei1mcycpKSByZXR1cm47CiAgICBjb25zdCBkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7IGQuaWQgPSAnd3otZnMnOyBkLmNsYXNzTmFtZSA9ICd3ei1mcyc7IGQuaGlkZGVuID0gdHJ1ZTsKICAgIGQuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9ImZzLWJhciI+PHNwYW4gY2xhc3M9ImZzLWNvZGUiIGlkPSJ3ei1mcy1jb2RlIj48L3NwYW4+CiAgICAgIDxkaXYgY2xhc3M9InB2LXRvZ2dsZSIgaWQ9Ind6LWZzLXRvZ2dsZSI+PC9kaXY+CiAgICAgIDxzcGFuIGNsYXNzPSJmcy1oaW50Ij5aaWVoZW4vU2Nyb2xsZW4gdmVyc2NoaWVidCDCtyDijJgvU3RyZyArIFNjcm9sbGVuIHpvb210IMK3IEVTQyBzY2hsaWXDn3Q8L3NwYW4+CiAgICAgIDxkaXYgY2xhc3M9ImZzLXpvb20iPjxidXR0b24gZGF0YS1hY3Q9ImZzLW91dCIgYXJpYS1sYWJlbD0idmVya2xlaW5lcm4iPuKIkjwvYnV0dG9uPjxzcGFuIGlkPSJ3ei1mcy16Ij4xMDAgJTwvc3Bhbj48YnV0dG9uIGRhdGEtYWN0PSJmcy1pbiIgYXJpYS1sYWJlbD0idmVyZ3LDtsOfZXJuIj4rPC9idXR0b24+PGJ1dHRvbiBkYXRhLWFjdD0iZnMtcmVzZXQiIGFyaWEtbGFiZWw9Ilpvb20genVyw7xja3NldHplbiI+MToxPC9idXR0b24+PC9kaXY+CiAgICAgIDxidXR0b24gY2xhc3M9ImZzLWNsb3NlIiBkYXRhLWFjdD0iZnMtY2xvc2UiIGFyaWEtbGFiZWw9IlZvbGxiaWxkIHNjaGxpZcOfZW4iPiR7aWMoJ2Nsb3NlJywgJ2ljJyl9PC9idXR0b24+PC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImZzLXN0YWdlIiBpZD0id3otZnMtc3RhZ2UiPjxkaXYgY2xhc3M9ImZzLWNhbnZhcyIgaWQ9Ind6LWZzLWNhbnZhcyI+PC9kaXY+PC9kaXY+YDsKICAgIGQudGFiSW5kZXggPSAtMTsKICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCk7CiAgICBjb25zdCBzdCA9ICQoJyN3ei1mcy1zdGFnZScpOwogICAgc3QuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCBlID0+IHsKICAgICAgc3Quc2V0UG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpOyBmcy5wdHMuc2V0KGUucG9pbnRlcklkLCBbZS5jbGllbnRYLCBlLmNsaWVudFldKTsKICAgICAgaWYgKGZzLnB0cy5zaXplID09PSAxKSBmcy5kcmFnID0gW2UuY2xpZW50WCAtIGZzLnR4LCBlLmNsaWVudFkgLSBmcy50eV07CiAgICAgIGVsc2UgaWYgKGZzLnB0cy5zaXplID09PSAyKSB7IGNvbnN0IGEgPSBbLi4uZnMucHRzLnZhbHVlcygpXTsgZnMucGluY2ggPSBNYXRoLmh5cG90KGFbMF1bMF0gLSBhWzFdWzBdLCBhWzBdWzFdIC0gYVsxXVsxXSkgLyBmcy56OyBmcy5kcmFnID0gbnVsbDsgfQogICAgfSk7CiAgICBzdC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVybW92ZScsIGUgPT4gewogICAgICBpZiAoIWZzLnB0cy5oYXMoZS5wb2ludGVySWQpKSByZXR1cm47IGZzLnB0cy5zZXQoZS5wb2ludGVySWQsIFtlLmNsaWVudFgsIGUuY2xpZW50WV0pOwogICAgICBpZiAoZnMucHRzLnNpemUgPT09IDIgJiYgZnMucGluY2gpIHsgY29uc3QgYSA9IFsuLi5mcy5wdHMudmFsdWVzKCldOyBmc1pvb20oTWF0aC5oeXBvdChhWzBdWzBdIC0gYVsxXVswXSwgYVswXVsxXSAtIGFbMV1bMV0pIC8gZnMucGluY2gpOyB9CiAgICAgIGVsc2UgaWYgKGZzLmRyYWcpIHsgZnMudHggPSBlLmNsaWVudFggLSBmcy5kcmFnWzBdOyBmcy50eSA9IGUuY2xpZW50WSAtIGZzLmRyYWdbMV07IGZzQXBwbHkoKTsgfQogICAgfSk7CiAgICBjb25zdCB1cCA9IGUgPT4geyBmcy5wdHMuZGVsZXRlKGUucG9pbnRlcklkKTsgaWYgKGZzLnB0cy5zaXplIDwgMikgZnMucGluY2ggPSBudWxsOyBpZiAoIWZzLnB0cy5zaXplKSBmcy5kcmFnID0gbnVsbDsgfTsKICAgIHN0LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsIHVwKTsgc3QuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmNhbmNlbCcsIHVwKTsKICAgIHN0LmFkZEV2ZW50TGlzdGVuZXIoJ3doZWVsJywgZSA9PiB7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgaWYgKHBlcmZvcm1hbmNlLm5vdygpIC0gKGZzLm9wZW5lZEF0IHx8IDApIDwgMzUwKSByZXR1cm47ICAgLy8gVHJhY2twYWQtTW9tZW50dW0gdm9tIE9lZmZuZW4gaWdub3JpZXJlbgogICAgICBpZiAoZS5jdHJsS2V5IHx8IGUubWV0YUtleSkgZnNab29tKGZzLnogKiBNYXRoLmV4cCgtZS5kZWx0YVkgKiAwLjAwMjIpKTsgIC8vIFBpbmNoL0NtZCtTY3JvbGwgPSBab29tCiAgICAgIGVsc2UgeyBmcy50eCAtPSBlLmRlbHRhWDsgZnMudHkgLT0gZS5kZWx0YVk7IGZzQXBwbHkoKTsgfSAgICAgICAgICAgICAgICAgIC8vIFNjcm9sbCA9IFZlcnNjaGllYmVuCiAgICB9LCB7IHBhc3NpdmU6IGZhbHNlIH0pOwogIH0KICBmdW5jdGlvbiBmc0tleShlKSB7IGlmIChlLmtleSA9PT0gJ0VzY2FwZScgfHwgZS5rZXkgPT09ICdFc2MnKSB7IGUucHJldmVudERlZmF1bHQoKTsgZnNDbG9zZSgpOyB9IH0KICBmdW5jdGlvbiBmc1pvb20oeikgeyBmcy56ID0gTWF0aC5tYXgoMC40LCBNYXRoLm1pbig4LCB6KSk7IGZzQXBwbHkoKTsgfQogIGZ1bmN0aW9uIGZzQXBwbHkoKSB7CiAgICBjb25zdCBjID0gJCgnI3d6LWZzLWNhbnZhcycpOyBpZiAoYykgYy5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlKCR7ZngyKGZzLnR4KX1weCwke2Z4Mihmcy50eSl9cHgpIHNjYWxlKCR7ZngyKGZzLnopfSlgOwogICAgY29uc3QgemwgPSAkKCcjd3otZnMteicpOyBpZiAoemwpIHpsLnRleHRDb250ZW50ID0gTWF0aC5yb3VuZChmcy56ICogMTAwKSArICcgJSc7CiAgfQogIGNvbnN0IGZ4MiA9IG4gPT4gTWF0aC5yb3VuZChuICogMTAwKSAvIDEwMDsKICBmdW5jdGlvbiBmc1JlbmRlcigpIHsKICAgIGNvbnN0IHAgPSBzdGF0ZS50eXAgPyBwYXJhbXNGb3Ioc3RhdGUpIDogbnVsbDsgaWYgKCFwKSByZXR1cm47CiAgICBjb25zdCBSID0gd2luZG93LldlaXNzRml0dGluZ1JlbmRlcjsKICAgIGNvbnN0IHN2ZyA9IChzdGF0ZS52aWV3ID09PSAnYW5zaWNodCcgJiYgUikgPyBSLnJlbmRlckZpdHRpbmcocCwgeyB3aWR0aDogMTIwMCwgaGVpZ2h0OiA3MDAgfSkgOiBTVkcucmVuZGVyRml0dGluZyhwLCB7IHdpZHRoOiAxMjAwLCBoZWlnaHQ6IDcwMCB9KTsKICAgICQoJyN3ei1mcy1jYW52YXMnKS5pbm5lckhUTUwgPSBzdmc7CiAgICAkKCcjd3otZnMtY29kZScpLnRleHRDb250ZW50ID0gdHlwZWNvZGUoc3RhdGUpOwogICAgJCgnI3d6LWZzLXRvZ2dsZScpLmlubmVySFRNTCA9IGA8YnV0dG9uIGNsYXNzPSIke3N0YXRlLnZpZXcgPT09ICd6ZWljaG51bmcnID8gJ3NlbCcgOiAnJ30iIGRhdGEtYWN0PSJ2aWV3IiBkYXRhLWlkPSJ6ZWljaG51bmciPlplaWNobnVuZzwvYnV0dG9uPjxidXR0b24gY2xhc3M9IiR7c3RhdGUudmlldyA9PT0gJ2Fuc2ljaHQnID8gJ3NlbCcgOiAnJ30iIGRhdGEtYWN0PSJ2aWV3IiBkYXRhLWlkPSJhbnNpY2h0Ij5BbnNpY2h0PC9idXR0b24+YDsKICB9CiAgZnVuY3Rpb24gZnNPcGVuKCkgewogICAgaWYgKCFzdGF0ZS50eXApIHJldHVybjsgZnNFbnN1cmUoKTsKICAgIGZzLm9wZW4gPSB0cnVlOyBmcy56ID0gMTsgZnMudHggPSAwOyBmcy50eSA9IDA7IGZzLm9wZW5lZEF0ID0gcGVyZm9ybWFuY2Uubm93KCk7CiAgICBjb25zdCBkID0gJCgnI3d6LWZzJyk7IGQuaGlkZGVuID0gZmFsc2U7IGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJzsKICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZnNLZXksIHRydWUpOwogICAgZnNSZW5kZXIoKTsgZnNBcHBseSgpOyBkLmZvY3VzKCk7CiAgfQogIGZ1bmN0aW9uIGZzQ2xvc2UoKSB7CiAgICBmcy5vcGVuID0gZmFsc2U7IGNvbnN0IGQgPSAkKCcjd3otZnMnKTsgaWYgKGQpIGQuaGlkZGVuID0gdHJ1ZTsKICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnJzsKICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZnNLZXksIHRydWUpOwogIH0KCiAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQbGFuc2tpenplIC8gRGF0ZW5ibGF0dCAoQTQpICovCiAgY29uc3QgZm10TU0gPSBuID0+IG4gPT0gbnVsbCB8fCAhaXNGaW5pdGUoTnVtYmVyKG4pKSA\\\/ICdmb2xndCcgOiBTdHJpbmcoTWF0aC5yb3VuZChOdW1iZXIobikgKiAxMDApIC8gMTAwKS5yZXBsYWNlKCcuJywgJywnKTsKICBmdW5jdGlvbiBkYXRhc2hlZXRSb3dzKCkgewogICAgY29uc3QgcyA9IHN0YXRlLCB0ID0gdHlwT2JqKHMudHlwKTsgY29uc3Qgb3V0ID0gW107CiAgICBpZiAoIXQpIHJldHVybiBvdXQ7CiAgICAvLyBudXJGbGFuc2NoIChCbGluZGRlY2tlbC9LbGFtbWVyKTogRXMgZ2lidCBrZWluZSBSZWloZW56ZWlsZSAtIGRpZSBNYXNzZSBrb21tZW4KICAgIC8vIGF1cyBmbGFuc2NoZ3JvZXNzZW4uIFJ1bmRlIDcgKFctMDU5KTogTWl0IGRlbiBlY2h0ZW4gWmVpY2hudW5nZW4gYmVrb21tZW4gQkQvS0wKICAgIC8vIGF1Y2ggZWluIERhdGVuYmxhdHQuIEVzIGVudGhhZWx0IG51ciBiZWxlZ3RlIE1hc3NlOyB1bmJlbGVndGUgRmxhbnNjaGdyb2Vzc2VuCiAgICAvLyAoMjg2LDEvMzE5LzMzOCkgZXJyZWljaGVuIGRhcyBEYXRlbmJsYXR0IG5pY2h0LCB3ZWlsIHBhcmFtc0ZvciBkb3J0IG51bGwgbGllZmVydC4KICAgIGlmIChpc3ROdXJGbGFuc2NoKHQpKSB7CiAgICAgIGNvbnN0IGYgPSBmbGFuc2NoRm9yKHMpOyBpZiAoIWYpIHJldHVybiBvdXQ7CiAgICAgIG91dC5wdXNoKFsnTm9ybScsICdESU4gMzI2NzYgwrcgT2JlcmZsw6RjaGVuIG5hY2ggRElOIDExODY2J10pOwogICAgICBvdXQucHVzaChbJ0JhdXRlaWwnLCB0LmxhYmVsXSk7CiAgICAgIG91dC5wdXNoKFsnS29uZmlndXJhdGlvbnMtTnIuJywgdHlwZWNvZGUocyldKTsKICAgICAgY29uc3QgYXJ0RiA9IGFydGljbGVOdW1iZXIocyk7IGlmIChhcnRGKSBvdXQucHVzaChbJ0FydGlrZWwtTnIuJywgYXJ0Rl0pOwogICAgICBvdXQucHVzaChbJ0ZsYW5zY2gt4oyAJywgZi5sYWJlbCArICcgbW0nXSk7CiAgICAgIGlmIChpc3RLbGFtbWVyKHQpKSB7CiAgICAgICAgY29uc3Qga3QgPSBrbGFtbWVyVHlwT2JqKHMua2xhbW1lclR5cCk7CiAgICAgICAgaWYgKGt0KSBvdXQucHVzaChbJ0tsYW1tZXJ0eXAnLCBrdC5sYWJlbCArICcg4oCTICcgKyBrdC5zdWJdKTsKICAgICAgICBvdXQucHVzaChbJ01hw58gQScsIGYua2xhbW1lckEgJiYgZi5rbGFtbWVyQVtzLmtsYW1tZXJUeXBdICE9IG51bGwgPyBmbXRNTShmLmtsYW1tZXJBW3Mua2xhbW1lclR5cF0pICsgJyBtbScgOiAnYXVmIEFuZnJhZ2UnXSk7CiAgICAgICAgY29uc3QgbXUgPSAoRC5rbGFtbWVyTXV0dGVybiB8fCBbXSkuZmluZChtID0+IG0uaWQgPT09IHMua2xhbW1lck11dHRlcik7CiAgICAgICAgaWYgKG11KSBvdXQucHVzaChbJ011dHRlcicsIG11LmxhYmVsICsgKG11LmF1ZnByZWlzID8gJyAoZ2VnZW4gQXVmcHJlaXMpJyA6ICcnKV0pOwogICAgICB9IGVsc2UgewogICAgICAgIG91dC5wdXNoKFsnRGVja2Vsc3TDpHJrZSBMJywgZi5ibGluZFRoayAhPSBudWxsID8gZm10TU0oZi5ibGluZFRoaykgKyAnIG1tJyA6ICdhdWYgQW5mcmFnZSddKTsKICAgICAgfQogICAgICBvdXQucHVzaChbJ1dlcmtzdG9mZicsIGVmZldlcmtzdG9mZihzKSB8fCAnZm9sZ3QnXSk7CiAgICAgIC8vIFIyLTQ6IERpZSBLbGFtbWVyIGhhdCBrZWluZSBPYmVyZmxhZWNoZSAtPiBhdWNoIGtlaW5lIE9iZXJmbGFlY2hlbi1aZWlsZSBpbSBEYXRlbmJsYXR0LgogICAgICBpZiAoIWlzdEtsYW1tZXIodCkpIHsKICAgICAgICBjb25zdCBvb0YgPSBELm9iZXJmbGFlY2hlbi5maW5kKG8gPT4gby5pZCA9PT0gcy5vYmVyZmxhZWNoZSk7CiAgICAgICAgY29uc3QgcmFGID0gb29GICYmIG9vRi5yYUlubmVuICE9IG51bGwgJiYgb29GLnJhQXVzc2VuICE9IG51bGw7CiAgICAgICAgb3V0LnB1c2goWydPYmVyZmzDpGNoZScsIHMub2JlcmZsYWVjaGUgKyAocmFGID8gJyDigJQgUmEgaW5uZW4g4omkJyArIFN0cmluZyhvb0YucmFJbm5lbikucmVwbGFjZSgnLicsICcsJykgKyAnIC8gYXXDn2VuIOKJpCcgKyBTdHJpbmcob29GLnJhQXVzc2VuKS5yZXBsYWNlKCcuJywgJywnKSArICcgwrVtJyA6ICcnKV0pOwogICAgICB9CiAgICAgIGNvbnN0IG53RiA9IHMubmFjaHdlaXNlLm1hcChpZCA9PiBuYWNod2Vpc0xhYmVsQnlJZChpZCkpLmZpbHRlcihCb29sZWFuKS5qb2luKCcsICcpOwogICAgICBvdXQucHVzaChbJ05hY2h3ZWlzZScsIG53RiB8fCAn4oCUJ10pOwogICAgICBvdXQucHVzaChbJ01lbmdlJywgcy5tZW5nZSArICcgU3TDvGNrJ10pOwogICAgICBjb25zdCBwaUYgPSBwcmljZUluZm8ocyk7CiAgICAgIC8vIFdpZSB1bnRlbjogc29sYW5nZSBwcmVpc2UucGxhdHpoYWx0ZXIgZ2lsdCwgbnVyICJhdWYgQW5mcmFnZSIgLSBrZWluIEV1cm8tV2VydC4KICAgICAgb3V0LnB1c2goWydQcmVpc3N0YXR1cycsIChwaUYubW9kZSA9PT0gJ2xpdmUnICYmICFwaUYucGxhdHpoYWx0ZXIpCiAgICAgICAgPyBldXIocGlGLnN0dWVjaykgKyAnIOKCrCAvIFN0w7xjayDCtyBHZXNhbXQgJyArIGV1cihwaUYuZ2VzYW10KSArICcg4oKsJwogICAgICAgIDogJ2F1ZiBBbmZyYWdlJ10pOwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgY29uc3QgcncgPSByb3dGb3Iocyk7CiAgICBpZiAoIXJ3KSByZXR1cm4gb3V0OwogICAgY29uc3Qgbm9ybVRleHQgPSB0LmlkID09PSAnQ0YnCiAgICAgID8gKEQubWFzc2UuY29ubmVjdC5jZi5yZWloZW5bcy5jb25uZWN0Tm9ybV0gfHwge30pLmxhYmVsCiAgICAgIDogdC5pZCA9PT0gJ0NGSScgPyBELm1hc3NlLmNvbm5lY3QuY2ZpLm5vcm0KICAgICAgOiBELm5vcm1lbi5maW5kKG4gPT4gbi5pZCA9PT0gcy5ub3JtKS5sYWJlbCArICcgwrcgT2JlcmZsw6RjaGVuIG5hY2ggRElOIDExODY2JzsKICAgIG91dC5wdXNoKFsnTm9ybScsIG5vcm1UZXh0XSk7CiAgICBvdXQucHVzaChbJ0JhdXRlaWwnLCB0LmxhYmVsXSk7CiAgICBvdXQucHVzaChbJ0tvbmZpZ3VyYXRpb25zLU5yLicsIHR5cGVjb2RlKHMpXSk7CiAgICBjb25zdCBwcm9kdWt0QXJ0ID0gYXJ0aWNsZU51bWJlcihzKTsgaWYgKHByb2R1a3RBcnQpIG91dC5wdXNoKFsnQXJ0aWtlbC1Oci4nLCBwcm9kdWt0QXJ0XSk7CiAgICBvdXQucHVzaChbJ0dyw7bDn2UnLCBsYmwocncpICsgKGlzQ29ubmVjdCh0KSA\\\/ICcnIDogJyAoUmVpaGUgJyArIHMucmVpaGUgKyAnKScpXSk7CiAgICBpZiAoaXNDb25uZWN0KHQpKSB7CiAgICAgIG91dC5wdXNoKFsnVHlwJywgdC5pZF0pOwogICAgICBvdXQucHVzaChbJ0RlIC8gRGknLCBmbXRNTShydy5EZSkgKyAnIC8gJyArIGZtdE1NKHJ3LkRpKSArICcgbW0nXSk7CiAgICAgIGlmICh0LmlkID09PSAnQ0YnKSB7CiAgICAgICAgb3V0LnB1c2goWydEZicsIGZtdE1NKHJ3LkRmKSArICcgbW0nXSk7CiAgICAgICAgb3V0LnB1c2goWydFaW5iYXVsw6RuZ2UgTCcsIGZtdE1NKHMuY29ubmVjdExhZW5nZSkgKyAnIG1tJ10pOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IGVuZCA9IGNvbm5lY3RFbmRGb3IocywgcncpOwogICAgICAgIGNvbnN0IHVwcGVyID0gRC5tYXNzZS5jb25uZWN0LmNmaS5vYmVyZXJBbnNjaGx1c3M7CiAgICAgICAgb3V0LnB1c2goWydSb2hyYW5zY2hsdXNzJywgcy5jb25uZWN0QW5zY2hsdXNzID09PSAnVEMnID8gJ1RyaS1DbGFtcCcgOiAnQnV0dCBXZWxkJ10pOwogICAgICAgIG91dC5wdXNoKFsnWSAvIEwnLCBmbXRNTShydy5ZKSArICcgLyAnICsgZm10TU0oZW5kICYmIGVuZC5MKSArICcgbW0nXSk7CiAgICAgICAgb3V0LnB1c2goW3MuY29ubmVjdEFuc2NobHVzcyA9PT0gJ1RDJyA\\\/ICdUQycgOiAnQScsIGZtdE1NKGVuZCAmJiAocy5jb25uZWN0QW5zY2hsdXNzID09PSAnVEMnID8gZW5kLlRDIDogZW5kLkEpKSArICcgbW0nXSk7CiAgICAgICAgb3V0LnB1c2goWydPYmVyZXIgQW5zY2hsdXNzIERlIC8gRGknLCBmbXRNTSh1cHBlci5EZSkgKyAnIC8gJyArIGZtdE1NKHVwcGVyLkRpKSArICcgbW0nXSk7CiAgICAgIH0KICAgICAgaWYgKCFwcm9kdWt0QXJ0KSBvdXQucHVzaChbJ0FydGlrZWwtTnIuJywgJ3dpcmQgdm9uIEZpcm1hIFdlaXNzIGVyZ8Okbnp0J10pOwogICAgfSBlbHNlIHsKICAgIC8vIG9kT2Y6IFRDRCAtPiBhdXNzZW5EIChkaWNrd2FuZGlnKSwgc29uc3QgdHViZU9ELiBEYXMgRGF0ZW5ibGF0dCBpc3QgZWluIEt1bmRlbmRva3VtZW50IC0KICAgIC8vIGhpZXIgc3RhbmQgbWl0IHJ3LnR1YmVPRCBmdWVyIFRDRCAidW5kZWZpbmVkIiBiencuIGRhcyBkdWVubndhbmRpZ2UgTWFzcy4KICAgIG91dC5wdXNoKFsnUm9ociDijIAgw5cgV2FuZHN0w6Rya2UnLCBmbXRNTShvZE9mKHJ3KSkgKyAnIMOXICcgKyBmbXRNTSh3YWxsT2YocncpKSArICcgbW0nXSk7CiAgICBpZiAodC5ub3JtID09PSAnZGluMzI2NzYnICYmIHJ3LmZsYW5nZU9EKSBvdXQucHVzaChbJ0tsZW1tLS9GbGFuc2NoLeKMgCcsIGZtdE1NKHJ3LmZsYW5nZU9EKSArICcgbW0nXSk7CiAgICAvLyBsYWVuZ2VPZiBzdGF0dCBzdmdUeXBlLUFiZnJhZ2U6IFRDRCBoYXQga2VpbiBLSy9LTCwgc29uZGVybiBkaWUgSG9laGUgNjAgbW0uCiAgICAvLyBVZWJlciBkZW4gc3ZnVHlwZSBzdGFuZCBoaWVyICJTdHV0emVubMOkbmdlIChLSyk6IHVuZGVmaW5lZCBtbSIuCiAgICBjb25zdCBsZ0QgPSBsYWVuZ2VPZih0LCBydywgcy5sYWVuZ2VWYXJpYW50ZSk7CiAgICBpZiAobGdEKSBvdXQucHVzaChbbGdELnRleHQsIGZtdE1NKGxnRC53ZXJ0KSArICcgbW0nICsgKGxnRC5sYWJlbCA9PT0gJ2gnID8gJyAoU3RhbmRhcmQgdm9uIEZpcm1hIFdlaXNzKScgOiAnJyldKTsKICAgIGlmICh0LnN2Z1R5cGUgPT09ICdibGluZGthcHBlJykgb3V0LnB1c2goWydEZWNrZWxzdMOkcmtlJywgJ2ZvbGd0J10pOwogICAgaWYgKGlzQmVuZCh0KSkgewogICAgICBvdXQucHVzaChbJ0JpZWdlcmFkaXVzIFInLCBmbXRNTShydy5SKSArICcgbW0nXSk7CiAgICAgIG91dC5wdXNoKFt0LmJvZ2VuID09PSA0NSA\\\/ICdHZXNhbXRtYcOfIEwyJyA6ICdHZXNhbXRtYcOfIEwxJywgZm10TU0odC5ib2dlbiA9PT0gNDUgPyBydy5MMiA6IHJ3LkwxKSArICcgbW0nXSk7CiAgICAgIG91dC5wdXNoKFsnR2VyYWRlcyBFbmRlIEwzJywgZm10TU0odC5ib2dlbiA9PT0gNDUgPyBydy5MM180NSA6IHJ3LkwzXzkwKSArICcgbW0nXSk7CiAgICB9CiAgICBpZiAodC56d2VpdGVHcm9lc3NlKSB7IGNvbnN0IHIyID0gcm93MkZvcihzKTsgaWYgKHIyKSBvdXQucHVzaChbdC5zdmdUeXBlID09PSAncmVkdXppZXJ1bmcnID8gJ1JlZHV6aWVydCBhdWYnIDogJ0FiZ2FuZycsIGxibChyMikgKyAnIMK3IOKMgCAnICsgZm10TU0ob2RPZihyMikpICsgJyBtbSddKTsgfQogICAgaWYgKHQuaWQgPT09ICdSJykgeyBjb25zdCBwYWlyID0gcmVkdWN0aW9uUGFpcihzKTsgaWYgKHBhaXIpIG91dC5wdXNoKFsnQmF1bMOkbmdlIEwnLCBmbXRNTShwYWlyLkwpICsgJyBtbSddKTsgfQogICAgaWYgKHQuZXh6ZW50cmlzY2hXYWhsKSBvdXQucHVzaChbJ0JhdWZvcm0nLCBzLmV4emVudHJpc2NoID8gJ2V4emVudHJpc2NoIChGb3JtIFJFKScgOiAna29uemVudHJpc2NoIChGb3JtIFJLKSddKTsKICAgIC8vIFIzLTMvUjMtNDogQmF1Zm9ybSBkZXIgVC1TdMO8Y2tlIGlucyBEYXRlbmJsYXR0LiBEYXMgTGF1Zm1hw58gKCJMYXVmIiA9IEwgZ2VzYW10ID0KICAgIC8vIDLDlyBMMCkgaGVpw590IHNlaXQgQmVybmRzIFZvcmdhYmUgdm9tIDI3LjA3LjIwMjYgbnVyIG5vY2ggIkwiIC0gc28gc3RlaHQgZXMgYXVjaAogICAgLy8gaW4gZGVyIFplaWNobnVuZy4gSGllciBzdGVodCBudXIgZGllIGdld8OkaGx0ZSBGb3JtLCBrZWluIE1hw58uCiAgICBpZiAodC5mb3JtV2FobCkgb3V0LnB1c2goWydCYXVmb3JtJywgcy5mb3JtVmFyaWFudGUgPT09ICdUSycgPyAnRm9ybSBUSyAoRHVyY2hnYW5nIGdsZWljaCwgQWJnYW5nIGt1cnopJyA6ICdGb3JtIFQgKGFsbGUgQWJnw6RuZ2UgZ2xlaWNoIGxhbmcpJ10pOwogICAgaWYgKHQuaWQgPT09ICdUUycgfHwgdC5pZCA9PT0gJ1RTUicpIHsKICAgICAgLy8gTWFzc3F1ZWxsZTogVFMgLT4gRHVyY2hnYW5nc3plaWxlLCBUU1IgLT4gYmVsZWd0ZXMgUGFhciAoTDIvTDEgdmFyaWllcmVuIGplIEFiendlaWcpLgogICAgICAvLyBPaG5lIFF1ZWxsZSBibGVpYmVuIGRpZSBaZWlsZW4gd2VnLCBzdGF0dCBlaW4gImZvbGd0IiB6dSBiZWhhdXB0ZW4uCiAgICAgIGNvbnN0IHNyYyA9IHQuaWQgPT09ICdUU1InID8gdFN0dWVja1BhaXIocykgOiBydzsKICAgICAgaWYgKHNyYykgewogICAgICAgIG91dC5wdXNoKFsnTDAnLCBmbXRNTShzcmMuTDApICsgJyBtbSddKTsKICAgICAgICAvLyBCZXJuZCAyNy4wNy4yMDI2OiAiQmVpIExhdWYgbnVyIEwgc2NocmVpYmVuLiIgKHZvcmhlciAiTGF1ZiBMIikKICAgICAgICBvdXQucHVzaChbJ0wnLCBmbXRNTShzcmMuTCkgKyAnIG1tJ10pOwogICAgICAgIC8qIEZvcm0gVCBiZW1hc3N0IGRlbiBBYmdhbmcgbWl0IEwyLCBGb3JtIFRLIG1pdCBkZW0gV2VydCBhdXMgU3BhbHRlIEwxCiAgICAgICAgICogKEJlcm5kIDI3LjA3LjIwMjYpLiBEYXMgS8O8cnplbCBmb2xndCBqZXR6dCBkZXIgQmF1Zm9ybTogYmVpIEZvcm0gVEsgc3RhbmQKICAgICAgICAgKiBoaWVyICJBYmdhbmcgTDIiIHVuZCBkaXJla3QgZGFydW50ZXIgZGllc2VsYmUgWmFobCBub2NoIGVpbm1hbCBhbHMgIkwxIiAtCiAgICAgICAgICogZGFzIERhdGVuYmxhdHQgd2lkZXJzcHJhY2ggc2ljaCBzZWxic3QuIEJlaSBGb3JtIFRLIHRyw6RndCBkaWUgQWJnYW5nc3plaWxlCiAgICAgICAgICogZGVzaGFsYiBkaWUgVGFiZWxsZW5zcGFsdGUgTDEgc2FtdCBUb2xlcmFueiB1bmQgZGllIEV4dHJhLVplaWxlIGVudGbDpGxsdDsKICAgICAgICAgKiBiZWkgRm9ybSBUIGJsZWlidCBMMiBkaWUgQWJnYW5nc3plaWxlIHVuZCBMMSBkaWUgenVzw6R0emxpY2hlIFNwYWx0ZS4gKi8KICAgICAgICBpZiAocy5mb3JtVmFyaWFudGUgPT09ICdUSycpIHsKICAgICAgICAgIC8qIE9obmUgYmVsZWd0ZSBTcGFsdGUgTDEgKFN0cmljaCBpbiBkZXIgV2Vpc3MtVGFiZWxsZSkgZ2lidCBlcyBLRUlOIEFiZ2FuZ3NtYcOfLgogICAgICAgICAgICogdGtBYmdhbmcoKSBzZXR6dCBkb3J0IG5hY2ggQmVybmRzIFJlZ2VsIDAgLSBhbHMgZ2VkcnVja3RlIE1hw596YWhsIGltCiAgICAgICAgICAgKiBLdW5kZW5kb2t1bWVudCB3w6RyZSBkYXMgZWluZSBlcmZ1bmRlbmUgTnVsbC4gRGVzaGFsYiAiZm9sZ3QiLiBEaWVzZSBHcsO2w59lbgogICAgICAgICAgICogZXJyZWljaGVuIGRhcyBEYXRlbmJsYXR0IGhldXRlIG9obmVoaW4gbmljaHQgKHBhcmFtc0ZvciBsaWVmZXJ0IHZvcmhlciBudWxsKSwKICAgICAgICAgICAqIGRlciBTY2h1dHogZ2Vow7ZydCB0cm90emRlbSBhbiBkaWUgU3RlbGxlLCBkaWUgZGllIFplaWxlIGVyemV1Z3QuICovCiAgICAgICAgICBvdXQucHVzaChbJ0FiZ2FuZyBMMScsIHNyYy5MMSAhPSBudWxsID8gU3RyaW5nKHNyYy5MMSkgKyAnIG1tJyA6ICdmb2xndCddKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgb3V0LnB1c2goWydBYmdhbmcgTDInLCBmbXRNTShhYmdhbmdMMihzLCBzcmMpKSArICcgbW0nXSk7CiAgICAgICAgICBpZiAoc3JjLkwxKSBvdXQucHVzaChbJ0wxJywgc3JjLkwxICsgJyBtbSddKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIH0KICAgIC8qIFR5cCBEIChCYXV0ZWlsIERpY2h0dW5nKTogRWRlbHN0YWhsLVdlcmtzdG9mZiB1bmQgT2JlcmZsYWVjaGUgZ2Vob2VyZW4gbmljaHQKICAgICAqIGlucyBEYXRlbmJsYXR0IGVpbmVyIEd1bW1pLS9QVEZFLURpY2h0dW5nIChCZXJuZCAxMS4wOC4yMDI2KS4gU3RhdHRkZXNzZW4KICAgICAqIHN0ZWhlbiBkb3J0IGRpZSBiZWlkZW4gTWFzc2UsIGRpZSBkaWUgRGljaHR1bmcgd2lya2xpY2ggYmVzY2hyZWliZW4gLSB1bmQKICAgICAqIGRlciBJbm5lbi3DmCBDIGhhZW5ndCBhbSBEaWNodHVuZ3N3ZXJrc3RvZmYsIHNpZWhlIGRpY2h0dW5nSW5uZW5EKCkuICovCiAgICBpZiAoaXN0RGljaHR1bmdCYXV0ZWlsKHQpKSB7CiAgICAgIGlmIChydyAmJiBydy5nYXNrZXRPRCAhPSBudWxsKSBvdXQucHVzaChbJ0RpY2h0dW5ncy1BdcOfZW4t4oyAIEUnLCBmbXRNTShydy5nYXNrZXRPRCkgKyAnIG1tJ10pOwogICAgICBjb25zdCBjRCA9IGRpY2h0dW5nSW5uZW5EKHMsIHJ3KTsKICAgICAgaWYgKGNEICE9IG51bGwpIG91dC5wdXNoKFsnRGljaHR1bmdzLUlubmVuLeKMgCBDJywgZm10TU0oY0QpICsgJyBtbSddKTsKICAgIH0gZWxzZSB7CiAgICAgIG91dC5wdXNoKFsnV2Vya3N0b2ZmJywgcy53ZXJrc3RvZmYgKyAnICgnICsgKHMud2Vya3N0b2ZmID09PSAnMS40NDM1JyA\\\/ICdYMkNyTmlNbzE4LTE0LTMnIDogJ1gyQ3JOaU1vMTctMTItMicpICsgJyknXSk7CiAgICAgIGNvbnN0IG9vID0gRC5vYmVyZmxhZWNoZW4uZmluZChvID0+IG8uaWQgPT09IHMub2JlcmZsYWVjaGUpOwogICAgICAvLyBTaWVoZSBSRlEtTWFpbDogUmEgbnVyIGJlaSBiZXN0YWV0aWd0ZW4gV2VydGVuLiBIMSBoYXQga2VpbmVuIGZlc3RlbiBSYS1HcmVuendlcnQKICAgICAgLy8gKHJhSW5uZW4vcmFBdXNzZW4gPSBudWxsKSAtPiBpbiBkZXIgUGxhbnNraXp6ZSBzdGVodCBkYW5uIG51ciAiSDEiLgogICAgICBjb25zdCByYU9rMiA9IG9vICYmIG9vLnJhSW5uZW4gIT0gbnVsbCAmJiBvby5yYUF1c3NlbiAhPSBudWxsOwogICAgICBvdXQucHVzaChbJ09iZXJmbMOkY2hlJywgcy5vYmVyZmxhZWNoZSArIChyYU9rMiA\\\/ICcg4oCUIFJhIGlubmVuIOKJpCcgKyBTdHJpbmcob28ucmFJbm5lbikucmVwbGFjZSgnLicsICcsJykgKyAnIC8gYXXDn2VuIOKJpCcgKyBTdHJpbmcob28ucmFBdXNzZW4pLnJlcGxhY2UoJy4nLCAnLCcpICsgJyDCtW0nIDogJycpXSk7CiAgICB9CiAgICAvLyBLb25mb3JtaXRhZXRzLVp1c2F0eiBmb2xndCBkZXIgQW53ZW5kdW5nIChCZXJuZCAxMS4wOC4yMDI2KSwgZnJ1ZWhlciBzdGFuZCBoaWVyCiAgICAvLyBmdWVyIGFsbGUgdmllciBBbndlbmR1bmdlbiAiVVNQIENsYXNzIFZJIi4KICAgIGlmICh0LmRpY2h0dW5nICYmIHMuZGljaHR1bmcpIHsKICAgICAgY29uc3QgZGQgPSBkaWNodE9iaihzLmRpY2h0dW5nKSwgZmsgPSBmZGFLdXJ6VGV4dCgpOwogICAgICBvdXQucHVzaChbJ0RpY2h0dW5nJywgZGQubGFiZWwgKyAoZGQuZmRhID09PSB0cnVlID8gJyDCtyBGREEnIDogJycpICsgKChkZC51c3BWSSA9PT0gdHJ1ZSAmJiBmaykgPyAnIMK3ICcgKyBmayA6ICcnKV0pOwogICAgfQogICAgLy8gRHJ1Y2tzdGFmZmVsIGdpbHQgZnVlciBkaWUgRFVFTk5XQU5ESUdFIERJTi0zMjY3Ni1SZWloZSAoU3RhZmZlbCBuYWNoIFJvaHItQUQpLgogICAgLy8gRnVlciBkZW4gZGlja3dhbmRpZ2VuIFRDRCAoa2VpbiB0dWJlT0QpIGxpZWd0IGtlaW5lIERydWNrYW5nYWJlIHZvciAtPiAiZm9sZ3QiLgogICAgLy8gRGVuIGRpY2t3YW5kaWdlbiBhdXNzZW5EIGluIGRpZXNlIFN0YWZmZWwgenUgc3RlY2tlbiB3YWVyZSBnZXJhdGVuICh1bmQgd2VpY2h0CiAgICAvLyB0ZWlsd2Vpc2UgYWIsIHouIEIuIFRDRC9ETjQwOiBhdXNzZW5EIDQ2IC0+IDE2IGJhciB2cy4gZHVlbm53YW5kaWcg4oyANDEgLT4gMjUgYmFyKS4KICAgIC8vIERlciBUZW1wZXJhdHVyYmVyZWljaCBoYWVuZ3QgZGFnZWdlbiBuaWNodCBhbSBBRCwgc29uZGVybiBhbiBLbGFtbWVyL0RpY2h0dW5nCiAgICAvLyAoRC5laW5zYXR6LnRlbXBIaW53ZWlzKSB1bmQgZ2lsdCBmdWVyIGRpZSBDbGFtcHZlcmJpbmR1bmcgbmFjaCBESU4gMzI2NzYgZ2VuZXJlbGwuCiAgICBpZiAodC5pZCA9PT0gJ1RDJyAmJiBELmVpbnNhdHogJiYgRC5laW5zYXR6LmRydWNrQmFuZHMpIHsKICAgICAgY29uc3QgZWIgPSBydy50dWJlT0QgIT0gbnVsbCA\\\/IEQuZWluc2F0ei5kcnVja0JhbmRzLmZpbmQoYiA9PiBydy50dWJlT0QgPD0gYi5hZE1heCkgOiBudWxsOwogICAgICBvdXQucHVzaChbJ1p1bMOkc3NpZ2VyIERydWNrJywgZWIKICAgICAgICA\\\/ICdiaXMgJyArIGViLmJhciArICcgYmFyICgnICsgU3RyaW5nKGViLm1wYSkucmVwbGFjZSgnLicsICcsJykgKyAnIE1QYSkgbmFjaCBESU4gMzI2NzYnCiAgICAgICAgOiAnZm9sZ3QnXSk7CiAgICAgIG91dC5wdXNoKFsnVGVtcGVyYXR1cmJlcmVpY2gnLCBELmVpbnNhdHoudGVtcE1pbiArICcgYmlzICcgKyBELmVpbnNhdHoudGVtcE1heCArICcgwrBDIMK3ICcgKyBELmVpbnNhdHoudGVtcEhpbndlaXNdKTsKICAgIH0KICAgIGNvbnN0IG53ID0gcy5uYWNod2Vpc2UubWFwKGlkID0+IG5hY2h3ZWlzTGFiZWxCeUlkKGlkKSkuZmlsdGVyKEJvb2xlYW4pLmpvaW4oJywgJyk7CiAgICBvdXQucHVzaChbJ05hY2h3ZWlzZScsIG53IHx8ICfigJQnXSk7CiAgICBvdXQucHVzaChbJ01lbmdlJywgcy5tZW5nZSArICcgU3TDvGNrJ10pOwogICAgY29uc3QgcGkgPSBwcmljZUluZm8ocyk7CiAgICAvLyBEYXMgRGF0ZW5ibGF0dCBpc3QgZWluIGhlcnVudGVybGFkYmFyZXMgS3VuZGVuZG9rdW1lbnQgLT4gaGllciBkYXJmIE5JRSBlaW5lCiAgICAvLyBQbGF0emhhbHRlci1aYWhsIHN0ZWhlbi4gU29sYW5nZSBwcmVpc2UucGxhdHpoYWx0ZXIgZ2lsdCwgbnVyICJSaWNodHByZWlzIGZvbGd0IgogICAgLy8gKGdsZWljaGUgTG9naWsgd2llIFZvcnNjaGF1IHVuZCBBbmZyYWdlLU1haWwpLiBLZWluIEV1cm8tV2VydCwga2VpbiBTdWZmaXguCiAgICBvdXQucHVzaChbJ1ByZWlzc3RhdHVzJywgKHBpLm1vZGUgPT09ICdsaXZlJyAmJiAhcGkucGxhdHpoYWx0ZXIpCiAgICAgID8gZXVyKHBpLnN0dWVjaykgKyAnIOKCrCAvIFN0w7xjayDCtyBHZXNhbXQgJyArIGV1cihwaS5nZXNhbXQpICsgJyDigqwnCiAgICAgIDogJ2F1ZiBBbmZyYWdlJ10pOwogICAgcmV0dXJuIG91dDsKICB9CiAgZnVuY3Rpb24gYnVpbGREYXRhc2hlZXQoc2tpcFByaW50KSB7CiAgICBjb25zdCBwID0gc3RhdGUudHlwID8gcGFyYW1zRm9yKHN0YXRlKSA6IG51bGw7IGlmICghcCkgcmV0dXJuOwogICAgbGV0IGRzID0gJCgnI3d6LWRzJyk7IGlmICghZHMpIHsgZHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsgZHMuaWQgPSAnd3otZHMnOyBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRzKTsgfQogICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpLnRvTG9jYWxlRGF0ZVN0cmluZygnZGUtREUnKTsKICAgIGNvbnN0IHQgPSB0eXBPYmooc3RhdGUudHlwKTsKICAgIGNvbnN0IG5vcm1SZWYgPSB0ICYmIHQuaWQgPT09ICdDRicgPyAoRC5tYXNzZS5jb25uZWN0LmNmLnJlaWhlbltzdGF0ZS5jb25uZWN0Tm9ybV0gfHwge30pLmxhYmVsCiAgICAgIDogdCAmJiB0LmlkID09PSAnQ0ZJJyA\\\/IEQubWFzc2UuY29ubmVjdC5jZmkubm9ybQogICAgICA6IHN0YXRlLm5vcm0gPT09ICdkaW4zMjY3NicgPyAnRElOIDMyNjc2IMK3IERJTiAxMTg2NicgOiAnRElOIDExODY1IMK3IERJTiAxMTg2Nic7CiAgICBjb25zdCByb3dzID0gZGF0YXNoZWV0Um93cygpLm1hcCgoW2ssIHZdKSA9PiBgPHRyPjx0ZD4ke2VzYyhrKX08L3RkPjx0ZD4ke2VzYyh2KX08L3RkPjwvdHI+YCkuam9pbignJyk7CiAgICBjb25zdCBSID0gd2luZG93LldlaXNzRml0dGluZ1JlbmRlcjsKICAgIGRzLmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPSJkcy1oZWFkIj4KICAgICAgPGRpdiBjbGFzcz0iZHMtYnJhbmQiPjxzcGFuIGNsYXNzPSJtYXJrIj48L3NwYW4+PHNwYW4+PGI+V0VJU1M8L2I+PGk+QXBwYXJhdGViYXUgwrcgU3RlcmlsdGVjaG5pazwvaT48L3NwYW4+PC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImRzLW1ldGEiPjxiPlBsYW5za2l6emUgLyBEYXRlbmJsYXR0PC9iPjxzcGFuPiR7ZXNjKHR5cGVjb2RlKHN0YXRlKSl9PC9zcGFuPjxzcGFuPiR7dG9kYXl9PC9zcGFuPjwvZGl2PjwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJkcy1kcmF3Ij4ke1NWRy5yZW5kZXJGaXR0aW5nKHAsIHsgd2lkdGg6IDc2MCwgaGVpZ2h0OiA0MzAgfSl9PC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImRzLWdyaWQiPjxkaXYgY2xhc3M9ImRzLXJlbmRlciI+JHtSID8gUi5yZW5kZXJGaXR0aW5nKHAsIHsgd2lkdGg6IDUyMCwgaGVpZ2h0OiAzNDAgfSkgOiAnJ308L2Rpdj4KICAgICAgPHRhYmxlIGNsYXNzPSJkcy10YWJsZSI+PHRib2R5PiR7cm93c308L3Rib2R5PjwvdGFibGU+PC9kaXY+CiAgICAgIDx0YWJsZSBjbGFzcz0iZHMtdGl0bGVibG9jayI+PHRib2R5Pjx0cj4KICAgICAgICA8dGQ+PGk+WmVpY2hudW5ncy1Oci48L2k+PGI+JHtlc2ModHlwZWNvZGUoc3RhdGUpKX08L2I+PC90ZD4KICAgICAgICA8dGQ+PGk+RGF0dW08L2k+PGI+JHt0b2RheX08L2I+PC90ZD4KICAgICAgICA8dGQ+PGk+TWHDn3N0YWI8L2k+PGI+b2huZSBNYcOfc3RhYjwvYj48L3RkPgogICAgICAgIDx0ZD48aT5FaW5oZWl0PC9pPjxiPm1tPC9iPjwvdGQ+CiAgICAgICAgPHRkPjxpPk5vcm1iZXp1ZzwvaT48Yj4ke2VzYyhub3JtUmVmKX08L2I+PC90ZD4KICAgICAgPC90cj48L3Rib2R5PjwvdGFibGU+CiAgICAgIDxwIGNsYXNzPSJkcy1ub3RlIj5VbnZlcmJpbmRsaWNoZSBQbGFuc2tpenplIGF1cyBkZW0gV2Vpc3MgRml0dGluZ3MtS29uZmlndXJhdG9yLCBTY2hyaWZ0ZmVsZCBhbmdlbGVobnQgYW4gRElOIEVOIElTTyA3MjAwLiBNYcOfZSBzaW5kIFJpY2h0d2VydGUgYmlzIHp1ciBBdWZ0cmFnc2Jlc3TDpHRpZ3VuZyDigJQgdmVyYmluZGxpY2hlIEZlcnRpZ3VuZ3N6ZWljaG51bmcgdW5kIEF1c2xlZ3VuZyBkdXJjaCBXZWlzcyBBcHBhcmF0ZWJhdS4gQWxsZSBNYcOfZSBpbiBtbS48L3A+YDsKICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgnd3otcHJpbnRpbmcnKTsKICAgIGlmIChza2lwUHJpbnQpIHJldHVybjsKICAgIGNvbnN0IGRvbmUgPSAoKSA9PiBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ3d6LXByaW50aW5nJyk7CiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignYWZ0ZXJwcmludCcsIGRvbmUsIHsgb25jZTogdHJ1ZSB9KTsKICAgIHdpbmRvdy5wcmludCgpOwogIH0KCiAgZnVuY3Rpb24gc29uZGVyQW5mcmFnZSgpIHsKICAgIGNvbnN0IHQgPSB0eXBPYmooc3RhdGUudHlwKTsKICAgIGNvbnN0IHN1YmogPSAnQW5mcmFnZSBTb25kZXJhYm1lc3N1bmcnICsgKHQgPyAnICcgKyB0LmxhYmVsIDogJycpICsgKHN0YXRlLmdyb2Vzc2UgPyAnICcgKyBsYmwocm93Rm9yKHN0YXRlKSkgOiAnJyk7CiAgICBjb25zdCBib2R5ID0gWydBbmZyYWdlIGbDvHIgZWluZSBTb25kZXJhYm1lc3N1bmcgw7xiZXIgZGVuIFdlaXNzIEZpdHRpbmdzLUtvbmZpZ3VyYXRvcicsICcnLAogICAgICAnQmFzaXMtS29uZmlndXJhdGlvbjonLCBzdGF0ZS50eXAgPyB0eXBlY29kZShzdGF0ZSkgOiAnKG5vY2gga2VpbmUgZ2V3w6RobHQpJywgJycsCiAgICAgICdHZXfDvG5zY2h0ZSBBYndlaWNodW5nIC8gU29uZGVybWHDnzonLCAnICAnLCAnJywgJ0tvbnRha3QgKEZpcm1hIC8gTmFtZSAvIEUtTWFpbCk6JywgJyAgJ10uam9pbignXG4nKTsKICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gJ21haWx0bzonICsgRC5tZXRhLnZlcnRyaWViRW1haWwgKyAnP3N1YmplY3Q9JyArIGVuY29kZVVSSUNvbXBvbmVudChzdWJqKSArICcmYm9keT0nICsgZW5jb2RlVVJJQ29tcG9uZW50KGJvZHkpOwogIH0KCiAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFdmVudHMgKi8KICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7CiAgICBjb25zdCBiID0gZS50YXJnZXQuY2xvc2VzdCgnW2RhdGEtYWN0XScpOyBpZiAoIWIgfHwgYi5kaXNhYmxlZCkgcmV0dXJuOwogICAgY29uc3QgYWN0ID0gYi5nZXRBdHRyaWJ1dGUoJ2RhdGEtYWN0JyksIGlkID0gYi5nZXRBdHRyaWJ1dGUoJ2RhdGEtaWQnKTsKICAgIHN3aXRjaCAoYWN0KSB7CiAgICAgIGNhc2UgJ2Fud2VuZHVuZyc6IHNldEFud2VuZHVuZyhpZCk7IGlmIChzdGF0ZS5zdGVwID09PSAxKSBuZXh0U3RlcCgpOyBicmVhazsKICAgICAgY2FzZSAnbm9ybSc6IHNldE5vcm0oaWQpOyBpZiAoc3RhdGUuc3RlcCA9PT0gMikgbmV4dFN0ZXAoKTsgYnJlYWs7CiAgICAgIGNhc2UgJ3R5cCc6IHNldFR5cChpZCk7IGlmIChzdGF0ZS5zdGVwID09PSAzKSBuZXh0U3RlcCgpOyBicmVhazsKICAgICAgY2FzZSAncmVpaGUnOiBzZXRSZWloZShpZCk7IGJyZWFrOwogICAgICBjYXNlICdjb25uZWN0bm9ybSc6IHNldENvbm5lY3ROb3JtKGlkKTsgYnJlYWs7CiAgICAgIGNhc2UgJ2Nvbm5lY3RsYWVuZ2UnOiBzZXRDb25uZWN0TGFlbmdlKGlkKTsgYnJlYWs7CiAgICAgIGNhc2UgJ2Nvbm5lY3RhbnNjaGx1c3MnOiBzZXRDb25uZWN0QW5zY2hsdXNzKGlkKTsgYnJlYWs7CiAgICAgIC8vIEtsYW1tZXJ0eXAgKEFic2Nobml0dCBFKTogS0wxIC8gS0xMSSAvIEtMSCAtIHppZWh0IGdnZi4gZGVuIEtsYW1tZXItV2Vya3N0b2ZmIG5hY2guCiAgICAgIGNhc2UgJ2tsYW1tZXJ0eXAnOiBzZXRLbGFtbWVyVHlwKGlkKTsgYnJlYWs7CiAgICAgIC8vIE11dHRlci1BcnQgZGVyIEtsYW1tZXIgKFIyLTQpOiBNID0gTXV0dGVyIChTdGFuZGFyZCkgLyBTID0gU2VjaHNrYW50bXV0dGVyIChBdWZwcmVpcykuCiAgICAgIGNhc2UgJ2tsYW1tZXJtdXR0ZXInOiBzZXRLbGFtbWVyTXV0dGVyKGlkKTsgYnJlYWs7CiAgICAgIGNhc2UgJ3dlcmtzdG9mZic6IHNldFdlcmtzdG9mZihpZCk7IGJyZWFrOwogICAgICBjYXNlICdvYmVyZmxhZWNoZSc6IHNldE9iZXJmbGFlY2hlKGlkKTsgYnJlYWs7CiAgICAgIGNhc2UgJ2RpY2h0dW5nJzogcGljayh7IGRpY2h0dW5nOiBpZCB9KTsgYnJlYWs7CiAgICAgIGNhc2UgJ2xhZW5nZSc6IHBpY2soeyBsYWVuZ2VWYXJpYW50ZTogaWQgfSk7IGJyZWFrOwogICAgICBjYXNlICdsaXBwZSc6IHBpY2soeyBsaXBwZTogaWQgfSk7IGJyZWFrOwogICAgICBjYXNlICdzb25kZXInOiBzb25kZXJBbmZyYWdlKCk7IGJyZWFrOwogICAgICAvLyBBNTogZXJzdGVyIEtsaWNrIHNjaGFlcmZ0LCB6d2VpdGVyIHNldHp0IHp1cnVlY2sgKHNpZWhlIGFybVJlc2V0KCkpLgogICAgICBjYXNlICdyZXNldCc6IGlmIChiLmdldEF0dHJpYnV0ZSgnZGF0YS1hcm1lZCcpID09PSAnMScpIHJlc2V0S29uZmlndXJhdGlvbigpOyBlbHNlIGFybVJlc2V0KGIpOyBicmVhazsKICAgICAgY2FzZSAndmlldyc6IHBpY2soeyB2aWV3OiBpZCB9KTsgaWYgKGZzLm9wZW4pIGZzUmVuZGVyKCk7IGJyZWFrOwogICAgICBjYXNlICdmcy1vcGVuJzogZnNPcGVuKCk7IGJyZWFrOwogICAgICBjYXNlICdmcy1jbG9zZSc6IGZzQ2xvc2UoKTsgYnJlYWs7CiAgICAgIGNhc2UgJ2ZzLWluJzogZnNab29tKGZzLnogKiAxLjI1KTsgYnJlYWs7CiAgICAgIGNhc2UgJ2ZzLW91dCc6IGZzWm9vbShmcy56IC8gMS4yNSk7IGJyZWFrOwogICAgICBjYXNlICdmcy1yZXNldCc6IGZzLnogPSAxOyBmcy50eCA9IDA7IGZzLnR5ID0gMDsgZnNBcHBseSgpOyBicmVhazsKICAgICAgY2FzZSAnZXh6JzogcGljayh7IGV4emVudHJpc2NoOiBpZCA9PT0gJ3RydWUnIH0pOyBicmVhazsKICAgICAgLy8gUjMtMy9SMy00OiBCYXVmb3JtIFQgLyBUSyBkZXIgVC1TdMO8Y2tlLgogICAgICBjYXNlICdmb3JtdmFyJzogaWYgKGlkID09PSAnVCcgfHwgaWQgPT09ICdUSycpIHBpY2soeyBmb3JtVmFyaWFudGU6IGlkIH0pOyBicmVhazsKICAgICAgY2FzZSAnbmFjaHdlaXMnOiB7CiAgICAgICAgY29uc3QgaSA9IHN0YXRlLm5hY2h3ZWlzZS5pbmRleE9mKGlkKTsKICAgICAgICBpZiAoaSA+PSAwKSBzdGF0ZS5uYWNod2Vpc2Uuc3BsaWNlKGksIDEpOyBlbHNlIHN0YXRlLm5hY2h3ZWlzZS5wdXNoKGlkKTsKICAgICAgICByZW5kZXJQYW5lbCgpOyByZW5kZXJQcmV2aWV3KCk7IHJlbmRlck5hdigpOyBicmVhazsKICAgICAgfQogICAgICBjYXNlICdtZW5nZSsnOiBzZXRNZW5nZShzdGF0ZS5tZW5nZSArIDEpOyBicmVhazsKICAgICAgY2FzZSAnbWVuZ2UtJzogc2V0TWVuZ2Uoc3RhdGUubWVuZ2UgLSAxKTsgYnJlYWs7CiAgICAgIGNhc2UgJ3N0YWZmZWwnOiBzZXRNZW5nZShwYXJzZUludChiLmdldEF0dHJpYnV0ZSgnZGF0YS1hYicpLCAxMCkpOyBicmVhazsKICAgICAgY2FzZSAnZ290byc6IGdvKHBhcnNlSW50KGIuZ2V0QXR0cmlidXRlKCdkYXRhLW4nKSwgMTApKTsgYnJlYWs7CiAgICAgIGNhc2UgJ25leHQnOiBuZXh0U3RlcCgpOyBicmVhazsKICAgICAgY2FzZSAnYmFjayc6IHByZXZTdGVwKCk7IGJyZWFrOwogICAgICBjYXNlICdjb3B5Y29kZSc6IGNvcHlUZXh0KHR5cGVjb2RlKHN0YXRlKSwgYik7IGJyZWFrOwogICAgICBjYXNlICdzaGFyZSc6IHNoYXJlVGV4dChidWlsZFNoYXJlVGV4dCgpLCBiKTsgYnJlYWs7CiAgICAgIGNhc2UgJ3NoYXJlLWNsb3NlJzogeyBjb25zdCBib3ggPSAkKCcjd3otc2hhcmUtZmFsbGJhY2snKTsgaWYgKGJveCkgYm94LmhpZGRlbiA9IHRydWU7IGJyZWFrOyB9CiAgICAgIGNhc2UgJ3BkZic6IGJ1aWxkRGF0YXNoZWV0KCk7IGJyZWFrOwogICAgICBjYXNlICdhZGRwb3MnOiBhZGRQb3NpdGlvbigpOyBicmVhazsKICAgICAgY2FzZSAnZGVscG9zJzogc3RhdGUucG9zaXRpb25lbi5zcGxpY2UocGFyc2VJbnQoYi5nZXRBdHRyaWJ1dGUoJ2RhdGEtaScpLCAxMCksIDEpOyByZW5kZXJQYW5lbCgpOyBicmVhazsKICAgICAgY2FzZSAnc2VuZCc6IHJmcVNlbmQoKTsgYnJlYWs7CiAgICB9CiAgfSk7CiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZnVuY3Rpb24gKGUpIHsKICAgIGNvbnN0IHIgPSBlLnRhcmdldC5nZXRBdHRyaWJ1dGUgJiYgZS50YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLXJvbGUnKTsKICAgIGlmIChyID09PSAnc2l6ZScpIHNldEdyb2Vzc2UoZS50YXJnZXQudmFsdWUpOwogICAgZWxzZSBpZiAociA9PT0gJ3NpemUyJykgcGljayh7IGdyb2Vzc2UyOiBlLnRhcmdldC52YWx1ZSB9KTsKICAgIC8vIEZsYW5zY2gtw5ggKEFic2Nobml0dCBEKTogZWluemlnZXMgR3JvZXNzZW5tZXJrbWFsIGJlaSBCbGluZGRlY2tlbCArIEtsYW1tZXIuCiAgICBlbHNlIGlmIChyID09PSAnZmxhbnNjaCcpIHNldEZsYW5zY2goZS50YXJnZXQudmFsdWUpOwogICAgZWxzZSBpZiAociA9PT0gJ21lbmdlJykgc2V0TWVuZ2UocGFyc2VJbnQoZS50YXJnZXQudmFsdWUsIDEwKSk7CiAgfSk7CiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBmdW5jdGlvbiAoZSkgewogICAgaWYgKGUudGFyZ2V0LmdldEF0dHJpYnV0ZSAmJiBlLnRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtcm9sZScpID09PSAnbWVuZ2UnKSB7CiAgICAgIGNvbnN0IHYgPSBwYXJzZUludChlLnRhcmdldC52YWx1ZSwgMTApOyBpZiAoaXNGaW5pdGUodikgJiYgdiA+PSAxKSB7IHN0YXRlLm1lbmdlID0gdjsgcmVuZGVyUHJldmlldygpOyByZW5kZXJOYXYoKTsgfQogICAgfQogIH0pOwogIGZ1bmN0aW9uIHNldE1lbmdlKHYpIHsgc3RhdGUubWVuZ2UgPSBNYXRoLm1heCgxLCBNYXRoLm1pbigxMDAwMDAsIGlzRmluaXRlKHYpID8gdiA6IDEpKTsgcmVuZGVyUGFuZWwoKTsgcmVuZGVyUHJldmlldygpOyByZW5kZXJOYXYoKTsgfQoKICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByZWZpbGwgKEZ1bm5lbC1VZWJlcmdhYmUpICovCiAgLy8gc3JjZG9jLUVpbmJldHR1bmcgKFdQLVBsdWdpbikgaGF0IGtlaW4gbG9jYXRpb24uc2VhcmNoIC0+IHdpbmRvdy5XRUlTU19QUkVMT0FEIGFscyBGYWxsYmFjay4KICBmdW5jdGlvbiBwcmVsb2FkUXVlcnkoKSB7CiAgICBjb25zdCBzID0gKGxvY2F0aW9uLnNlYXJjaCAmJiBsb2NhdGlvbi5zZWFyY2gubGVuZ3RoID4gMSkgPyBsb2NhdGlvbi5zZWFyY2ggOiAod2luZG93LldFSVNTX1BSRUxPQUQgfHwgJycpOwogICAgcmV0dXJuIG5ldyBVUkxTZWFyY2hQYXJhbXMocyk7CiAgfQogIGZ1bmN0aW9uIHByZWZpbGwoKSB7CiAgICBjb25zdCBxID0gcHJlbG9hZFF1ZXJ5KCk7IGlmICghWy4uLnEua2V5cygpXS5sZW5ndGgpIHJldHVybjsKICAgIGNvbnN0IHNldCA9IChrLCBhbGxvdykgPT4geyBjb25zdCB2ID0gcS5nZXQoayk7IGlmICh2ICYmICghYWxsb3cgfHwgYWxsb3cuaW5kZXhPZih2KSA+PSAwKSkgcmV0dXJuIHY7IHJldHVybiBudWxsOyB9OwogICAgY29uc3QgYW53ID0gc2V0KCdhbndlbmR1bmcnLCBELmFud2VuZHVuZ2VuLm1hcChhID0+IGEuaWQpKTsgaWYgKGFudykgc2V0QW53ZW5kdW5nU2lsZW50KGFudyk7CiAgICBjb25zdCBub3JtID0gc2V0KCdub3JtJywgRC5ub3JtZW4ubWFwKG4gPT4gbi5pZCkpOyBpZiAobm9ybSkgc3RhdGUubm9ybSA9IG5vcm07CiAgICBjb25zdCB0eXAgPSBzZXQoJ3R5cCcsIEQudHlwZW4uZmlsdGVyKHQgPT4gdC5ha3RpdiAmJiAhaXNUeXBlQmxvY2tlZCh0KSkubWFwKHQgPT4gdC5pZCkpOwogICAgaWYgKHR5cCAmJiB0eXBPYmoodHlwKSAmJiB0eXBPYmoodHlwKS5ub3JtID09PSBzdGF0ZS5ub3JtKSBzdGF0ZS50eXAgPSB0eXA7CiAgICBjb25zdCByZWloZSA9IHNldCgncmVpaGUnLCBbJ0EnLCAnQicsICdDJ10pOyBpZiAocmVpaGUpIHN0YXRlLnJlaWhlID0gcmVpaGU7CiAgICAvLyBBYnNjaG5pdHQgRCtFOiBCbGluZGRlY2tlbC9LbGFtbWVyIGtlbm5lbiBrZWluZSBSZWloZS9OZW5ud2VpdGUgLSBudXIgRmxhbnNjaC3DmAogICAgLy8gKCsgS2xhbW1lcnR5cC8tV2Vya3N0b2ZmKS4gRGVzaGFsYiBoaWVyIGdldHJlbm50IHZvbSBSZWloZW4tL0dyb2Vzc2VuLVBmYWQuCiAgICBjb25zdCB0UHJlID0gdHlwT2JqKHN0YXRlLnR5cCk7CiAgICBpZiAodFByZSAmJiAhaXNDb25uZWN0KHRQcmUpICYmICFpc3ROdXJGbGFuc2NoKHRQcmUpICYmICFyZWloZUF2YWlsYWJsZSh0UHJlLCBzdGF0ZS5yZWloZSkpIHN0YXRlLnJlaWhlID0gJ0EnOwogICAgaWYgKHN0YXRlLnR5cCAmJiBpc3ROdXJGbGFuc2NoKHRQcmUpKSB7CiAgICAgIGNvbnN0IGZsID0gc2V0KCdmbGFuc2NoJywgKEQuZmxhbnNjaGdyb2Vzc2VuIHx8IFtdKS5tYXAoeCA9PiB4LmlkKSk7CiAgICAgIHN0YXRlLmZsYW5zY2ggPSBmbCB8fCAoKEQuZmxhbnNjaGdyb2Vzc2VuIHx8IFtdKVswXSB8fCB7fSkuaWQgfHwgbnVsbDsKICAgICAgaWYgKGlzdEtsYW1tZXIodFByZSkpIHsKICAgICAgICBjb25zdCBrdCA9IHNldCgna2xhbW1lcnR5cCcsIChELmtsYW1tZXJUeXBlbiB8fCBbXSkubWFwKHggPT4geC5pZCkpOwogICAgICAgIGlmIChrdCkgc3RhdGUua2xhbW1lclR5cCA9IGt0OwogICAgICAgIGNvbnN0IGt0TyA9IGtsYW1tZXJUeXBPYmooc3RhdGUua2xhbW1lclR5cCk7CiAgICAgICAgY29uc3Qga3cgPSBzZXQoJ2t3ZXJrc3RvZmYnLCAoRC5rbGFtbWVyV2Vya3N0b2ZmZSB8fCBbXSkubWFwKHggPT4geC5pZCkpOwogICAgICAgIC8vIFdlcmtzdG9mZiBudXIgdWViZXJuZWhtZW4sIHdlbm4gZGVyIGdld2FlaGx0ZSBLbGFtbWVydHlwIGlobiBsYXV0IEJlcm5kcyBMaXN0ZQogICAgICAgIC8vIHp1bGFlc3N0IC0gZWluIExpbmsgZGFyZiBrZWluZSBLb21iaW5hdGlvbiBlcnpldWdlbiwgZGllIGVzIG5pY2h0IGdpYnQuCiAgICAgICAgaWYgKGt3ICYmIGt0TyAmJiBrdE8ud2Vya3N0b2ZmZS5pbmRleE9mKGt3KSA+PSAwKSBzdGF0ZS5rbGFtbWVyV2Vya3N0b2ZmID0ga3c7CiAgICAgICAgZWxzZSBpZiAoa3RPICYmIGt0Ty53ZXJrc3RvZmZlLmluZGV4T2Yoc3RhdGUua2xhbW1lcldlcmtzdG9mZikgPCAwKSBzdGF0ZS5rbGFtbWVyV2Vya3N0b2ZmID0ga3RPLndlcmtzdG9mZmVbMF07CiAgICAgICAgLy8gTXV0dGVyLUFydCBhdXMgZGVtIExpbmsgKFIyLTQpOiBudXIgdWViZXJuZWhtZW4sIHdlbm4gZXMgZGllIE9wdGlvbiBnaWJ0LgogICAgICAgIGNvbnN0IGttID0gc2V0KCdrbXV0dGVyJywgKEQua2xhbW1lck11dHRlcm4gfHwgW10pLm1hcCh4ID0+IHguaWQpKTsKICAgICAgICBpZiAoa20pIHN0YXRlLmtsYW1tZXJNdXR0ZXIgPSBrbTsKICAgICAgfQogICAgfQogICAgLy8gbWFzc2VGb2xndCAoQ0YvQ0ZJKTogcm93c0ZvcigpIGlzdCBsZWVyIC0+IGVzIGdpYnQga2VpbmUgZ3VlbHRpZ2UgR3JvZXNzZSBhdXMgZGVtIExpbmsKICAgIC8vIHp1IHVlYmVybmVobWVuLiBFeHBsaXppdCBudWxsIChuaWNodCB1bmRlZmluZWQgYXVzIHJzWzBdKSwgZGFtaXQgZGVyIFN0YXRlIHNhdWJlciBibGVpYnQKICAgIC8vIHVuZCBlaW4gbWFuaXB1bGllcnRlciA\\\/Z3JvZXNzZT1ETjI1IG5pY2h0IGRvY2ggYWxzIENGLUdyb2Vzc2UgaW0gU3RhdGUgbGFuZGV0LgogICAgZWxzZSBpZiAoc3RhdGUudHlwICYmIGlzQ29ubmVjdCh0UHJlKSkgewogICAgICBpZiAodFByZS5pZCA9PT0gJ0NGJykgewogICAgICAgIGNvbnN0IGNzID0gc2V0KCdjc3RhbmRhcmQnLCBPYmplY3Qua2V5cyhELm1hc3NlLmNvbm5lY3QuY2YucmVpaGVuKSk7CiAgICAgICAgc3RhdGUuY29ubmVjdE5vcm0gPSBjcyB8fCAnRElOJzsKICAgICAgfQogICAgICBpZiAodFByZS5pZCA9PT0gJ0NGSScpIHsKICAgICAgICBjb25zdCBjYSA9IHNldCgnY2Fuc2NobHVzcycsIFsnQlcnLCAnVEMnXSk7IHN0YXRlLmNvbm5lY3RBbnNjaGx1c3MgPSBjYSB8fCAnQlcnOwogICAgICB9CiAgICAgIGNvbnN0IHJzID0gcm93c0ZvcihzdGF0ZSksIGcgPSBzZXQoJ2dyb2Vzc2UnKTsKICAgICAgc3RhdGUuZ3JvZXNzZSA9IChnICYmIHJzLnNvbWUociA9PiByLmlkID09PSBnKSkgPyBnIDogKChyc1swXSAmJiByc1swXS5pZCkgfHwgbnVsbCk7CiAgICAgIGlmICh0UHJlLmlkID09PSAnQ0YnKSB7CiAgICAgICAgY29uc3QgcncgPSByb3dGb3Ioc3RhdGUpLCBjbCA9IE51bWJlcihxLmdldCgnY2xhZW5nZScpKTsKICAgICAgICBzdGF0ZS5jb25uZWN0TGFlbmdlID0gcncgJiYgcncubGFlbmdlbi5zb21lKHggPT4gTnVtYmVyKHguTCkgPT09IGNsKSA\\\/IGNsIDogKHJ3ICYmIHJ3LmxhZW5nZW5bMF0gPyBydy5sYWVuZ2VuWzBdLkwgOiBudWxsKTsKICAgICAgfQogICAgfQogICAgZWxzZSBpZiAoc3RhdGUudHlwICYmIGlzdE1hc3NlRm9sZ3QodHlwT2JqKHN0YXRlLnR5cCkpKSB7IHN0YXRlLmdyb2Vzc2UgPSBudWxsOyBzdGF0ZS5ncm9lc3NlMiA9IG51bGw7IH0KICAgIGVsc2UgaWYgKHN0YXRlLnR5cCkgeyBjb25zdCBycyA9IHJvd3NGb3Ioc3RhdGUpOyBjb25zdCBnID0gc2V0KCdncm9lc3NlJyk7IHN0YXRlLmdyb2Vzc2UgPSAoZyAmJiBycy5maW5kKHIgPT4gci5pZCA9PT0gZykpID8gZyA6ICgocnNbMF0gJiYgcnNbMF0uaWQpIHx8IG51bGwpOyB9CiAgICAvLyBncm9lc3NlMiBhdXMgZGVtIExpbmsgbnVyIMO8YmVybmVobWVuLCB3ZW5uIGVzIEtMRUlORVIgYWxzIGRpZSAob2JlbiBnZXNldHp0ZSkgTmVubndlaXRlCiAgICAvLyBpc3QgKFIzLTIvUjMtNCkgLSBlaW4gbWFuaXB1bGllcnRlci92ZXJhbHRldGVyIExpbmsgZGFyZiBrZWluIGdlcmFkZXMgUm9ociBlcnpldWdlbi4KICAgIGNvbnN0IGcyID0gc2V0KCdncm9lc3NlMicpOyBpZiAoZzIgJiYgcm93czJGb3Ioc3RhdGUpLnNvbWUociA9PiByLmlkID09PSBnMikpIHN0YXRlLmdyb2Vzc2UyID0gZzI7CiAgICBjb25zdCB3ID0gc2V0KCd3ZXJrc3RvZmYnLCBELndlcmtzdG9mZmUubWFwKHggPT4geC5pZCkpOyBpZiAodykgc3RhdGUud2Vya3N0b2ZmID0gdzsKICAgIGNvbnN0IG8gPSBzZXQoJ29iZXJmbGFlY2hlJywgRC5vYmVyZmxhZWNoZW4ubWFwKHggPT4geC5pZCkpOyBpZiAobykgc3RhdGUub2JlcmZsYWVjaGUgPSBvOwogICAgaWYgKHN0YXRlLnR5cCAmJiAhb2JlcmZsYWVjaGVFcmxhdWJ0KHN0YXRlKSkgc3RhdGUub2JlcmZsYWVjaGUgPSBvYmVyZmxhZWNoZW5PcHRpb25lbihzdGF0ZSlbMF0uaWQ7CiAgICBjb25zdCBkID0gc2V0KCdkaWNodHVuZycsIEQuZGljaHR1bmdlbi5tYXAoeCA9PiB4LmlkKSk7IGlmIChkKSBzdGF0ZS5kaWNodHVuZyA9IGQ7CiAgICBjb25zdCBscCA9IHNldCgnbGlwcGUnLCBbJ0wnLCAnTyddKTsgaWYgKGxwICYmIGF1c2Z1ZWhydW5nQXZhaWwoc3RhdGUpLmluY2x1ZGVzKGxwKSkgc3RhdGUubGlwcGUgPSBscDsKICAgIGNvbnN0IG53UmF3ID0gcS5nZXQoJ25hY2h3ZWlzZScpOwogICAgaWYgKG53UmF3ICE9IG51bGwpIHsKICAgICAgY29uc3QgYWxsb3dlZE53ID0gbmV3IFNldChELm5hY2h3ZWlzZS5tYXAoeCA9PiB4LmlkKSk7CiAgICAgIGNvbnN0IHNlbGVjdGVkTncgPSBTdHJpbmcobndSYXcpLnNwbGl0KCcsJykuZmlsdGVyKGlkID0+IGFsbG93ZWROdy5oYXMoaWQpKTsKICAgICAgaWYgKHNlbGVjdGVkTncubGVuZ3RoKSBzdGF0ZS5uYWNod2Vpc2UgPSBbLi4ubmV3IFNldChbLi4uKEQucHJlaXNlLm5hY2h3ZWlzU3RhbmRhcmQgfHwgW10pLCAuLi5zZWxlY3RlZE53XSldOwogICAgfQogICAgY29uc3QgbHYgPSBzZXQoJ2xhZW5nZScsIFsnS0snLCAnS0wnXSk7IGlmIChsdikgc3RhdGUubGFlbmdlVmFyaWFudGUgPSBsdjsKICAgIGlmIChxLmdldCgnZXh6JykgPT09ICcxJykgc3RhdGUuZXh6ZW50cmlzY2ggPSB0cnVlOwogICAgLy8gQmF1Zm9ybSBUIC8gVEsgYXVzIGRlbSBMaW5rLiBVbmJla2FubnRlIFdlcnRlIGJsZWliZW4gbnVsbCB1bmQgaGFsdGVuIGRlbgogICAgLy8gTGluayBpbiBTY2hyaXR0IDQgenVyIEtvcnJla3R1ciBzdGVoZW4sIHN0YXR0IHN0aWxsIEZvcm0gVCBhbnp1bmVobWVuLgogICAgeyBjb25zdCBmdiA9IHNldCgnZm9ybScsIFsnVCcsICdUSyddKTsgaWYgKGZ2KSBzdGF0ZS5mb3JtVmFyaWFudGUgPSBmdjsgfQogICAgaWYgKHRQcmUgJiYgdFByZS5pZCA9PT0gJ1RDJykgewogICAgICBjb25zdCBrdCA9IHNldCgna2xhbW1lcnR5cCcsIChELmtsYW1tZXJUeXBlbiB8fCBbXSkubWFwKHggPT4geC5pZCkpOyBpZiAoa3QpIHN0YXRlLmtsYW1tZXJUeXAgPSBrdDsKICAgIH0KICAgIGNvbnN0IHZ3ID0gc2V0KCd2aWV3JywgWyd6ZWljaG51bmcnLCAnYW5zaWNodCddKTsgaWYgKHZ3KSBzdGF0ZS52aWV3ID0gdnc7CiAgICBjb25zdCBtID0gcGFyc2VJbnQocS5nZXQoJ21lbmdlJyksIDEwKTsgaWYgKGlzRmluaXRlKG0pICYmIG0gPj0gMSkgc3RhdGUubWVuZ2UgPSBtOwogICAgLy8gRWluIExpbmsgZGFyZiBuaWUgdW52b2xsc3TDpG5kaWdlIEdyw7bDn2VuLSBvZGVyIE9wdGlvbnNkYXRlbiDDvGJlcnNwcmluZ2VuLgogICAgLy8gRGVyIGVyc3RlIG5pY2h0IGVyZsO8bGx0ZSwgZsO8ciBkZW4gVHlwIHJlbGV2YW50ZSBTY2hyaXR0IHdpcmQgZ2XDtmZmbmV0LgogICAgY29uc3QgZmlyc3RJbmNvbXBsZXRlID0gYXBwU3RlcHMoKS5maW5kKG4gPT4gIWNvbXBsZXRlKG4pKTsKICAgIHN0YXRlLnN0ZXAgPSBmaXJzdEluY29tcGxldGUgfHwgODsKICB9CiAgZnVuY3Rpb24gc2V0QW53ZW5kdW5nU2lsZW50KGlkKSB7IGNvbnN0IGEgPSBELmFud2VuZHVuZ2VuLmZpbmQoeCA9PiB4LmlkID09PSBpZCk7IGlmICghYSkgcmV0dXJuOyBzdGF0ZS5hbndlbmR1bmcgPSBpZDsgc3RhdGUud2Vya3N0b2ZmID0gYS5kZWZhdWx0cy53ZXJrc3RvZmY7IHN0YXRlLm9iZXJmbGFlY2hlID0gYS5kZWZhdWx0cy5vYmVyZmxhZWNoZTsgc3RhdGUuZGljaHR1bmcgPSBhLmRlZmF1bHRzLmRpY2h0dW5nOyB9CgogIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBpRnJhbWUtQXV0by1Iw7ZoZSAoV29yZFByZXNzLUVpbmJldHR1bmcpICovCiAgLy8gTWVsZGV0IGRpZSBJbmhhbHRzaMO2aGUgYW5zIMO8YmVyZ2VvcmRuZXRlIEZlbnN0ZXIsIGRhbWl0IGRhcyBpRnJhbWUgb2huZQogIC8vIGlubmVyZW4gU2Nyb2xsYmFsa2VuIG1pdHfDpGNoc3QuIFN0YW5kYWxvbmUgKGtlaW4gUGFyZW50KSA9IE5vLU9wLgogIGZ1bmN0aW9uIHJlcG9ydEhlaWdodCgpIHsKICAgIGlmICh3aW5kb3cucGFyZW50ID09PSB3aW5kb3cpIHJldHVybjsKICAgIHRyeSB7CiAgICAgIGNvbnN0IGggPSBNYXRoLmNlaWwoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCk7CiAgICAgIGlmIChoID4gMTAwKSB3aW5kb3cucGFyZW50LnBvc3RNZXNzYWdlKHsgd2Vpc3NLb25maWdIZWlnaHQ6IGggfSwgJyonKTsKICAgIH0gY2F0Y2ggKGUpIHt9CiAgfQogIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCByZXBvcnRIZWlnaHQpOwogIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgcmVwb3J0SGVpZ2h0KTsKCiAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbml0ICovCiAgaWYgKHdpbmRvdy5wYXJlbnQgIT09IHdpbmRvdykgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3d6LWVtYmVkZGVkJyk7CiAgcmVuZGVyUHJpY2VIaW50KCk7CiAgcHJlZmlsbCgpOwogIHJlbmRlckFsbCgpOwogIC8vIFFBLS9EZWVwLUxpbmstSG9va3M6ID9mcz0xIG9lZmZuZXQgVm9sbGJpbGQsID9kcz0xIGJhdXQgZGFzIERhdGVuYmxhdHQgKG9obmUgRHJ1Y2tkaWFsb2cpCiAgY29uc3QgcTAgPSBwcmVsb2FkUXVlcnkoKTsKICBpZiAocTAuZ2V0KCdmcycpID09PSAnMScpIGZzT3BlbigpOwogIGlmIChxMC5nZXQoJ2RzJykgPT09ICcxJykgYnVpbGREYXRhc2hlZXQodHJ1ZSk7CiAgc2V0VGltZW91dChyZXBvcnRIZWlnaHQsIDM1MCk7Cn0pKCk7Cgo8L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+Cg==\";\n    try {\n        frame.srcdoc = new TextDecoder('utf-8').decode(\n            Uint8Array.from(atob(b64), function (c) { return c.charCodeAt(0); })\n        );\n    } catch (err) {\n        try { frame.srcdoc = decodeURIComponent(escape(atob(b64))); } catch (e2) {}\n    }\n    var last = 680;\n    \/\/ Auf Desktop die Hoehe auf ~Viewport deckeln -> das iFrame scrollt intern,\n    \/\/ die sticky Vorschau bleibt rechts stehen. Auf Mobil volle Inhaltshoehe.\n    function setHeight(h) {\n        var desktop = window.innerWidth > 960;\n        var cap = desktop ? Math.max(600, Math.round((window.innerHeight || 800) * 0.92)) : 1e7;\n        frame.style.height = Math.min(h, cap) + 'px';\n    }\n    window.addEventListener('message', function (e) {\n        if (e.source !== frame.contentWindow) { return; } \/\/ srcdoc-Quelle -> kein origin-Check\n        var h = e.data && e.data.weissKonfigHeight;\n        if (typeof h === 'number' && h > 100) { last = h; setHeight(h); }\n    }, false);\n    window.addEventListener('resize', function () { setHeight(last); });\n})();\n<\/script>\n<!--\/noptimize-->\n    <\/div><\/div><\/div><\/div><style>.weiss-config-trigger{min-height:44px}\n.weiss-product-cta{margin-top:8px!important;margin-bottom:20px!important}\n.weiss-fittings-modal .modal-dialog{width:calc(100% - 32px);max-width:1180px;margin:24px auto}\n.weiss-fittings-modal .modal-content{background:#fff;color:#1c1c1c;border-radius:0}\n.weiss-fittings-modal .modal-header{background:var(--awb-custom_color_1);color:#fff;padding:16px 24px;display:flex;align-items:center;gap:16px}\n.weiss-fittings-modal .modal-title{color:#fff!important;font-size:22px!important;line-height:1.4!important;margin:0!important}\n.weiss-fittings-modal .modal-header .close{color:#fff!important;opacity:1;min-width:44px;min-height:44px;font-size:30px;order:2;margin-left:auto;float:none}\n.weiss-fittings-modal .modal-body{max-height:calc(100dvh - 150px);overflow-y:auto;padding:0;overscroll-behavior:contain}\n.weiss-fittings-modal .weiss-config-status{padding:20px 24px;margin:0}\n.weiss-fittings-modal .weiss-konfigurator-embed{margin:0!important}\n@media(max-width:640px){.weiss-fittings-modal .modal-dialog{width:100%;margin:0;max-width:none}.weiss-fittings-modal .modal-header{padding:10px 14px}.weiss-fittings-modal .modal-title{font-size:18px!important}.weiss-fittings-modal .modal-body{max-height:calc(100dvh - 70px)}.weiss-config-trigger{max-width:100%;white-space:normal!important}.weiss-product-cta{margin-bottom:24px!important}}\n\n.weiss-config-action{display:flow-root;clear:both}.weiss-config-trigger{margin-bottom:12px!important;max-width:100%;white-space:normal!important;line-height:1.4!important}.weiss-inline-cta{margin-top:14px!important}.weiss-fittings-modal .modal-body{background:#fff}.weiss-fittings-modal .modal-title{text-transform:none!important}\n<\/style><script>(function () {\n  'use strict';\n  const modalSelector = '.weiss-fittings-modal';\n  let lastNorm = null;\n  let lastType = null;\n  let lastSeries = null;\n  let boundDocument = null;\n  let pending = 0;\n\n  function action(doc, act, id) {\n    const control = doc.createElement('button');\n    control.type = 'button';\n    control.hidden = true;\n    control.setAttribute('data-act', act);\n    if (act === 'goto') control.setAttribute('data-n', id);\n    else control.setAttribute('data-id', id);\n    doc.body.appendChild(control);\n    control.click();\n    control.remove();\n  }\n\n  function applyPreset(norm, type, series, token, started) {\n    if (token !== pending) return;\n    const modal = document.querySelector(modalSelector);\n    const frame = modal && modal.querySelector('.weiss-konfigurator-embed iframe');\n    const status = modal && modal.querySelector('.weiss-config-status');\n    let doc;\n    try { doc = frame && frame.contentDocument; } catch (error) { doc = null; }\n    if (!doc || !doc.querySelector('#wz-panel .step-head')) {\n      if (Date.now() - started < 20000) {\n        window.setTimeout(function () { applyPreset(norm, type, series, token, started); }, 100);\n      } else if (status) {\n        status.hidden = false;\n        status.textContent = 'The configurator could not be loaded. Please close it and open it again.';\n      }\n      return;\n    }\n    if (boundDocument !== doc) {\n      boundDocument = doc;\n      doc.addEventListener('click', function (event) {\n        const control = event.target.closest('[data-act]');\n        if (!control || control.hidden) return;\n        const act = control.getAttribute('data-act');\n        if (act === 'anwendung' && lastType) action(doc, 'goto', '4');\n        if (act === 'typ') { lastType = control.getAttribute('data-id'); lastSeries = null; }\n        if (act === 'reihe') lastSeries = control.getAttribute('data-id');\n        if (act === 'norm') lastNorm = control.getAttribute('data-id');\n        if (act === 'norm' || act === 'reset' || act === 'addpos') { lastType = null; lastSeries = null; }\n      });\n    }\n    if (norm !== lastNorm) {\n      action(doc, 'goto', '2');\n      action(doc, 'norm', norm);\n      lastNorm = norm; lastType = null; lastSeries = null;\n      action(doc, 'goto', '3');\n    }\n    if (type && type !== lastType) {\n      action(doc, 'typ', type);\n      lastType = type;\n      lastSeries = null;\n      action(doc, 'goto', '4');\n    }\n    if (type && series && series !== lastSeries) {\n      action(doc, 'reihe', series);\n      lastSeries = series;\n      action(doc, 'goto', '4');\n    }\n    if (status) status.hidden = true;\n    frame.setAttribute('data-weiss-preset', type || lastType || 'all');\n    frame.contentWindow.dispatchEvent(new Event('resize'));\n  }\n\n  document.addEventListener('click', function (event) {\n    const trigger = event.target.closest('.weiss-config-trigger');\n    if (!trigger) return;\n    const match = Array.from(trigger.classList).find(function (name) { return name.indexOf('weiss-type-') === 0; });\n    const type = match ? match.slice(11) : null;\n    const norm = trigger.classList.contains('weiss-norm-din11865') ? 'din11865' : 'din32676';\n    const series = trigger.classList.contains('weiss-series-a') ? 'A'\n      : trigger.classList.contains('weiss-series-b') ? 'B'\n      : trigger.classList.contains('weiss-series-c') ? 'C' : null;\n    const modal = document.querySelector(modalSelector);\n    if (!modal) return;\n    const heading = modal.querySelector('.modal-title');\n    const labels = {B90:'Configure bend',R:'Configure reducer',TS:'Configure tee',TC:'Configure Tri-Clamp',TCS:'Configure ferrule',KL:'Configure clamp',D:'Configure gasket',BD:'Configure blank cap'};\n    if (heading) heading.textContent = type && labels[type] ? labels[type] : 'Project configurator';\n    const status = modal.querySelector('.weiss-config-status');\n    if (status) { status.hidden = false; status.textContent = 'Configurator is loading ...'; }\n    applyPreset(norm, type, series, ++pending, Date.now());\n  }, true);\n})();\n<\/script><!--noptimize-->\n<style id=\"weiss-modal-ci\">\n\/* Weiss Projektkonfigurator: gemeinsamer Modal-Stil, Stand 14.09.2026. *\/\n.weiss-fittings-modal {\n  --weiss-ci-red: var(--awb-color4, #cc0000);\n  --weiss-ci-dark: var(--awb-custom_color_1, #4c0000);\n  --weiss-ci-ink: var(--awb-color8, #1c1c1c);\n  --weiss-modal-gap: 24px;\n  --weiss-admin-height: 0px;\n  position: fixed !important;\n  inset: var(--weiss-admin-height) 0 0 !important;\n  height: auto !important;\n  padding: var(--weiss-modal-gap) !important;\n  overflow-x: hidden;\n  overflow-y: auto;\n  box-sizing: border-box;\n  font-family: var(--awb-typography4-font-family, 'Plus Jakarta Sans', Arial, sans-serif);\n}\n.weiss-fittings-modal .modal-dialog {\n  display: flex;\n  align-items: center;\n  width: 100% !important;\n  max-width: 1180px !important;\n  min-height: 100%;\n  margin: 0 auto !important;\n  transform: none !important;\n  transition: none !important;\n}\n.weiss-fittings-modal .modal-content {\n  width: 100%;\n  min-width: 0;\n  max-height: calc(100dvh - var(--weiss-admin-height) - 2 * var(--weiss-modal-gap));\n  display: flex;\n  flex-direction: column;\n  background: #fff;\n  color: var(--weiss-ci-ink);\n  border: 0;\n  border-top: 4px solid var(--weiss-ci-red);\n  border-radius: 0;\n  box-shadow: 0 24px 72px rgba(28,28,28,.22);\n  overflow: hidden;\n}\n.weiss-fittings-modal .modal-header {\n  display: grid;\n  grid-template-columns: 44px minmax(0, 1fr) 44px;\n  align-items: center;\n  gap: 12px;\n  flex: 0 0 auto;\n  padding: 14px 24px;\n  background: #fff;\n  border-bottom: 1px solid #e5e5e5;\n  color: var(--weiss-ci-ink);\n}\n.weiss-fittings-modal .modal-header::before,\n.weiss-fittings-modal .modal-header::after { display: none; }\n.weiss-fittings-modal .modal-title {\n  grid-column: 2;\n  grid-row: 1;\n  margin: 0 !important;\n  color: var(--weiss-ci-ink) !important;\n  font-family: inherit !important;\n  font-size: 22px !important;\n  font-weight: 600 !important;\n  line-height: 1.3 !important;\n  text-align: center;\n  text-transform: none !important;\n  overflow-wrap: break-word;\n}\n.weiss-fittings-modal .modal-header .close {\n  grid-column: 3;\n  grid-row: 1;\n  order: initial;\n  display: grid;\n  place-items: center;\n  float: none;\n  margin: 0 !important;\n  padding: 0;\n  width: 44px;\n  height: 44px;\n  min-width: 44px;\n  min-height: 44px;\n  border: 1px solid #e5e5e5;\n  border-radius: 0;\n  background: #fff;\n  color: var(--weiss-ci-ink) !important;\n  opacity: 1;\n  font: 28px\/1 Arial, sans-serif;\n  text-shadow: none;\n  cursor: pointer;\n}\n.weiss-fittings-modal .modal-header .close:hover { background: #f1f1f1; color: var(--weiss-ci-red) !important; }\n.weiss-fittings-modal .modal-header .close:focus-visible { outline: 2px solid var(--weiss-ci-red); outline-offset: 3px; }\n.weiss-fittings-modal .modal-body {\n  flex: 1 1 auto;\n  min-height: 0;\n  max-height: none !important;\n  padding: 0 !important;\n  background: #fff;\n  overflow: auto;\n  overscroll-behavior: contain;\n  scrollbar-gutter: stable;\n}\n.weiss-fittings-modal .weiss-konfigurator-embed { margin: 0 !important; padding: 0 !important; }\n.weiss-fittings-modal .weiss-konfigurator-embed iframe { display: block; width: 100%; min-height: 0 !important; border: 0; }\n.weiss-fittings-modal .weiss-config-status { margin: 0; padding: 24px 28px; color: #555; }\n.weiss-fittings-modal .weiss-config-status[hidden] { display: none !important; }\n@media(max-width:767px) {\n  .weiss-fittings-modal { --weiss-modal-gap: 12px; }\n  .weiss-fittings-modal .modal-header { padding: 10px 12px; gap: 8px; }\n  .weiss-fittings-modal .modal-title { font-size: 18px !important; }\n}\n@media(max-width:374px) {\n  .weiss-fittings-modal { --weiss-modal-gap: 8px; }\n  .weiss-fittings-modal .modal-header { padding: 8px; gap: 4px; }\n  .weiss-fittings-modal .modal-title { font-size: 16px !important; }\n}\n@media(prefers-reduced-motion:reduce) { .weiss-fittings-modal, .weiss-fittings-modal * { scroll-behavior: auto !important; transition: none !important; } }\n\n<\/style>\n<script>\n(function () {\n  'use strict';\n  if (window.weissModalCiInstalled) return;\n  window.weissModalCiInstalled = true;\n  const widgetCss = \"@font-face {\\n  font-family: 'Plus Jakarta Sans';\\n  font-style: normal;\\n  font-weight: 200;\\n  font-display: swap;\\n  src: url(https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/fusion-gfonts\/LDIoaomQNQcsA88c7O9yZ4KMCoOg4Ko20yw.woff2) format('woff2');\\n  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\\n}\\n@font-face {\\n  font-family: 'Plus Jakarta Sans';\\n  font-style: normal;\\n  font-weight: 300;\\n  font-display: swap;\\n  src: url(https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/fusion-gfonts\/LDIoaomQNQcsA88c7O9yZ4KMCoOg4Ko20yw.woff2) format('woff2');\\n  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\\n}\\n@font-face {\\n  font-family: 'Plus Jakarta Sans';\\n  font-style: normal;\\n  font-weight: 400;\\n  font-display: swap;\\n  src: url(https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/fusion-gfonts\/LDIoaomQNQcsA88c7O9yZ4KMCoOg4Ko20yw.woff2) format('woff2');\\n  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\\n}\\n@font-face {\\n  font-family: 'Plus Jakarta Sans';\\n  font-style: normal;\\n  font-weight: 600;\\n  font-display: swap;\\n  src: url(https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/fusion-gfonts\/LDIoaomQNQcsA88c7O9yZ4KMCoOg4Ko20yw.woff2) format('woff2');\\n  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\\n}\\n@font-face {\\n  font-family: 'Plus Jakarta Sans';\\n  font-style: normal;\\n  font-weight: 700;\\n  font-display: swap;\\n  src: url(https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/fusion-gfonts\/LDIoaomQNQcsA88c7O9yZ4KMCoOg4Ko20yw.woff2) format('woff2');\\n  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\\n}\\n\/* Nur in eingebettete Projektkonfigurator-Popups einsetzen. *\/\\n:root {\\n  --red: var(--weiss-brand-red, #cc0000);\\n  --red-dark: var(--weiss-brand-dark, #4c0000);\\n  --red-tint: #fff4f4;\\n  --ink: #1c1c1c;\\n  --radius: 2px;\\n  --radius-sm: 2px;\\n  --ff: var(--weiss-brand-font, 'Plus Jakarta Sans', Arial, sans-serif);\\n}\\nbody, button, input, select, textarea { font-family: var(--ff); }\\n.app { max-width: none; padding: 18px 28px 24px; }\\n.topbar { padding: 0 0 16px; }\\n.topbar .hint { color: #555; }\\n.brand .mark { border-radius: 0; background: var(--red); }\\n.brand .n { font-size: 16px; letter-spacing: .04em; }\\n.brand .s { color: #555; }\\n.progress { gap: 4px; padding-bottom: 20px; margin-bottom: 2px; }\\n.pstep { border-radius: 0; padding: 9px 10px; font-size: 12px; border-color: #e5e5e5; }\\n.pstep.active { color: var(--red-dark); background: var(--red-tint); border-color: var(--red); }\\n.pstep[disabled] { opacity: 1; color: #727272; background: #fafafa; }\\n.pstep[disabled] .num { background: #eee; color: #727272; }\\n.layout { gap: 28px; }\\n.step-head h2 { font-size: 24px; line-height: 1.3; font-weight: 600; }\\n.step-head p { font-size: 13px; line-height: 1.6; }\\n.kicker { color: var(--red); }\\n.resetbtn, .pv-toggle, .pv-typecode .copy, .btn, .chip, .seg, .stepper { border-radius: 0; }\\n.resetbtn { padding: 0 12px; color: #555; }\\n.tiles { gap: 12px; }\\n.tile { border-width: 1px; border-radius: 2px; min-height: 112px; padding: 16px; box-shadow: none; }\\n.tile .t { font-size: 15px; font-weight: 600; }\\n.tile .d { font-size: 12px; }\\n.tile:hover, .opt:hover { border-color: var(--red); box-shadow: none; }\\n.tile.sel, .opt.sel { background: var(--red-tint); box-shadow: inset 3px 0 0 var(--red); }\\n.pv-card { border-radius: 2px; box-shadow: none; }\\n.pv-typecode { flex-wrap: wrap; }\\n.pv-typecode .code { min-width: 0; flex: 1 1 120px; }\\n.pv-typecode .copy { flex-shrink: 0; }\\n.pv-typecode .lbl { color: #555; }\\n.preview { position: static; }\\n.nav { justify-content: flex-end; gap: 12px; margin-top: 24px; padding-top: 20px; border-top: 1px solid #e5e5e5; }\\n.nav .btn.primary { flex: 0 1 auto; width: auto; min-width: 176px; justify-content: center; background: var(--red); border-color: var(--red); box-shadow: none; }\\n.nav .btn.primary:hover:not([disabled]) { background: var(--red-dark); border-color: var(--red-dark); }\\n.nav .btn.primary[disabled] { background: #e5e5e5; color: #626262; border-color: #e5e5e5; }\\nbutton:focus-visible, input:focus-visible, select:focus-visible, textarea:focus-visible { outline: 2px solid var(--red); outline-offset: 3px; }\\n@media(max-width:767px) {\\n  .app { padding: 14px 16px 20px; }\\n  .topbar { flex-wrap: wrap; gap: 10px; }\\n  .topbar .hint { font-size: 11px; }\\n  .layout { grid-template-columns: minmax(0,1fr); gap: 20px; }\\n  .step-head h2 { font-size: 21px; }\\n  .nav .btn.primary { min-width: 0; flex: 1; }\\n  .nav { margin-top: 18px; }\\n  .pv-typecode { gap: 8px; }\\n}\\n@media(max-width:359px) {\\n  .app { padding: 12px; }\\n  .tiles { grid-template-columns: minmax(0,1fr); }\\n  .tile { min-height: 96px; }\\n  .step-head-top { gap: 8px; }\\n  .resetbtn { padding: 0 8px; font-size: 11px; }\\n}\\n@media(prefers-reduced-motion:reduce) { *, *::before, *::after { transition: none !important; scroll-behavior: auto !important; } }\\n@media(max-width:767px) {\\n  .app { display: flex; flex-direction: column; }\\n  .app > .topbar { order: 0; }\\n  .app > .progress { order: 1; }\\n  .layout { display: contents; }\\n  .panel { order: 2; }\\n  .app > .nav { order: 3; }\\n  .preview { order: 4; width: 100%; margin-top: 20px; }\\n}\\n@media(min-width:320px) and (max-width:767px) {\\n  .tiles { grid-template-columns: repeat(2,minmax(0,1fr)); }\\n  .tile { padding: 14px 12px; }\\n  .tile .t { font-size: 13px; }\\n}\\n\";\n  const bound = new WeakMap();\n  function install(frame) {\n    let doc;\n    try { doc = frame.contentDocument; } catch (_) { return; }\n    if (!doc || !doc.querySelector('.app')) return;\n    const modal = frame.closest('.weiss-fittings-modal');\n    if (!modal) return;\n    const old = bound.get(frame);\n    if (old && old.doc === doc) { old.size(); return; }\n    if (old) { old.resize.disconnect(); old.mutation.disconnect(); }\n    const style = doc.createElement('style');\n    style.id = 'weiss-modal-ci-widget';\n    style.textContent = widgetCss;\n    doc.head.appendChild(style);\n    const ci = getComputedStyle(modal);\n    doc.documentElement.style.setProperty('--weiss-brand-red', ci.getPropertyValue('--awb-color4').trim() || '#cc0000');\n    doc.documentElement.style.setProperty('--weiss-brand-dark', ci.getPropertyValue('--awb-custom_color_1').trim() || '#4c0000');\n    doc.documentElement.style.setProperty('--weiss-brand-font', ci.fontFamily);\n    const app = doc.querySelector('.app');\n    let pending = 0;\n    let gesetzt = 0;\n    \/\/ Die Hoehe wird ueber eine eigene Stilregel gesetzt, nicht ueber das style-Attribut.\n    \/\/ Grund: Das Konfigurator-Plugin setzt die Hoehe ebenfalls und deckelt sie auf die\n    \/\/ Fensterhoehe. Beide Setzer haben sich gegenseitig ueberschrieben, jede Aenderung\n    \/\/ loeste im iFrame ein resize aus, das Widget meldete erneut, und das Fenster sprang\n    \/\/ rund 230 mal pro Sekunde zwischen zwei Hoehen. Eine Regel mit !important gewinnt\n    \/\/ gegen das style-Attribut, damit ist die Hoehe stabil und die Rueckkopplung beendet.\n    \/\/ Befund vom 17.09.2026, gemeldet von Bernd Linker als Flackern im Anfrageschritt.\n    const hoeheSetzen = function (id, hoehe) {\n      if (!id) return;\n      let regelBlock = document.getElementById('weiss-modal-hoehe');\n      if (!regelBlock) {\n        regelBlock = document.createElement('style');\n        regelBlock.id = 'weiss-modal-hoehe';\n        document.head.appendChild(regelBlock);\n      }\n      const regeln = {};\n      regelBlock.textContent.split('}').forEach(function (teil) {\n        const m = teil.match(\/#([\\w-]+)\\s*\\{\\s*height:\\s*(\\d+)px\/);\n        if (m) regeln[m[1]] = m[2];\n      });\n      regeln[id] = String(hoehe);\n      regelBlock.textContent = Object.keys(regeln)\n        .map(function (k) { return '#' + k + ' { height: ' + regeln[k] + 'px !important; }'; })\n        .join('\\n');\n    };\n    const size = function () {\n      if (pending) return;\n      pending = requestAnimationFrame(function () {\n        pending = 0;\n        if (!frame.isConnected || !frame.getBoundingClientRect().width) return;\n        const height = Math.ceil(app.getBoundingClientRect().height);\n        if (height > 100 && Math.abs(gesetzt - height) > 1) {\n          gesetzt = height;\n          hoeheSetzen(frame.id, height);\n        }\n      });\n    };\n    const resize = new ResizeObserver(size);\n    resize.observe(app);\n    const mutation = new MutationObserver(size);\n    mutation.observe(app, {childList:true, subtree:true, characterData:true});\n    bound.set(frame, {doc:doc, size:size, resize:resize, mutation:mutation});\n    if (doc.fonts) doc.fonts.ready.then(size);\n    size();\n  }\n  function scan() {\n    const admin = document.getElementById('wpadminbar');\n    const adminHeight = admin && getComputedStyle(admin).position === 'fixed' ? Math.max(0, admin.getBoundingClientRect().bottom) : 0;\n    document.querySelectorAll('.weiss-fittings-modal').forEach(function (modal) {\n      const value = Math.round(adminHeight) + 'px';\n      if (modal.style.getPropertyValue('--weiss-admin-height') !== value) modal.style.setProperty('--weiss-admin-height', value);\n      modal.querySelectorAll('.weiss-konfigurator-embed iframe').forEach(function (frame) {\n        if (!frame.hasAttribute('data-weiss-ci-bound')) {\n          frame.setAttribute('data-weiss-ci-bound', 'true');\n          frame.addEventListener('load', function () { install(frame); });\n        }\n        install(frame);\n      });\n    });\n  }\n  let scheduled = false;\n  function schedule() {\n    if (scheduled) return;\n    scheduled = true;\n    requestAnimationFrame(function () { scheduled = false; scan(); });\n  }\n  const observer = new MutationObserver(schedule);\n  observer.observe(document.documentElement, {childList:true, subtree:true, attributes:true, attributeFilter:['class','style']});\n  window.addEventListener('resize', schedule);\n  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', schedule, {once:true});\n  else schedule();\n})();\n<\/script>\n<!--\/noptimize-->\n<style id=\"weiss-landing-hero-20260914\">\n.weiss-landing-hero .weiss-hero-title h1{font-size:clamp(28px,3vw,40px)!important;line-height:1.18!important;letter-spacing:-.035em;overflow-wrap:break-word}\n.weiss-landing-hero .weiss-hero-intro{max-width:38em}\n.weiss-landing-hero .weiss-hero-intro p{margin-bottom:14px}\n.weiss-landing-hero .weiss-hero-cta{min-height:48px;max-width:100%;white-space:normal;box-sizing:border-box}\n.weiss-landing-hero .weiss-hero-cta:focus-visible{outline:3px solid #cc0000;outline-offset:4px}\n.weiss-masstabellen .weiss-tabellen-scroll{max-width:100%;overflow-x:auto;overscroll-behavior-x:contain;margin:12px 0}\n.weiss-masstabellen .weiss-tabellen-scroll:focus-visible{outline:3px solid #cc0000;outline-offset:2px}\n.weiss-masstabellen table.weiss-masstabelle{border-collapse:collapse;width:100%;font-size:14px}\n.weiss-masstabellen table.weiss-masstabelle th,.weiss-masstabellen table.weiss-masstabelle td{padding:10px 12px;border-bottom:1px solid #ddd;text-align:left;white-space:nowrap}\n.weiss-masstabellen table.weiss-masstabelle thead{background:#f3f1ef}\n.weiss-masstabellen table.weiss-masstabelle caption{text-align:left;font-weight:700;white-space:normal;padding:12px 0}\n.weiss-masstabellen .weiss-masshinweis{font-size:14px;line-height:1.6}\n@media(max-width:767px){.weiss-landing-hero .weiss-hero-cta{width:100%;padding-left:16px!important;padding-right:16px!important}.weiss-landing-hero .fusion-imageframe{margin-top:24px}}\n\n@media (max-width: 640px){\n  \/* 22.09.2026: lange Fachwoerter sonst ueber die Spaltenkante hinaus, gemessen 307 gegen 239 px *\/\n  .fusion-title-heading{overflow-wrap:break-word;word-break:break-word;hyphens:auto}\n}\n<\/style><\/div><\/div><\/div><\/div><div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-10 fusion-flex-container has-pattern-background has-mask-background weiss-zugang-abschnitt nonhundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-padding-top:100px;--awb-padding-bottom:100px;--awb-padding-top-small:28px;--awb-padding-bottom-small:28px;--awb-flex-wrap:wrap;\" ><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"max-width:1248px;margin-left: calc(-4% \/ 2 );margin-right: calc(-4% \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-14 fusion_builder_column_1_1 1_1 fusion-flex-column\" style=\"--awb-bg-size:cover;--awb-width-large:100%;--awb-spacing-right-large:1.92%;--awb-margin-bottom-large:0px;--awb-spacing-left-large:1.92%;--awb-width-medium:100%;--awb-spacing-right-medium:1.92%;--awb-spacing-left-medium:1.92%;--awb-width-small:100%;--awb-spacing-right-small:1.92%;--awb-spacing-left-small:1.92%;\"><div class=\"fusion-column-wrapper fusion-flex-justify-content-flex-start fusion-content-layout-column\"><section class=\"weiss-zugang\" id=\"weiss-zugang\">\n  <div class=\"weiss-zugang-haupt\">\n  <h2 class=\"weiss-zugang-titel\">Request access to prices<\/h2>\n  <p class=\"weiss-zugang-text\">Prices in the configurator are kept in a protected area. Tell us briefly who you are and you will receive your password by e-mail.<\/p>\n    <form method=\"post\" class=\"weiss-zugang-form\" novalidate>\n    <input type=\"hidden\" id=\"weiss_zugang_nonce\" name=\"weiss_zugang_nonce\" value=\"202e93742b\" \/><input type=\"hidden\" name=\"_wp_http_referer\" value=\"\/en\/wp-json\/wp\/v2\/pages\/4343\" \/>    <input type=\"hidden\" name=\"weiss_zugang_absenden\" value=\"1\">\n    <input type=\"hidden\" name=\"weiss_zugang_lang\" value=\"en\">\n    <input type=\"hidden\" name=\"weiss_zugang_empfaenger\" value=\"steriltechnik@weiss-apparatebau.de\">\n    <input type=\"hidden\" name=\"weiss_zugang_bestaetigung\" value=\"ja\">\n    <input type=\"hidden\" name=\"weiss_zeit\" value=\"1790208849\">\n    <input type=\"hidden\" name=\"weiss_zugang_sig\" value=\"9b693f864642cadfa671405dee6e4f788ca60a9abbd4299f6d84f4abdb9ac589\">\n    <fieldset class=\"weiss-zugang-art\">\n      <legend>You are enquiring as<\/legend>\n      <label><input type=\"radio\" name=\"weiss_art\" value=\"endkunde\"  required> End customer<\/label>\n      <label><input type=\"radio\" name=\"weiss_art\" value=\"oem\" > OEM<\/label>\n    <\/fieldset>\n    <label class=\"weiss-zugang-feld\"><span>Company and location<\/span>\n      <input type=\"text\" name=\"weiss_firma\" value=\"\" required autocomplete=\"organization\"><\/label>\n    <label class=\"weiss-zugang-feld\"><span>Contact, first and last name<\/span>\n      <input type=\"text\" name=\"weiss_name\" value=\"\" required autocomplete=\"name\"><\/label>\n    <label class=\"weiss-zugang-feld\"><span>E-mail address<\/span>\n      <input type=\"email\" name=\"weiss_mail\" value=\"\" required autocomplete=\"email\"><\/label>\n    <label class=\"weiss-zugang-feld\"><span>Phone number<\/span>\n      <input type=\"tel\" name=\"weiss_telefon\" value=\"\" required autocomplete=\"tel\"><\/label>\n    <label class=\"weiss-zugang-falle\" aria-hidden=\"true\"><span>Firma<\/span>\n      <input type=\"text\" name=\"weiss_firma_2\" value=\"\" tabindex=\"-1\" autocomplete=\"off\"><\/label>\n    <label class=\"weiss-zugang-pflicht\"><input type=\"checkbox\" name=\"weiss_datenschutz\" value=\"1\" required>\n      <span>I agree to my details being processed in order to handle this enquiry.        <a href=\"https:\/\/weiss-apparatebau.de\/en\/datenschutzerklaerung\/\" target=\"_blank\" rel=\"noopener\">Privacy policy<\/a><\/span><\/label>\n    <button type=\"submit\" class=\"weiss-zugang-knopf\">Request access<\/button>\n  <\/form>\n  <\/div>\n  <aside class=\"weiss-zugang-leiste\" aria-labelledby=\"weiss-zugang-leiste-titel\">\n    <p class=\"weiss-zugang-marke\">How it works<\/p>\n    <h3 class=\"weiss-zugang-leiste-titel\" id=\"weiss-zugang-leiste-titel\">Three steps to your prices<\/h3>\n    <ol class=\"weiss-zugang-schritte\">\n            <li><span class=\"weiss-zugang-nr\" aria-hidden=\"true\">1<\/span>\n        <span class=\"weiss-zugang-schritt\"><strong>Send your request<\/strong> As an end customer or OEM. The confirmation arrives by <span class=\"weiss-zugang-nb\">e-mail<\/span> straight away.<\/span><\/li>\n            <li><span class=\"weiss-zugang-nr\" aria-hidden=\"true\">2<\/span>\n        <span class=\"weiss-zugang-schritt\"><strong>Receive your password<\/strong> The link and password for your price area come by <span class=\"weiss-zugang-nb\">e-mail<\/span>.<\/span><\/li>\n            <li><span class=\"weiss-zugang-nr\" aria-hidden=\"true\">3<\/span>\n        <span class=\"weiss-zugang-schritt\"><strong>Configure with prices<\/strong> See the prices for your price group and send your inquiry with the configuration no.<\/span><\/li>\n          <\/ol>\n    <p class=\"weiss-zugang-zwischentitel\">Good to know<\/p>\n    <ul class=\"weiss-zugang-gut\">\n            <li>Separate price areas for end customers and OEMs.<\/li>\n            <li>Inspection certificate 3.1 free of charge, further certificates at extra cost.<\/li>\n            <li>Without a password: components, dimensions and materials selectable, prices on request.<\/li>\n          <\/ul>\n    <div class=\"weiss-zugang-kontakt\">\n      <p class=\"weiss-zugang-zwischentitel\">Questions first?<\/p>\n      <p class=\"weiss-zugang-kontakt-name\">Weiss Steriltechnik<\/p>\n      <a href=\"tel:+4951284044981\">Phone 0 51 28 - 40 44 981<\/a>\n      <a href=\"mailto:steriltechnik@weiss-apparatebau.de\">steriltechnik@weiss-apparatebau.de<\/a>\n    <\/div>\n  <\/aside>\n<\/section>\n<style>\n.weiss-zugang{max-width:1248px;margin:0 auto;scroll-margin-top:120px}\n.weiss-zugang-haupt{min-width:0}\n@media(min-width:1200px){.weiss-zugang{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,440px);gap:56px;align-items:start}}\n.weiss-zugang-leiste{background:#800000;color:#fff;border-top:6px solid #cc0000;padding:32px 28px 34px;margin-top:48px;min-width:0}\n@media(min-width:1200px){.weiss-zugang-leiste{margin-top:0;padding:34px 36px 30px}}\n.weiss-zugang .weiss-zugang-leiste p{color:#fff}\n.weiss-zugang-leiste .weiss-zugang-marke{margin:0 0 10px;font-size:14px;line-height:1.5;opacity:.9}\n.weiss-zugang-leiste .weiss-zugang-leiste-titel{margin:0 0 22px;color:#fff;font-size:26px;line-height:1.25;font-weight:800}\n.weiss-zugang-schritte{list-style:none;margin:0 0 24px;padding:0;display:grid;gap:14px}\n.weiss-zugang-schritte li{display:grid;grid-template-columns:36px minmax(0,1fr);gap:14px;align-items:start;margin:0;font-size:15px;line-height:1.5}\n.weiss-zugang-nr{display:flex;align-items:center;justify-content:center;width:36px;height:36px;border:1px solid #fff;font-weight:700;font-size:15px}\n.weiss-zugang-schritt strong{display:block;font-size:16px;margin-bottom:2px}\n.weiss-zugang-leiste .weiss-zugang-zwischentitel{margin:0 0 10px;padding-top:20px;border-top:1px solid rgba(255,255,255,.28);font-weight:700;font-size:16px}\n.weiss-zugang-gut{list-style:none;margin:0 0 22px;padding:0;display:grid;gap:8px}\n.weiss-zugang-gut li{position:relative;margin:0;padding-left:28px;font-size:15px;line-height:1.5}\n.weiss-zugang-gut li:before{content:\"\";position:absolute;left:3px;top:6px;width:6px;height:11px;border:solid #fff;border-width:0 2px 2px 0;transform:rotate(45deg)}\n.weiss-zugang-kontakt{display:grid;gap:2px}\n.weiss-zugang-nb{white-space:nowrap}\n.weiss-zugang-leiste .weiss-zugang-kontakt-name{margin:0;font-size:15px}\n.weiss-zugang .weiss-zugang-kontakt a{display:flex;align-items:center;min-height:44px;color:#fff;font-weight:700;font-size:15px;text-decoration:underline;text-underline-offset:3px;overflow-wrap:anywhere}\n.weiss-zugang .weiss-zugang-kontakt a:hover{color:#fff;text-decoration-thickness:2px}\n.weiss-zugang-titel{margin:0 0 8px}\n.weiss-zugang-text{margin:0 0 20px}\n.weiss-zugang-form{display:grid;gap:14px}\n@media(min-width:700px){.weiss-zugang-form{grid-template-columns:1fr 1fr}\n.weiss-zugang-art,.weiss-zugang-pflicht,.weiss-zugang-knopf{grid-column:1\/-1}}\n.weiss-zugang-feld{display:grid;grid-template-rows:1fr auto;gap:5px;font-size:14px}\n.weiss-zugang-feld span{align-self:end}\n.weiss-zugang-feld input{padding:11px 12px;border:1px solid #d7dbe0;border-radius:3px;font:inherit;min-height:44px}\n.weiss-zugang-art{border:0;padding:0;margin:0;font-size:14px}\n.weiss-zugang-art legend{padding:0;margin-bottom:4px}\n.weiss-zugang-art label{display:inline-flex;align-items:center;gap:8px;margin-right:18px;min-height:44px}\n.weiss-zugang-pflicht{display:flex;gap:10px;align-items:flex-start;font-size:13.5px;line-height:1.5;min-height:44px;padding:4px 0}\n.weiss-zugang-pflicht input{margin-top:3px;width:18px;height:18px}\n.weiss-zugang-knopf{min-height:44px;padding:12px 24px;border:0;border-radius:3px;background:#d60a0a;color:#fff;\n  font:inherit;font-weight:700;letter-spacing:.02em;cursor:pointer;justify-self:start}\n.weiss-zugang-knopf:hover{background:#4c0000}\n.weiss-zugang a{color:#4c0000;text-decoration:underline}\n.weiss-zugang a:hover{color:#d60a0a}\n.weiss-zugang-falle{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}\n.weiss-zugang-ok{background:#eefaf1;border-left:4px solid #1f7a3d;padding:12px 14px;margin:0 0 18px}\n.weiss-zugang-fehler{background:#fdecec;border-left:4px solid #d60a0a;padding:12px 14px;margin:0 0 18px}\n<\/style>\n<script>\n(function () {\n  document.addEventListener('click', function (e) {\n    var a = e.target && e.target.closest ? e.target.closest('a[href=\"#weiss-zugang\"]') : null;\n    if (!a) { return; }\n    var ziel = document.getElementById('weiss-zugang');\n    if (!ziel) { return; }\n    \/\/ Dreimal, weil das Fenster beim Schliessen die alte Position zurueckholt und\n    \/\/ der Zeitpunkt davon nicht zugesichert ist.\n    var hin = function () { ziel.scrollIntoView({block: 'start'}); };\n    setTimeout(hin, 300);\n    setTimeout(hin, 800);\n    setTimeout(hin, 1400);\n  });\n})();\n<\/script>\n    <\/div><\/div><\/div><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":2827,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"100-width.php","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-4343","page","type-page","status-publish","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Stainless steel Tri-Clamp connections to DIN 32676 | Weiss<\/title>\n<meta name=\"description\" content=\"Tri-Clamp components to DIN 32676 for tank, plant and vessel construction. Configure your design and send a technical inquiry.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/weiss-apparatebau.de\/en\/service\/tri-clamp-connections-stainless-steel\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Stainless steel Tri-Clamp connections to DIN 32676 | Weiss\" \/>\n<meta property=\"og:description\" content=\"Tri-Clamp components to DIN 32676 for tank, plant and vessel construction. Configure your design and send a technical inquiry.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/weiss-apparatebau.de\/en\/service\/tri-clamp-connections-stainless-steel\/\" \/>\n<meta property=\"og:site_name\" content=\"Weiss Apparatebau GmbH\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-23T12:40:51+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/05\/1weiss\u00a9patrik.labitzke\u00a9candidateflow.de_B-9.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"798\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"96 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/weiss-apparatebau.de\\\/en\\\/service\\\/tri-clamp-connections-stainless-steel\\\/\",\"url\":\"https:\\\/\\\/weiss-apparatebau.de\\\/en\\\/service\\\/tri-clamp-connections-stainless-steel\\\/\",\"name\":\"Stainless steel Tri-Clamp connections to DIN 32676 | Weiss\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/weiss-apparatebau.de\\\/#website\"},\"datePublished\":\"2026-09-14T14:45:46+00:00\",\"dateModified\":\"2026-09-23T12:40:51+00:00\",\"description\":\"Tri-Clamp components to DIN 32676 for tank, plant and vessel construction. Configure your design and send a technical inquiry.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/weiss-apparatebau.de\\\/en\\\/service\\\/tri-clamp-connections-stainless-steel\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/weiss-apparatebau.de\\\/en\\\/service\\\/tri-clamp-connections-stainless-steel\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/weiss-apparatebau.de\\\/en\\\/service\\\/tri-clamp-connections-stainless-steel\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Startseite\",\"item\":\"https:\\\/\\\/weiss-apparatebau.de\\\/en\\\/precision-engineering-in-stainless-steel-made-in-germany\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Services\",\"item\":\"https:\\\/\\\/weiss-apparatebau.de\\\/en\\\/service\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Stainless steel Tri-Clamp connections\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/weiss-apparatebau.de\\\/#website\",\"url\":\"https:\\\/\\\/weiss-apparatebau.de\\\/\",\"name\":\"Ihr Partner f\u00fcr pr\u00e4zise Schwei\u00dfmontagen & Apparatebau \u2013 Made in Germany.\",\"description\":\"Spezialist f\u00fcr Edelstahl Beh\u00e4lterbau, Rohrleitungsbau &amp; Steriltechnik in der Industrie\",\"publisher\":{\"@id\":\"https:\\\/\\\/weiss-apparatebau.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/weiss-apparatebau.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/weiss-apparatebau.de\\\/#organization\",\"name\":\"Ihr Partner f\u00fcr pr\u00e4zise Schwei\u00dfmontagen & Apparatebau \u2013 Made in Germany.\",\"url\":\"https:\\\/\\\/weiss-apparatebau.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/weiss-apparatebau.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/weiss-apparatebau.de\\\/wp-content\\\/uploads\\\/2025\\\/03\\\/WEISS-Logo.png\",\"contentUrl\":\"https:\\\/\\\/weiss-apparatebau.de\\\/wp-content\\\/uploads\\\/2025\\\/03\\\/WEISS-Logo.png\",\"width\":400,\"height\":176,\"caption\":\"Ihr Partner f\u00fcr pr\u00e4zise Schwei\u00dfmontagen & Apparatebau \u2013 Made in Germany.\"},\"image\":{\"@id\":\"https:\\\/\\\/weiss-apparatebau.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Stainless steel Tri-Clamp connections to DIN 32676 | Weiss","description":"Tri-Clamp components to DIN 32676 for tank, plant and vessel construction. Configure your design and send a technical inquiry.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/weiss-apparatebau.de\/en\/service\/tri-clamp-connections-stainless-steel\/","og_locale":"en_US","og_type":"article","og_title":"Stainless steel Tri-Clamp connections to DIN 32676 | Weiss","og_description":"Tri-Clamp components to DIN 32676 for tank, plant and vessel construction. Configure your design and send a technical inquiry.","og_url":"https:\/\/weiss-apparatebau.de\/en\/service\/tri-clamp-connections-stainless-steel\/","og_site_name":"Weiss Apparatebau GmbH","article_modified_time":"2026-09-23T12:40:51+00:00","og_image":[{"width":1200,"height":798,"url":"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/05\/1weiss\u00a9patrik.labitzke\u00a9candidateflow.de_B-9.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"96 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/weiss-apparatebau.de\/en\/service\/tri-clamp-connections-stainless-steel\/","url":"https:\/\/weiss-apparatebau.de\/en\/service\/tri-clamp-connections-stainless-steel\/","name":"Stainless steel Tri-Clamp connections to DIN 32676 | Weiss","isPartOf":{"@id":"https:\/\/weiss-apparatebau.de\/#website"},"datePublished":"2026-09-14T14:45:46+00:00","dateModified":"2026-09-23T12:40:51+00:00","description":"Tri-Clamp components to DIN 32676 for tank, plant and vessel construction. Configure your design and send a technical inquiry.","breadcrumb":{"@id":"https:\/\/weiss-apparatebau.de\/en\/service\/tri-clamp-connections-stainless-steel\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/weiss-apparatebau.de\/en\/service\/tri-clamp-connections-stainless-steel\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/weiss-apparatebau.de\/en\/service\/tri-clamp-connections-stainless-steel\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Startseite","item":"https:\/\/weiss-apparatebau.de\/en\/precision-engineering-in-stainless-steel-made-in-germany\/"},{"@type":"ListItem","position":2,"name":"Services","item":"https:\/\/weiss-apparatebau.de\/en\/service\/"},{"@type":"ListItem","position":3,"name":"Stainless steel Tri-Clamp connections"}]},{"@type":"WebSite","@id":"https:\/\/weiss-apparatebau.de\/#website","url":"https:\/\/weiss-apparatebau.de\/","name":"Ihr Partner f\u00fcr pr\u00e4zise Schwei\u00dfmontagen & Apparatebau \u2013 Made in Germany.","description":"Spezialist f\u00fcr Edelstahl Beh\u00e4lterbau, Rohrleitungsbau &amp; Steriltechnik in der Industrie","publisher":{"@id":"https:\/\/weiss-apparatebau.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/weiss-apparatebau.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/weiss-apparatebau.de\/#organization","name":"Ihr Partner f\u00fcr pr\u00e4zise Schwei\u00dfmontagen & Apparatebau \u2013 Made in Germany.","url":"https:\/\/weiss-apparatebau.de\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/weiss-apparatebau.de\/#\/schema\/logo\/image\/","url":"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/03\/WEISS-Logo.png","contentUrl":"https:\/\/weiss-apparatebau.de\/wp-content\/uploads\/2025\/03\/WEISS-Logo.png","width":400,"height":176,"caption":"Ihr Partner f\u00fcr pr\u00e4zise Schwei\u00dfmontagen & Apparatebau \u2013 Made in Germany."},"image":{"@id":"https:\/\/weiss-apparatebau.de\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/weiss-apparatebau.de\/en\/wp-json\/wp\/v2\/pages\/4343","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/weiss-apparatebau.de\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/weiss-apparatebau.de\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/weiss-apparatebau.de\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/weiss-apparatebau.de\/en\/wp-json\/wp\/v2\/comments?post=4343"}],"version-history":[{"count":9,"href":"https:\/\/weiss-apparatebau.de\/en\/wp-json\/wp\/v2\/pages\/4343\/revisions"}],"predecessor-version":[{"id":4389,"href":"https:\/\/weiss-apparatebau.de\/en\/wp-json\/wp\/v2\/pages\/4343\/revisions\/4389"}],"up":[{"embeddable":true,"href":"https:\/\/weiss-apparatebau.de\/en\/wp-json\/wp\/v2\/pages\/2827"}],"wp:attachment":[{"href":"https:\/\/weiss-apparatebau.de\/en\/wp-json\/wp\/v2\/media?parent=4343"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}