source dump of claude code
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

at main 377 lines 40 kB view raw
1import { c as _c } from "react/compiler-runtime"; 2import * as React from 'react'; 3import { useEffect, useState } from 'react'; 4import { extraUsage as extraUsageCommand } from 'src/commands/extra-usage/index.js'; 5import { formatCost } from 'src/cost-tracker.js'; 6import { getSubscriptionType } from 'src/utils/auth.js'; 7import { useTerminalSize } from '../../hooks/useTerminalSize.js'; 8import { Box, Text } from '../../ink.js'; 9import { useKeybinding } from '../../keybindings/useKeybinding.js'; 10import { type ExtraUsage, fetchUtilization, type RateLimit, type Utilization } from '../../services/api/usage.js'; 11import { formatResetText } from '../../utils/format.js'; 12import { logError } from '../../utils/log.js'; 13import { jsonStringify } from '../../utils/slowOperations.js'; 14import { ConfigurableShortcutHint } from '../ConfigurableShortcutHint.js'; 15import { Byline } from '../design-system/Byline.js'; 16import { ProgressBar } from '../design-system/ProgressBar.js'; 17import { isEligibleForOverageCreditGrant, OverageCreditUpsell } from '../LogoV2/OverageCreditUpsell.js'; 18type LimitBarProps = { 19 title: string; 20 limit: RateLimit; 21 maxWidth: number; 22 showTimeInReset?: boolean; 23 extraSubtext?: string; 24}; 25function LimitBar(t0) { 26 const $ = _c(34); 27 const { 28 title, 29 limit, 30 maxWidth, 31 showTimeInReset: t1, 32 extraSubtext 33 } = t0; 34 const showTimeInReset = t1 === undefined ? true : t1; 35 const { 36 utilization, 37 resets_at 38 } = limit; 39 if (utilization === null) { 40 return null; 41 } 42 const usedText = `${Math.floor(utilization)}% used`; 43 let subtext; 44 if (resets_at) { 45 let t2; 46 if ($[0] !== resets_at || $[1] !== showTimeInReset) { 47 t2 = formatResetText(resets_at, true, showTimeInReset); 48 $[0] = resets_at; 49 $[1] = showTimeInReset; 50 $[2] = t2; 51 } else { 52 t2 = $[2]; 53 } 54 subtext = `Resets ${t2}`; 55 } 56 if (extraSubtext) { 57 if (subtext) { 58 subtext = `${extraSubtext} · ${subtext}`; 59 } else { 60 subtext = extraSubtext; 61 } 62 } 63 if (maxWidth >= 62) { 64 let t2; 65 if ($[3] !== title) { 66 t2 = <Text bold={true}>{title}</Text>; 67 $[3] = title; 68 $[4] = t2; 69 } else { 70 t2 = $[4]; 71 } 72 const t3 = utilization / 100; 73 let t4; 74 if ($[5] !== t3) { 75 t4 = <ProgressBar ratio={t3} width={50} fillColor="rate_limit_fill" emptyColor="rate_limit_empty" />; 76 $[5] = t3; 77 $[6] = t4; 78 } else { 79 t4 = $[6]; 80 } 81 let t5; 82 if ($[7] !== usedText) { 83 t5 = <Text>{usedText}</Text>; 84 $[7] = usedText; 85 $[8] = t5; 86 } else { 87 t5 = $[8]; 88 } 89 let t6; 90 if ($[9] !== t4 || $[10] !== t5) { 91 t6 = <Box flexDirection="row" gap={1}>{t4}{t5}</Box>; 92 $[9] = t4; 93 $[10] = t5; 94 $[11] = t6; 95 } else { 96 t6 = $[11]; 97 } 98 let t7; 99 if ($[12] !== subtext) { 100 t7 = subtext && <Text dimColor={true}>{subtext}</Text>; 101 $[12] = subtext; 102 $[13] = t7; 103 } else { 104 t7 = $[13]; 105 } 106 let t8; 107 if ($[14] !== t2 || $[15] !== t6 || $[16] !== t7) { 108 t8 = <Box flexDirection="column">{t2}{t6}{t7}</Box>; 109 $[14] = t2; 110 $[15] = t6; 111 $[16] = t7; 112 $[17] = t8; 113 } else { 114 t8 = $[17]; 115 } 116 return t8; 117 } else { 118 let t2; 119 if ($[18] !== title) { 120 t2 = <Text bold={true}>{title}</Text>; 121 $[18] = title; 122 $[19] = t2; 123 } else { 124 t2 = $[19]; 125 } 126 let t3; 127 if ($[20] !== subtext) { 128 t3 = subtext && <><Text> </Text><Text dimColor={true}>· {subtext}</Text></>; 129 $[20] = subtext; 130 $[21] = t3; 131 } else { 132 t3 = $[21]; 133 } 134 let t4; 135 if ($[22] !== t2 || $[23] !== t3) { 136 t4 = <Text>{t2}{t3}</Text>; 137 $[22] = t2; 138 $[23] = t3; 139 $[24] = t4; 140 } else { 141 t4 = $[24]; 142 } 143 const t5 = utilization / 100; 144 let t6; 145 if ($[25] !== maxWidth || $[26] !== t5) { 146 t6 = <ProgressBar ratio={t5} width={maxWidth} fillColor="rate_limit_fill" emptyColor="rate_limit_empty" />; 147 $[25] = maxWidth; 148 $[26] = t5; 149 $[27] = t6; 150 } else { 151 t6 = $[27]; 152 } 153 let t7; 154 if ($[28] !== usedText) { 155 t7 = <Text>{usedText}</Text>; 156 $[28] = usedText; 157 $[29] = t7; 158 } else { 159 t7 = $[29]; 160 } 161 let t8; 162 if ($[30] !== t4 || $[31] !== t6 || $[32] !== t7) { 163 t8 = <Box flexDirection="column">{t4}{t6}{t7}</Box>; 164 $[30] = t4; 165 $[31] = t6; 166 $[32] = t7; 167 $[33] = t8; 168 } else { 169 t8 = $[33]; 170 } 171 return t8; 172 } 173} 174export function Usage(): React.ReactNode { 175 const [utilization, setUtilization] = useState<Utilization | null>(null); 176 const [error, setError] = useState<string | null>(null); 177 const [isLoading, setIsLoading] = useState(true); 178 const { 179 columns 180 } = useTerminalSize(); 181 const availableWidth = columns - 2; // 2 for screen padding 182 const maxWidth = Math.min(availableWidth, 80); 183 const loadUtilization = React.useCallback(async () => { 184 setIsLoading(true); 185 setError(null); 186 try { 187 const data = await fetchUtilization(); 188 setUtilization(data); 189 } catch (err) { 190 logError(err as Error); 191 const axiosError = err as { 192 response?: { 193 data?: unknown; 194 }; 195 }; 196 const responseBody = axiosError.response?.data ? jsonStringify(axiosError.response.data) : undefined; 197 setError(responseBody ? `Failed to load usage data: ${responseBody}` : 'Failed to load usage data'); 198 } finally { 199 setIsLoading(false); 200 } 201 }, []); 202 useEffect(() => { 203 void loadUtilization(); 204 }, [loadUtilization]); 205 useKeybinding('settings:retry', () => { 206 void loadUtilization(); 207 }, { 208 context: 'Settings', 209 isActive: !!error && !isLoading 210 }); 211 if (error) { 212 return <Box flexDirection="column" gap={1}> 213 <Text color="error">Error: {error}</Text> 214 <Text dimColor> 215 <Byline> 216 <ConfigurableShortcutHint action="settings:retry" context="Settings" fallback="r" description="retry" /> 217 <ConfigurableShortcutHint action="confirm:no" context="Settings" fallback="Esc" description="cancel" /> 218 </Byline> 219 </Text> 220 </Box>; 221 } 222 if (!utilization) { 223 return <Box flexDirection="column" gap={1}> 224 <Text dimColor>Loading usage data</Text> 225 <Text dimColor> 226 <ConfigurableShortcutHint action="confirm:no" context="Settings" fallback="Esc" description="cancel" /> 227 </Text> 228 </Box>; 229 } 230 231 // Only Max and Team plans have a Sonnet limit that differs from the weekly 232 // limit (see rateLimitMessages.ts). For other plans the bar is redundant. 233 // Show for null (unknown plan) to stay consistent with rateLimitMessages.ts, 234 // which labels it "Sonnet limit" in that case. 235 const subscriptionType = getSubscriptionType(); 236 const showSonnetBar = subscriptionType === 'max' || subscriptionType === 'team' || subscriptionType === null; 237 const limits = [{ 238 title: 'Current session', 239 limit: utilization.five_hour 240 }, { 241 title: 'Current week (all models)', 242 limit: utilization.seven_day 243 }, ...(showSonnetBar ? [{ 244 title: 'Current week (Sonnet only)', 245 limit: utilization.seven_day_sonnet 246 }] : [])]; 247 return <Box flexDirection="column" gap={1} width="100%"> 248 {limits.some(({ 249 limit 250 }) => limit) || <Text dimColor>/usage is only available for subscription plans.</Text>} 251 252 {limits.map(({ 253 title, 254 limit: limit_0 255 }) => limit_0 && <LimitBar key={title} title={title} limit={limit_0} maxWidth={maxWidth} />)} 256 257 {utilization.extra_usage && <ExtraUsageSection extraUsage={utilization.extra_usage} maxWidth={maxWidth} />} 258 259 {isEligibleForOverageCreditGrant() && <OverageCreditUpsell maxWidth={maxWidth} />} 260 261 <Text dimColor> 262 <ConfigurableShortcutHint action="confirm:no" context="Settings" fallback="Esc" description="cancel" /> 263 </Text> 264 </Box>; 265} 266type ExtraUsageSectionProps = { 267 extraUsage: ExtraUsage; 268 maxWidth: number; 269}; 270const EXTRA_USAGE_SECTION_TITLE = 'Extra usage'; 271function ExtraUsageSection(t0) { 272 const $ = _c(20); 273 const { 274 extraUsage, 275 maxWidth 276 } = t0; 277 const subscriptionType = getSubscriptionType(); 278 const isProOrMax = subscriptionType === "pro" || subscriptionType === "max"; 279 if (!isProOrMax) { 280 return false; 281 } 282 if (!extraUsage.is_enabled) { 283 if (extraUsageCommand.isEnabled()) { 284 let t1; 285 if ($[0] === Symbol.for("react.memo_cache_sentinel")) { 286 t1 = <Box flexDirection="column"><Text bold={true}>{EXTRA_USAGE_SECTION_TITLE}</Text><Text dimColor={true}>Extra usage not enabled · /extra-usage to enable</Text></Box>; 287 $[0] = t1; 288 } else { 289 t1 = $[0]; 290 } 291 return t1; 292 } 293 return null; 294 } 295 if (extraUsage.monthly_limit === null) { 296 let t1; 297 if ($[1] === Symbol.for("react.memo_cache_sentinel")) { 298 t1 = <Box flexDirection="column"><Text bold={true}>{EXTRA_USAGE_SECTION_TITLE}</Text><Text dimColor={true}>Unlimited</Text></Box>; 299 $[1] = t1; 300 } else { 301 t1 = $[1]; 302 } 303 return t1; 304 } 305 if (typeof extraUsage.used_credits !== "number" || typeof extraUsage.utilization !== "number") { 306 return null; 307 } 308 const t1 = extraUsage.used_credits / 100; 309 let t2; 310 if ($[2] !== t1) { 311 t2 = formatCost(t1, 2); 312 $[2] = t1; 313 $[3] = t2; 314 } else { 315 t2 = $[3]; 316 } 317 const formattedUsedCredits = t2; 318 const t3 = extraUsage.monthly_limit / 100; 319 let t4; 320 if ($[4] !== t3) { 321 t4 = formatCost(t3, 2); 322 $[4] = t3; 323 $[5] = t4; 324 } else { 325 t4 = $[5]; 326 } 327 const formattedMonthlyLimit = t4; 328 let T0; 329 let t5; 330 let t6; 331 let t7; 332 if ($[6] !== extraUsage.utilization) { 333 const now = new Date(); 334 const oneMonthReset = new Date(now.getFullYear(), now.getMonth() + 1, 1); 335 T0 = LimitBar; 336 t7 = EXTRA_USAGE_SECTION_TITLE; 337 t5 = extraUsage.utilization; 338 t6 = oneMonthReset.toISOString(); 339 $[6] = extraUsage.utilization; 340 $[7] = T0; 341 $[8] = t5; 342 $[9] = t6; 343 $[10] = t7; 344 } else { 345 T0 = $[7]; 346 t5 = $[8]; 347 t6 = $[9]; 348 t7 = $[10]; 349 } 350 let t8; 351 if ($[11] !== t5 || $[12] !== t6) { 352 t8 = { 353 utilization: t5, 354 resets_at: t6 355 }; 356 $[11] = t5; 357 $[12] = t6; 358 $[13] = t8; 359 } else { 360 t8 = $[13]; 361 } 362 const t9 = `${formattedUsedCredits} / ${formattedMonthlyLimit} spent`; 363 let t10; 364 if ($[14] !== T0 || $[15] !== maxWidth || $[16] !== t7 || $[17] !== t8 || $[18] !== t9) { 365 t10 = <T0 title={t7} limit={t8} showTimeInReset={false} extraSubtext={t9} maxWidth={maxWidth} />; 366 $[14] = T0; 367 $[15] = maxWidth; 368 $[16] = t7; 369 $[17] = t8; 370 $[18] = t9; 371 $[19] = t10; 372 } else { 373 t10 = $[19]; 374 } 375 return t10; 376} 377//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsInVzZUVmZmVjdCIsInVzZVN0YXRlIiwiZXh0cmFVc2FnZSIsImV4dHJhVXNhZ2VDb21tYW5kIiwiZm9ybWF0Q29zdCIsImdldFN1YnNjcmlwdGlvblR5cGUiLCJ1c2VUZXJtaW5hbFNpemUiLCJCb3giLCJUZXh0IiwidXNlS2V5YmluZGluZyIsIkV4dHJhVXNhZ2UiLCJmZXRjaFV0aWxpemF0aW9uIiwiUmF0ZUxpbWl0IiwiVXRpbGl6YXRpb24iLCJmb3JtYXRSZXNldFRleHQiLCJsb2dFcnJvciIsImpzb25TdHJpbmdpZnkiLCJDb25maWd1cmFibGVTaG9ydGN1dEhpbnQiLCJCeWxpbmUiLCJQcm9ncmVzc0JhciIsImlzRWxpZ2libGVGb3JPdmVyYWdlQ3JlZGl0R3JhbnQiLCJPdmVyYWdlQ3JlZGl0VXBzZWxsIiwiTGltaXRCYXJQcm9wcyIsInRpdGxlIiwibGltaXQiLCJtYXhXaWR0aCIsInNob3dUaW1lSW5SZXNldCIsImV4dHJhU3VidGV4dCIsIkxpbWl0QmFyIiwidDAiLCIkIiwiX2MiLCJ0MSIsInVuZGVmaW5lZCIsInV0aWxpemF0aW9uIiwicmVzZXRzX2F0IiwidXNlZFRleHQiLCJNYXRoIiwiZmxvb3IiLCJzdWJ0ZXh0IiwidDIiLCJ0MyIsInQ0IiwibWF4QmFyV2lkdGgiLCJ0NSIsInQ2IiwidDciLCJ0OCIsIlVzYWdlIiwiUmVhY3ROb2RlIiwic2V0VXRpbGl6YXRpb24iLCJlcnJvciIsInNldEVycm9yIiwiaXNMb2FkaW5nIiwic2V0SXNMb2FkaW5nIiwiY29sdW1ucyIsImF2YWlsYWJsZVdpZHRoIiwibWluIiwibG9hZFV0aWxpemF0aW9uIiwidXNlQ2FsbGJhY2siLCJkYXRhIiwiZXJyIiwiRXJyb3IiLCJheGlvc0Vycm9yIiwicmVzcG9uc2UiLCJyZXNwb25zZUJvZHkiLCJjb250ZXh0IiwiaXNBY3RpdmUiLCJzdWJzY3JpcHRpb25UeXBlIiwic2hvd1Nvbm5ldEJhciIsImxpbWl0cyIsImZpdmVfaG91ciIsInNldmVuX2RheSIsInNldmVuX2RheV9zb25uZXQiLCJzb21lIiwibWFwIiwiZXh0cmFfdXNhZ2UiLCJFeHRyYVVzYWdlU2VjdGlvblByb3BzIiwiRVhUUkFfVVNBR0VfU0VDVElPTl9USVRMRSIsIkV4dHJhVXNhZ2VTZWN0aW9uIiwiaXNQcm9Pck1heCIsImlzX2VuYWJsZWQiLCJpc0VuYWJsZWQiLCJTeW1ib2wiLCJmb3IiLCJtb250aGx5X2xpbWl0IiwidXNlZF9jcmVkaXRzIiwiZm9ybWF0dGVkVXNlZENyZWRpdHMiLCJmb3JtYXR0ZWRNb250aGx5TGltaXQiLCJUMCIsIm5vdyIsIkRhdGUiLCJvbmVNb250aFJlc2V0IiwiZ2V0RnVsbFllYXIiLCJnZXRNb250aCIsInRvSVNPU3RyaW5nIiwidDkiLCJ0MTAiXSwic291cmNlcyI6WyJVc2FnZS50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyB1c2VFZmZlY3QsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBleHRyYVVzYWdlIGFzIGV4dHJhVXNhZ2VDb21tYW5kIH0gZnJvbSAnc3JjL2NvbW1hbmRzL2V4dHJhLXVzYWdlL2luZGV4LmpzJ1xuaW1wb3J0IHsgZm9ybWF0Q29zdCB9IGZyb20gJ3NyYy9jb3N0LXRyYWNrZXIuanMnXG5pbXBvcnQgeyBnZXRTdWJzY3JpcHRpb25UeXBlIH0gZnJvbSAnc3JjL3V0aWxzL2F1dGguanMnXG5pbXBvcnQgeyB1c2VUZXJtaW5hbFNpemUgfSBmcm9tICcuLi8uLi9ob29rcy91c2VUZXJtaW5hbFNpemUuanMnXG5pbXBvcnQgeyBCb3gsIFRleHQgfSBmcm9tICcuLi8uLi9pbmsuanMnXG5pbXBvcnQgeyB1c2VLZXliaW5kaW5nIH0gZnJvbSAnLi4vLi4va2V5YmluZGluZ3MvdXNlS2V5YmluZGluZy5qcydcbmltcG9ydCB7XG4gIHR5cGUgRXh0cmFVc2FnZSxcbiAgZmV0Y2hVdGlsaXphdGlvbixcbiAgdHlwZSBSYXRlTGltaXQsXG4gIHR5cGUgVXRpbGl6YXRpb24sXG59IGZyb20gJy4uLy4uL3NlcnZpY2VzL2FwaS91c2FnZS5qcydcbmltcG9ydCB7IGZvcm1hdFJlc2V0VGV4dCB9IGZyb20gJy4uLy4uL3V0aWxzL2Zvcm1hdC5qcydcbmltcG9ydCB7IGxvZ0Vycm9yIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nLmpzJ1xuaW1wb3J0IHsganNvblN0cmluZ2lmeSB9IGZyb20gJy4uLy4uL3V0aWxzL3Nsb3dPcGVyYXRpb25zLmpzJ1xuaW1wb3J0IHsgQ29uZmlndXJhYmxlU2hvcnRjdXRIaW50IH0gZnJvbSAnLi4vQ29uZmlndXJhYmxlU2hvcnRjdXRIaW50LmpzJ1xuaW1wb3J0IHsgQnlsaW5lIH0gZnJvbSAnLi4vZGVzaWduLXN5c3RlbS9CeWxpbmUuanMnXG5pbXBvcnQgeyBQcm9ncmVzc0JhciB9IGZyb20gJy4uL2Rlc2lnbi1zeXN0ZW0vUHJvZ3Jlc3NCYXIuanMnXG5pbXBvcnQge1xuICBpc0VsaWdpYmxlRm9yT3ZlcmFnZUNyZWRpdEdyYW50LFxuICBPdmVyYWdlQ3JlZGl0VXBzZWxsLFxufSBmcm9tICcuLi9Mb2dvVjIvT3ZlcmFnZUNyZWRpdFVwc2VsbC5qcydcblxudHlwZSBMaW1pdEJhclByb3BzID0ge1xuICB0aXRsZTogc3RyaW5nXG4gIGxpbWl0OiBSYXRlTGltaXRcbiAgbWF4V2lkdGg6IG51bWJlclxuICBzaG93VGltZUluUmVzZXQ/OiBib29sZWFuXG4gIGV4dHJhU3VidGV4dD86IHN0cmluZ1xufVxuXG5mdW5jdGlvbiBMaW1pdEJhcih7XG4gIHRpdGxlLFxuICBsaW1pdCxcbiAgbWF4V2lkdGgsXG4gIHNob3dUaW1lSW5SZXNldCA9IHRydWUsXG4gIGV4dHJhU3VidGV4dCxcbn06IExpbWl0QmFyUHJvcHMpOiBSZWFjdC5SZWFjdE5vZGUge1xuICBjb25zdCB7IHV0aWxpemF0aW9uLCByZXNldHNfYXQgfSA9IGxpbWl0XG4gIGlmICh1dGlsaXphdGlvbiA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvLyBDYWxjdWxhdGUgdXNhZ2UgcGVyY2VudGFnZVxuICBjb25zdCB1c2VkVGV4dCA9IGAke01hdGguZmxvb3IodXRpbGl6YXRpb24pfSUgdXNlZGBcblxuICBsZXQgc3VidGV4dDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gIGlmIChyZXNldHNfYXQpIHtcbiAgICBzdWJ0ZXh0ID0gYFJlc2V0cyAke2Zvcm1hdFJlc2V0VGV4dChyZXNldHNfYXQsIHRydWUsIHNob3dUaW1lSW5SZXNldCl9YFxuICB9XG5cbiAgaWYgKGV4dHJhU3VidGV4dCkge1xuICAgIGlmIChzdWJ0ZXh0KSB7XG4gICAgICBzdWJ0ZXh0ID0gYCR7ZXh0cmFTdWJ0ZXh0fSDCtyAke3N1YnRleHR9YFxuICAgIH0gZWxzZSB7XG4gICAgICBzdWJ0ZXh0ID0gZXh0cmFTdWJ0ZXh0XG4gICAgfVxuICB9XG5cbiAgY29uc3QgbWF4QmFyV2lkdGggPSA1MFxuICBjb25zdCB1c2VkTGFiZWxTcGFjZSA9IDEyXG4gIGlmIChtYXhXaWR0aCA+PSBtYXhCYXJXaWR0aCArIHVzZWRMYWJlbFNwYWNlKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxCb3ggZmxleERpcmVjdGlvbj1cImNvbHVtblwiPlxuICAgICAgICA8VGV4dCBib2xkPnt0aXRsZX08L1RleHQ+XG4gICAgICAgIDxCb3ggZmxleERpcmVjdGlvbj1cInJvd1wiIGdhcD17MX0+XG4gICAgICAgICAgPFByb2dyZXNzQmFyXG4gICAgICAgICAgICByYXRpbz17dXRpbGl6YXRpb24gLyAxMDB9XG4gICAgICAgICAgICB3aWR0aD17bWF4QmFyV2lkdGh9XG4gICAgICAgICAgICBmaWxsQ29sb3I9XCJyYXRlX2xpbWl0X2ZpbGxcIlxuICAgICAgICAgICAgZW1wdHlDb2xvcj1cInJhdGVfbGltaXRfZW1wdHlcIlxuICAgICAgICAgIC8+XG4gICAgICAgICAgPFRleHQ+e3VzZWRUZXh0fTwvVGV4dD5cbiAgICAgICAgPC9Cb3g+XG4gICAgICAgIHtzdWJ0ZXh0ICYmIDxUZXh0IGRpbUNvbG9yPntzdWJ0ZXh0fTwvVGV4dD59XG4gICAgICA8L0JveD5cbiAgICApXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxCb3ggZmxleERpcmVjdGlvbj1cImNvbHVtblwiPlxuICAgICAgICA8VGV4dD5cbiAgICAgICAgICA8VGV4dCBib2xkPnt0aXRsZX08L1RleHQ+XG4gICAgICAgICAge3N1YnRleHQgJiYgKFxuICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgPFRleHQ+IDwvVGV4dD5cbiAgICAgICAgICAgICAgPFRleHQgZGltQ29sb3I+wrcge3N1YnRleHR9PC9UZXh0PlxuICAgICAgICAgICAgPC8+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC9UZXh0PlxuICAgICAgICA8UHJvZ3Jlc3NCYXJcbiAgICAgICAgICByYXRpbz17dXRpbGl6YXRpb24gLyAxMDB9XG4gICAgICAgICAgd2lkdGg9e21heFdpZHRofVxuICAgICAgICAgIGZpbGxDb2xvcj1cInJhdGVfbGltaXRfZmlsbFwiXG4gICAgICAgICAgZW1wdHlDb2xvcj1cInJhdGVfbGltaXRfZW1wdHlcIlxuICAgICAgICAvPlxuICAgICAgICA8VGV4dD57dXNlZFRleHR9PC9UZXh0PlxuICAgICAgPC9Cb3g+XG4gICAgKVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBVc2FnZSgpOiBSZWFjdC5SZWFjdE5vZGUge1xuICBjb25zdCBbdXRpbGl6YXRpb24sIHNldFV0aWxpemF0aW9uXSA9IHVzZVN0YXRlPFV0aWxpemF0aW9uIHwgbnVsbD4obnVsbClcbiAgY29uc3QgW2Vycm9yLCBzZXRFcnJvcl0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKVxuICBjb25zdCBbaXNMb2FkaW5nLCBzZXRJc0xvYWRpbmddID0gdXNlU3RhdGUodHJ1ZSlcbiAgY29uc3QgeyBjb2x1bW5zIH0gPSB1c2VUZXJtaW5hbFNpemUoKVxuXG4gIGNvbnN0IGF2YWlsYWJsZVdpZHRoID0gY29sdW1ucyAtIDIgLy8gMiBmb3Igc2NyZWVuIHBhZGRpbmdcbiAgY29uc3QgbWF4V2lkdGggPSBNYXRoLm1pbihhdmFpbGFibGVXaWR0aCwgODApXG5cbiAgY29uc3QgbG9hZFV0aWxpemF0aW9uID0gUmVhY3QudXNlQ2FsbGJhY2soYXN5bmMgKCkgPT4ge1xuICAgIHNldElzTG9hZGluZyh0cnVlKVxuICAgIHNldEVycm9yKG51bGwpXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBmZXRjaFV0aWxpemF0aW9uKClcbiAgICAgIHNldFV0aWxpemF0aW9uKGRhdGEpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2dFcnJvcihlcnIgYXMgRXJyb3IpXG4gICAgICBjb25zdCBheGlvc0Vycm9yID0gZXJyIGFzIHsgcmVzcG9uc2U/OiB7IGRhdGE/OiB1bmtub3duIH0gfVxuICAgICAgY29uc3QgcmVzcG9uc2VCb2R5ID0gYXhpb3NFcnJvci5yZXNwb25zZT8uZGF0YVxuICAgICAgICA/IGpzb25TdHJpbmdpZnkoYXhpb3NFcnJvci5yZXNwb25zZS5kYXRhKVxuICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgc2V0RXJyb3IoXG4gICAgICAgIHJlc3BvbnNlQm9keVxuICAgICAgICAgID8gYEZhaWxlZCB0byBsb2FkIHVzYWdlIGRhdGE6ICR7cmVzcG9uc2VCb2R5fWBcbiAgICAgICAgICA6ICdGYWlsZWQgdG8gbG9hZCB1c2FnZSBkYXRhJyxcbiAgICAgIClcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0SXNMb2FkaW5nKGZhbHNlKVxuICAgIH1cbiAgfSwgW10pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICB2b2lkIGxvYWRVdGlsaXphdGlvbigpXG4gIH0sIFtsb2FkVXRpbGl6YXRpb25dKVxuXG4gIHVzZUtleWJpbmRpbmcoXG4gICAgJ3NldHRpbmdzOnJldHJ5JyxcbiAgICAoKSA9PiB7XG4gICAgICB2b2lkIGxvYWRVdGlsaXphdGlvbigpXG4gICAgfSxcbiAgICB7IGNvbnRleHQ6ICdTZXR0aW5ncycsIGlzQWN0aXZlOiAhIWVycm9yICYmICFpc0xvYWRpbmcgfSxcbiAgKVxuXG4gIGlmIChlcnJvcikge1xuICAgIHJldHVybiAoXG4gICAgICA8Qm94IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIiBnYXA9ezF9PlxuICAgICAgICA8VGV4dCBjb2xvcj1cImVycm9yXCI+RXJyb3I6IHtlcnJvcn08L1RleHQ+XG4gICAgICAgIDxUZXh0IGRpbUNvbG9yPlxuICAgICAgICAgIDxCeWxpbmU+XG4gICAgICAgICAgICA8Q29uZmlndXJhYmxlU2hvcnRjdXRIaW50XG4gICAgICAgICAgICAgIGFjdGlvbj1cInNldHRpbmdzOnJldHJ5XCJcbiAgICAgICAgICAgICAgY29udGV4dD1cIlNldHRpbmdzXCJcbiAgICAgICAgICAgICAgZmFsbGJhY2s9XCJyXCJcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb249XCJyZXRyeVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPENvbmZpZ3VyYWJsZVNob3J0Y3V0SGludFxuICAgICAgICAgICAgICBhY3Rpb249XCJjb25maXJtOm5vXCJcbiAgICAgICAgICAgICAgY29udGV4dD1cIlNldHRpbmdzXCJcbiAgICAgICAgICAgICAgZmFsbGJhY2s9XCJFc2NcIlxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbj1cImNhbmNlbFwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvQnlsaW5lPlxuICAgICAgICA8L1RleHQ+XG4gICAgICA8L0JveD5cbiAgICApXG4gIH1cblxuICBpZiAoIXV0aWxpemF0aW9uKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxCb3ggZmxleERpcmVjdGlvbj1cImNvbHVtblwiIGdhcD17MX0+XG4gICAgICAgIDxUZXh0IGRpbUNvbG9yPkxvYWRpbmcgdXNhZ2UgZGF0YeKApjwvVGV4dD5cbiAgICAgICAgPFRleHQgZGltQ29sb3I+XG4gICAgICAgICAgPENvbmZpZ3VyYWJsZVNob3J0Y3V0SGludFxuICAgICAgICAgICAgYWN0aW9uPVwiY29uZmlybTpub1wiXG4gICAgICAgICAgICBjb250ZXh0PVwiU2V0dGluZ3NcIlxuICAgICAgICAgICAgZmFsbGJhY2s9XCJFc2NcIlxuICAgICAgICAgICAgZGVzY3JpcHRpb249XCJjYW5jZWxcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvVGV4dD5cbiAgICAgIDwvQm94PlxuICAgIClcbiAgfVxuXG4gIC8vIE9ubHkgTWF4IGFuZCBUZWFtIHBsYW5zIGhhdmUgYSBTb25uZXQgbGltaXQgdGhhdCBkaWZmZXJzIGZyb20gdGhlIHdlZWtseVxuICAvLyBsaW1pdCAoc2VlIHJhdGVMaW1pdE1lc3NhZ2VzLnRzKS4gRm9yIG90aGVyIHBsYW5zIHRoZSBiYXIgaXMgcmVkdW5kYW50LlxuICAvLyBTaG93IGZvciBudWxsICh1bmtub3duIHBsYW4pIHRvIHN0YXkgY29uc2lzdGVudCB3aXRoIHJhdGVMaW1pdE1lc3NhZ2VzLnRzLFxuICAvLyB3aGljaCBsYWJlbHMgaXQgXCJTb25uZXQgbGltaXRcIiBpbiB0aGF0IGNhc2UuXG4gIGNvbnN0IHN1YnNjcmlwdGlvblR5cGUgPSBnZXRTdWJzY3JpcHRpb25UeXBlKClcbiAgY29uc3Qgc2hvd1Nvbm5ldEJhciA9XG4gICAgc3Vic2NyaXB0aW9uVHlwZSA9PT0gJ21heCcgfHxcbiAgICBzdWJzY3JpcHRpb25UeXBlID09PSAndGVhbScgfHxcbiAgICBzdWJzY3JpcHRpb25UeXBlID09PSBudWxsXG5cbiAgY29uc3QgbGltaXRzID0gW1xuICAgIHtcbiAgICAgIHRpdGxlOiAnQ3VycmVudCBzZXNzaW9uJyxcbiAgICAgIGxpbWl0OiB1dGlsaXphdGlvbi5maXZlX2hvdXIsXG4gICAgfSxcbiAgICB7XG4gICAgICB0aXRsZTogJ0N1cnJlbnQgd2VlayAoYWxsIG1vZGVscyknLFxuICAgICAgbGltaXQ6IHV0aWxpemF0aW9uLnNldmVuX2RheSxcbiAgICB9LFxuICAgIC4uLihzaG93U29ubmV0QmFyXG4gICAgICA/IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0aXRsZTogJ0N1cnJlbnQgd2VlayAoU29ubmV0IG9ubHkpJyxcbiAgICAgICAgICAgIGxpbWl0OiB1dGlsaXphdGlvbi5zZXZlbl9kYXlfc29ubmV0LFxuICAgICAgICAgIH0sXG4gICAgICAgIF1cbiAgICAgIDogW10pLFxuICBdXG5cbiAgcmV0dXJuIChcbiAgICA8Qm94IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIiBnYXA9ezF9IHdpZHRoPVwiMTAwJVwiPlxuICAgICAge2xpbWl0cy5zb21lKCh7IGxpbWl0IH0pID0+IGxpbWl0KSB8fCAoXG4gICAgICAgIDxUZXh0IGRpbUNvbG9yPi91c2FnZSBpcyBvbmx5IGF2YWlsYWJsZSBmb3Igc3Vic2NyaXB0aW9uIHBsYW5zLjwvVGV4dD5cbiAgICAgICl9XG5cbiAgICAgIHtsaW1pdHMubWFwKFxuICAgICAgICAoeyB0aXRsZSwgbGltaXQgfSkgPT5cbiAgICAgICAgICBsaW1pdCAmJiAoXG4gICAgICAgICAgICA8TGltaXRCYXJcbiAgICAgICAgICAgICAga2V5PXt0aXRsZX1cbiAgICAgICAgICAgICAgdGl0bGU9e3RpdGxlfVxuICAgICAgICAgICAgICBsaW1pdD17bGltaXR9XG4gICAgICAgICAgICAgIG1heFdpZHRoPXttYXhXaWR0aH1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKSxcbiAgICAgICl9XG5cbiAgICAgIHt1dGlsaXphdGlvbi5leHRyYV91c2FnZSAmJiAoXG4gICAgICAgIDxFeHRyYVVzYWdlU2VjdGlvblxuICAgICAgICAgIGV4dHJhVXNhZ2U9e3V0aWxpemF0aW9uLmV4dHJhX3VzYWdlfVxuICAgICAgICAgIG1heFdpZHRoPXttYXhXaWR0aH1cbiAgICAgICAgLz5cbiAgICAgICl9XG5cbiAgICAgIHtpc0VsaWdpYmxlRm9yT3ZlcmFnZUNyZWRpdEdyYW50KCkgJiYgKFxuICAgICAgICA8T3ZlcmFnZUNyZWRpdFVwc2VsbCBtYXhXaWR0aD17bWF4V2lkdGh9IC8+XG4gICAgICApfVxuXG4gICAgICA8VGV4dCBkaW1Db2xvcj5cbiAgICAgICAgPENvbmZpZ3VyYWJsZVNob3J0Y3V0SGludFxuICAgICAgICAgIGFjdGlvbj1cImNvbmZpcm06bm9cIlxuICAgICAgICAgIGNvbnRleHQ9XCJTZXR0aW5nc1wiXG4gICAgICAgICAgZmFsbGJhY2s9XCJFc2NcIlxuICAgICAgICAgIGRlc2NyaXB0aW9uPVwiY2FuY2VsXCJcbiAgICAgICAgLz5cbiAgICAgIDwvVGV4dD5cbiAgICA8L0JveD5cbiAgKVxufVxuXG50eXBlIEV4dHJhVXNhZ2VTZWN0aW9uUHJvcHMgPSB7XG4gIGV4dHJhVXNhZ2U6IEV4dHJhVXNhZ2VcbiAgbWF4V2lkdGg6IG51bWJlclxufVxuXG5jb25zdCBFWFRSQV9VU0FHRV9TRUNUSU9OX1RJVExFID0gJ0V4dHJhIHVzYWdlJ1xuXG5mdW5jdGlvbiBFeHRyYVVzYWdlU2VjdGlvbih7XG4gIGV4dHJhVXNhZ2UsXG4gIG1heFdpZHRoLFxufTogRXh0cmFVc2FnZVNlY3Rpb25Qcm9wcyk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIGNvbnN0IHN1YnNjcmlwdGlvblR5cGUgPSBnZXRTdWJzY3JpcHRpb25UeXBlKClcbiAgY29uc3QgaXNQcm9Pck1heCA9IHN1YnNjcmlwdGlvblR5cGUgPT09ICdwcm8nIHx8IHN1YnNjcmlwdGlvblR5cGUgPT09ICdtYXgnXG4gIGlmICghaXNQcm9Pck1heCkge1xuICAgIC8vIE9ubHkgc2hvdyB0byBQcm8gYW5kIE1heCwgY29uc2lzdGVudCB3aXRoIGNsYXVkZS5haSBub24tYWRtaW4gdXNhZ2Ugc2V0dGluZ3NcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGlmICghZXh0cmFVc2FnZS5pc19lbmFibGVkKSB7XG4gICAgaWYgKGV4dHJhVXNhZ2VDb21tYW5kLmlzRW5hYmxlZCgpKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8Qm94IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIj5cbiAgICAgICAgICA8VGV4dCBib2xkPntFWFRSQV9VU0FHRV9TRUNUSU9OX1RJVExFfTwvVGV4dD5cbiAgICAgICAgICA8VGV4dCBkaW1Db2xvcj5FeHRyYSB1c2FnZSBub3QgZW5hYmxlZCDCtyAvZXh0cmEtdXNhZ2UgdG8gZW5hYmxlPC9UZXh0PlxuICAgICAgICA8L0JveD5cbiAgICAgIClcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgaWYgKGV4dHJhVXNhZ2UubW9udGhseV9saW1pdCA9PT0gbnVsbCkge1xuICAgIHJldHVybiAoXG4gICAgICA8Qm94IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIj5cbiAgICAgICAgPFRleHQgYm9sZD57RVhUUkFfVVNBR0VfU0VDVElPTl9USVRMRX08L1RleHQ+XG4gICAgICAgIDxUZXh0IGRpbUNvbG9yPlVubGltaXRlZDwvVGV4dD5cbiAgICAgIDwvQm94PlxuICAgIClcbiAgfVxuXG4gIGlmIChcbiAgICB0eXBlb2YgZXh0cmFVc2FnZS51c2VkX2NyZWRpdHMgIT09ICdudW1iZXInIHx8XG4gICAgdHlwZW9mIGV4dHJhVXNhZ2UudXRpbGl6YXRpb24gIT09ICdudW1iZXInXG4gICkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBjb25zdCBmb3JtYXR0ZWRVc2VkQ3JlZGl0cyA9IGZvcm1hdENvc3QoZXh0cmFVc2FnZS51c2VkX2NyZWRpdHMgLyAxMDAsIDIpXG4gIGNvbnN0IGZvcm1hdHRlZE1vbnRobHlMaW1pdCA9IGZvcm1hdENvc3QoZXh0cmFVc2FnZS5tb250aGx5X2xpbWl0IC8gMTAwLCAyKVxuICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpXG4gIGNvbnN0IG9uZU1vbnRoUmVzZXQgPSBuZXcgRGF0ZShub3cuZ2V0RnVsbFllYXIoKSwgbm93LmdldE1vbnRoKCkgKyAxLCAxKVxuXG4gIHJldHVybiAoXG4gICAgPExpbWl0QmFyXG4gICAgICB0aXRsZT17RVhUUkFfVVNBR0VfU0VDVElPTl9USVRMRX1cbiAgICAgIGxpbWl0PXt7XG4gICAgICAgIHV0aWxpemF0aW9uOiBleHRyYVVzYWdlLnV0aWxpemF0aW9uLFxuICAgICAgICAvLyBOb3QgYXBwbGljYWJsZSBmb3IgZW50ZXJwcmlzZXMsIGJ1dCBmb3Igbm93IHdlIGRvbid0IHJlbmRlciB0aGlzIGZvciB0aGVtXG4gICAgICAgIHJlc2V0c19hdDogb25lTW9udGhSZXNldC50b0lTT1N0cmluZygpLFxuICAgICAgfX1cbiAgICAgIHNob3dUaW1lSW5SZXNldD17ZmFsc2V9XG4gICAgICBleHRyYVN1YnRleHQ9e2Ake2Zvcm1hdHRlZFVzZWRDcmVkaXRzfSAvICR7Zm9ybWF0dGVkTW9udGhseUxpbWl0fSBzcGVudGB9XG4gICAgICBtYXhXaWR0aD17bWF4V2lkdGh9XG4gICAgLz5cbiAgKVxufVxuIl0sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxLQUFLQSxLQUFLLE1BQU0sT0FBTztBQUM5QixTQUFTQyxTQUFTLEVBQUVDLFFBQVEsUUFBUSxPQUFPO0FBQzNDLFNBQVNDLFVBQVUsSUFBSUMsaUJBQWlCLFFBQVEsbUNBQW1DO0FBQ25GLFNBQVNDLFVBQVUsUUFBUSxxQkFBcUI7QUFDaEQsU0FBU0MsbUJBQW1CLFFBQVEsbUJBQW1CO0FBQ3ZELFNBQVNDLGVBQWUsUUFBUSxnQ0FBZ0M7QUFDaEUsU0FBU0MsR0FBRyxFQUFFQyxJQUFJLFFBQVEsY0FBYztBQUN4QyxTQUFTQyxhQUFhLFFBQVEsb0NBQW9DO0FBQ2xFLFNBQ0UsS0FBS0MsVUFBVSxFQUNmQyxnQkFBZ0IsRUFDaEIsS0FBS0MsU0FBUyxFQUNkLEtBQUtDLFdBQVcsUUFDWCw2QkFBNkI7QUFDcEMsU0FBU0MsZUFBZSxRQUFRLHVCQUF1QjtBQUN2RCxTQUFTQyxRQUFRLFFBQVEsb0JBQW9CO0FBQzdDLFNBQVNDLGFBQWEsUUFBUSwrQkFBK0I7QUFDN0QsU0FBU0Msd0JBQXdCLFFBQVEsZ0NBQWdDO0FBQ3pFLFNBQVNDLE1BQU0sUUFBUSw0QkFBNEI7QUFDbkQsU0FBU0MsV0FBVyxRQUFRLGlDQUFpQztBQUM3RCxTQUNFQywrQkFBK0IsRUFDL0JDLG1CQUFtQixRQUNkLGtDQUFrQztBQUV6QyxLQUFLQyxhQUFhLEdBQUc7RUFDbkJDLEtBQUssRUFBRSxNQUFNO0VBQ2JDLEtBQUssRUFBRVosU0FBUztFQUNoQmEsUUFBUSxFQUFFLE1BQU07RUFDaEJDLGVBQWUsQ0FBQyxFQUFFLE9BQU87RUFDekJDLFlBQVksQ0FBQyxFQUFFLE1BQU07QUFDdkIsQ0FBQztBQUVELFNBQUFDLFNBQUFDLEVBQUE7RUFBQSxNQUFBQyxDQUFBLEdBQUFDLEVBQUE7RUFBa0I7SUFBQVIsS0FBQTtJQUFBQyxLQUFBO0lBQUFDLFFBQUE7SUFBQUMsZUFBQSxFQUFBTSxFQUFBO0lBQUFMO0VBQUEsSUFBQUUsRUFNRjtFQUZkLE1BQUFILGVBQUEsR0FBQU0sRUFBc0IsS0FBdEJDLFNBQXNCLEdBQXRCLElBQXNCLEdBQXRCRCxFQUFzQjtFQUd0QjtJQUFBRSxXQUFBO0lBQUFDO0VBQUEsSUFBbUNYLEtBQUs7RUFDeEMsSUFBSVUsV0FBVyxLQUFLLElBQUk7SUFBQSxPQUNmLElBQUk7RUFBQTtFQUliLE1BQUFFLFFBQUEsR0FBaUIsR0FBR0MsSUFBSSxDQUFBQyxLQUFNLENBQUNKLFdBQVcsQ0FBQyxRQUFRO0VBRS9DSyxHQUFBLENBQUFBLE9BQUE7RUFDSixJQUFJSixTQUFTO0lBQUEsSUFBQUssRUFBQTtJQUFBLElBQUFWLENBQUEsUUFBQUssU0FBQSxJQUFBTCxDQUFBLFFBQUFKLGVBQUE7TUFDU2MsRUFBQSxHQUFBMUIsZUFBZSxDQUFDcUIsU0FBUyxFQUFFLElBQUksRUFBRVQsZUFBZSxDQUFDO01BQUFJLENBQUEsTUFBQUssU0FBQTtNQUFBTCxDQUFBLE1BQUFKLGVBQUE7TUFBQUksQ0FBQSxNQUFBVSxFQUFBO0lBQUE7TUFBQUEsRUFBQSxHQUFBVixDQUFBO0lBQUE7SUFBckVTLE9BQUEsQ0FBQUEsQ0FBQSxDQUFVQSxVQUFVQSxFQUFpREEsRUFBRTtFQUFoRTtFQUdULElBQUlaLFlBQVk7SUFDZCxJQUFJWSxPQUFPO01BQ1RBLE9BQUEsQ0FBQUEsQ0FBQSxDQUFVQSxHQUFHWixZQUFZLE1BQU1ZLE9BQU8sRUFBRTtJQUFqQztNQUVQQSxPQUFBLENBQUFBLENBQUEsQ0FBVVosWUFBWTtJQUFmO0VBQ1I7RUFLSCxJQUFJRixRQUFRLElBQUksRUFBNEI7SUFBQSxJQUFBZSxFQUFBO0lBQUEsSUFBQVYsQ0FBQSxRQUFBUCxLQUFBO01BR3RDaUIsRUFBQSxJQUFDLElBQUksQ0FBQyxJQUFJLENBQUosS0FBRyxDQUFDLENBQUVqQixNQUFJLENBQUUsRUFBakIsSUFBSSxDQUFvQjtNQUFBTyxDQUFBLE1BQUFQLEtBQUE7TUFBQU8sQ0FBQSxNQUFBVSxFQUFBO0lBQUE7TUFBQUEsRUFBQSxHQUFBVixDQUFBO0lBQUE7SUFHZCxNQUFBVyxFQUFBLEdBQUFQLFdBQVcsR0FBRyxHQUFHO0lBQUEsSUFBQVEsRUFBQTtJQUFBLElBQUFaLENBQUEsUUFBQVcsRUFBQTtNQUQxQkMsRUFBQSxJQUFDLFdBQVcsQ0FDSCxLQUFpQixDQUFqQixDQUFBRCxFQUFnQixDQUFDLENBQ2pCRSxLQUFXLENBQVhBLENBVEdBLEVBU09BLENBQUMsQ0FDUixTQUFpQixDQUFqQixpQkFBaUIsQ0FDaEIsVUFBa0IsQ0FBbEIsa0JBQWtCLEdBQzdCO01BQUFiLENBQUEsTUFBQVcsRUFBQTtNQUFBWCxDQUFBLE1BQUFZLEVBQUE7SUFBQTtNQUFBQSxFQUFBLEdBQUFaLENBQUE7SUFBQTtJQUFBLElBQUFjLEVBQUE7SUFBQSxJQUFBZCxDQUFBLFFBQUFNLFFBQUE7TUFDRlEsRUFBQSxJQUFDLElBQUksQ0FBRVIsU0FBTyxDQUFFLEVBQWYsSUFBSSxDQUFrQjtNQUFBTixDQUFBLE1BQUFNLFFBQUE7TUFBQU4sQ0FBQSxNQUFBYyxFQUFBO0lBQUE7TUFBQUEsRUFBQSxHQUFBZCxDQUFBO0lBQUE7SUFBQSxJQUFBZSxFQUFBO0lBQUEsSUFBQWYsQ0FBQSxRQUFBWSxFQUFBLElBQUFaLENBQUEsU0FBQWMsRUFBQTtNQVB6QkMsRUFBQSxJQUFDLEdBQUcsQ0FBZSxhQUFLLENBQUwsS0FBSyxDQUFNLEdBQUMsQ0FBRCxHQUFDLENBQzdCLENBQUFILEVBS0MsQ0FDRCxDQUFBRSxFQUFzQixDQUN4QixFQVJDLEdBQUcsQ0FRRTtNQUFBZCxDQUFBLE1BQUFZLEVBQUE7TUFBQVosQ0FBQSxPQUFBYyxFQUFBO01BQUFkLENBQUEsT0FBQWUsRUFBQTtJQUFBO01BQUFBLEVBQUEsR0FBQWYsQ0FBQTtJQUFBO0lBQUEsSUFBQWdCLEVBQUE7SUFBQSxJQUFBaEIsQ0FBQSxTQUFBUyxPQUFBO01BQ0xPLEVBQUEsR0FBQVAsT0FBMEMsSUFBL0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFSLEtBQU8sQ0FBQyxDQUFFQSxRQUFNLENBQUUsRUFBdkIsSUFBSSxDQUEwQjtNQUFBVCxDQUFBLE9BQUFTLE9BQUE7TUFBQVQsQ0FBQSxPQUFBZ0IsRUFBQTtJQUFBO01BQUFBLEVBQUEsR0FBQWhCLENBQUE7SUFBQTtJQUFBLElBQUFpQixFQUFBO0lBQUEsSUFBQWpCLENBQUEsU0FBQVUsRUFBQSxJQUFBVixDQUFBLFNBQUFlLEVBQUEsSUFBQWYsQ0FBQSxTQUFBZ0IsRUFBQTtNQVg3Q0MsRUFBQSxJQUFDLEdBQUcsQ0FBZSxhQUFRLENBQVIsUUFBUSxDQUN6QixDQUFBUCxFQUF3QixDQUN4QixDQUFBSyxFQVFLLENBQ0osQ0FBQUMsRUFBeUMsQ0FDNUMsRUFaQyxHQUFHLENBWUU7TUFBQWhCLENBQUEsT0FBQVUsRUFBQTtNQUFBVixDQUFBLE9BQUFlLEVBQUE7TUFBQWYsQ0FBQSxPQUFBZ0IsRUFBQTtNQUFBaEIsQ0FBQSxPQUFBaUIsRUFBQTtJQUFBO01BQUFBLEVBQUEsR0FBQWpCLENBQUE7SUFBQTtJQUFBLE9BWk5pQixFQVlNO0VBQUE7SUFBQSxJQUFBUCxFQUFBO0lBQUEsSUFBQVYsQ0FBQSxTQUFBUCxLQUFBO01BTUZpQixFQUFBLElBQUMsSUFBSSxDQUFDLElBQUksQ0FBSixLQUFHLENBQUMsQ0FBRWpCLE1BQUksQ0FBRSxFQUFqQixJQUFJLENBQW9CO01BQUFPLENBQUEsT0FBQVAsS0FBQTtNQUFBTyxDQUFBLE9BQUFVLEVBQUE7SUFBQTtNQUFBQSxFQUFBLEdBQUFWLENBQUE7SUFBQTtJQUFBLElBQUFXLEVBQUE7SUFBQSxJQUFBWCxDQUFBLFNBQUFTLE9BQUE7TUFDeEJFLEVBQUEsR0FBQUYsT0FLQSxJQUxBLEVBRUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFOLElBQUksQ0FDTCxDQUFDLElBQUksQ0FBQyxRQUFRLENBQVIsS0FBTyxDQUFDLENBQUMsRUFBR0EsUUFBTSxDQUFFLEVBQXpCLElBQUksQ0FBNEIsR0FFcEM7TUFBQVQsQ0FBQSxPQUFBUyxPQUFBO01BQUFULENBQUEsT0FBQVcsRUFBQTtJQUFBO01BQUFBLEVBQUEsR0FBQVgsQ0FBQTtJQUFBO0lBQUEsSUFBQVksRUFBQTtJQUFBLElBQUFaLENBQUEsU0FBQVUsRUFBQSxJQUFBVixDQUFBLFNBQUFXLEVBQUE7TUFQSEMsRUFBQSxJQUFDLElBQUksQ0FDSCxDQUFBRixFQUF3QixDQUN2QixDQUFBQyxFQUtELENBQ0YsRUFSQyxJQUFJLENBUUU7TUFBQVgsQ0FBQSxPQUFBVSxFQUFBO01BQUFWLENBQUEsT0FBQVcsRUFBQTtNQUFBWCxDQUFBLE9BQUFZLEVBQUE7SUFBQTtNQUFBQSxFQUFBLEdBQUFaLENBQUE7SUFBQTtJQUVFLE1BQUFjLEVBQUEsR0FBQVYsV0FBVyxHQUFHLEdBQUc7SUFBQSxJQUFBVyxFQUFBO0lBQUEsSUFBQWYsQ0FBQSxTQUFBTCxRQUFBLElBQUFLLENBQUEsU0FBQWMsRUFBQTtNQUQxQkMsRUFBQSxJQUFDLFdBQVcsQ0FDSCxLQUFpQixDQUFqQixDQUFBRCxFQUFnQixDQUFDLENBQ2pCbkIsS0FBUSxDQUFSQSxTQUFPLENBQUMsQ0FDTCxTQUFpQixDQUFqQixpQkFBaUIsQ0FDaEIsVUFBa0IsQ0FBbEIsa0JBQWtCLEdBQzdCO01BQUFLLENBQUEsT0FBQUwsUUFBQTtNQUFBSyxDQUFBLE9BQUFjLEVBQUE7TUFBQWQsQ0FBQSxPQUFBZSxFQUFBO0lBQUE7TUFBQUEsRUFBQSxHQUFBZixDQUFBO0lBQUE7SUFBQSxJQUFBZ0IsRUFBQTtJQUFBLElBQUFoQixDQUFBLFNBQUFNLFFBQUE7TUFDRlUsRUFBQSxJQUFDLElBQUksQ0FBRVYsU0FBTyxDQUFFLEVBQWYsSUFBSSxDQUFrQjtNQUFBTixDQUFBLE9BQUFNLFFBQUE7TUFBQU4sQ0FBQSxPQUFBZ0IsRUFBQTtJQUFBO01BQUFBLEVBQUEsR0FBQWhCLENBQUE7SUFBQTtJQUFBLElBQUFpQixFQUFBO0lBQUEsSUFBQWpCLENBQUEsU0FBQVksRUFBQSxJQUFBWixDQUFBLFNBQUFlLEVBQUEsSUFBQWYsQ0FBQSxTQUFBZ0IsRUFBQTtNQWhCekJDLEVBQUEsSUFBQyxHQUFHLENBQWUsYUFBUSxDQUFSLFFBQVEsQ0FDekIsQ0FBQUwsRUFRTSxDQUNOLENBQUFHLEVBS0MsQ0FDRCxDQUFBQyxFQUFzQixDQUN4QixFQWpCQyxHQUFHLENBaUJFO01BQUFoQixDQUFBLE9BQUFZLEVBQUE7TUFBQVosQ0FBQSxPQUFBZSxFQUFBO01BQUFmLENBQUEsT0FBQWdCLEVBQUE7TUFBQWhCLENBQUEsT0FBQWlCLEVBQUE7SUFBQTtNQUFBQSxFQUFBLEdBQUFqQixDQUFBO0lBQUE7SUFBQSxPQWpCTmlCLEVBaUJNO0VBQUE7QUFFVDtBQUdILE9BQU8sU0FBU0MsS0FBS0EsQ0FBQSxDQUFFLEVBQUVqRCxLQUFLLENBQUNrRCxTQUFTLENBQUM7RUFDdkMsTUFBTSxDQUFDZixXQUFXLEVBQUVnQixjQUFjLENBQUMsR0FBR2pELFFBQVEsQ0FBQ1ksV0FBVyxHQUFHLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQztFQUN4RSxNQUFNLENBQUNzQyxLQUFLLEVBQUVDLFFBQVEsQ0FBQyxHQUFHbkQsUUFBUSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUM7RUFDdkQsTUFBTSxDQUFDb0QsU0FBUyxFQUFFQyxZQUFZLENBQUMsR0FBR3JELFFBQVEsQ0FBQyxJQUFJLENBQUM7RUFDaEQsTUFBTTtJQUFFc0Q7RUFBUSxDQUFDLEdBQUdqRCxlQUFlLENBQUMsQ0FBQztFQUVyQyxNQUFNa0QsY0FBYyxHQUFHRCxPQUFPLEdBQUcsQ0FBQyxFQUFDO0VBQ25DLE1BQU05QixRQUFRLEdBQUdZLElBQUksQ0FBQ29CLEdBQUcsQ0FBQ0QsY0FBYyxFQUFFLEVBQUUsQ0FBQztFQUU3QyxNQUFNRSxlQUFlLEdBQUczRCxLQUFLLENBQUM0RCxXQUFXLENBQUMsWUFBWTtJQUNwREwsWUFBWSxDQUFDLElBQUksQ0FBQztJQUNsQkYsUUFBUSxDQUFDLElBQUksQ0FBQztJQUNkLElBQUk7TUFDRixNQUFNUSxJQUFJLEdBQUcsTUFBTWpELGdCQUFnQixDQUFDLENBQUM7TUFDckN1QyxjQUFjLENBQUNVLElBQUksQ0FBQztJQUN0QixDQUFDLENBQUMsT0FBT0MsR0FBRyxFQUFFO01BQ1o5QyxRQUFRLENBQUM4QyxHQUFHLElBQUlDLEtBQUssQ0FBQztNQUN0QixNQUFNQyxVQUFVLEdBQUdGLEdBQUcsSUFBSTtRQUFFRyxRQUFRLENBQUMsRUFBRTtVQUFFSixJQUFJLENBQUMsRUFBRSxPQUFPO1FBQUMsQ0FBQztNQUFDLENBQUM7TUFDM0QsTUFBTUssWUFBWSxHQUFHRixVQUFVLENBQUNDLFFBQVEsRUFBRUosSUFBSSxHQUMxQzVDLGFBQWEsQ0FBQytDLFVBQVUsQ0FBQ0MsUUFBUSxDQUFDSixJQUFJLENBQUMsR0FDdkMzQixTQUFTO01BQ2JtQixRQUFRLENBQ05hLFlBQVksR0FDUiw4QkFBOEJBLFlBQVksRUFBRSxHQUM1QywyQkFDTixDQUFDO0lBQ0gsQ0FBQyxTQUFTO01BQ1JYLFlBQVksQ0FBQyxLQUFLLENBQUM7SUFDckI7RUFDRixDQUFDLEVBQUUsRUFBRSxDQUFDO0VBRU50RCxTQUFTLENBQUMsTUFBTTtJQUNkLEtBQUswRCxlQUFlLENBQUMsQ0FBQztFQUN4QixDQUFDLEVBQUUsQ0FBQ0EsZUFBZSxDQUFDLENBQUM7RUFFckJqRCxhQUFhLENBQ1gsZ0JBQWdCLEVBQ2hCLE1BQU07SUFDSixLQUFLaUQsZUFBZSxDQUFDLENBQUM7RUFDeEIsQ0FBQyxFQUNEO0lBQUVRLE9BQU8sRUFBRSxVQUFVO0lBQUVDLFFBQVEsRUFBRSxDQUFDLENBQUNoQixLQUFLLElBQUksQ0FBQ0U7RUFBVSxDQUN6RCxDQUFDO0VBRUQsSUFBSUYsS0FBSyxFQUFFO0lBQ1QsT0FDRSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6QyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDQSxLQUFLLENBQUMsRUFBRSxJQUFJO0FBQ2hELFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUTtBQUN0QixVQUFVLENBQUMsTUFBTTtBQUNqQixZQUFZLENBQUMsd0JBQXdCLENBQ3ZCLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FDdkIsT0FBTyxDQUFDLFVBQVUsQ0FDbEIsUUFBUSxDQUFDLEdBQUcsQ0FDWixXQUFXLENBQUMsT0FBTztBQUVqQyxZQUFZLENBQUMsd0JBQXdCLENBQ3ZCLE1BQU0sQ0FBQyxZQUFZLENBQ25CLE9BQU8sQ0FBQyxVQUFVLENBQ2xCLFFBQVEsQ0FBQyxLQUFLLENBQ2QsV0FBVyxDQUFDLFFBQVE7QUFFbEMsVUFBVSxFQUFFLE1BQU07QUFDbEIsUUFBUSxFQUFFLElBQUk7QUFDZCxNQUFNLEVBQUUsR0FBRyxDQUFDO0VBRVY7RUFFQSxJQUFJLENBQUNqQixXQUFXLEVBQUU7SUFDaEIsT0FDRSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6QyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsRUFBRSxJQUFJO0FBQ2hELFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUTtBQUN0QixVQUFVLENBQUMsd0JBQXdCLENBQ3ZCLE1BQU0sQ0FBQyxZQUFZLENBQ25CLE9BQU8sQ0FBQyxVQUFVLENBQ2xCLFFBQVEsQ0FBQyxLQUFLLENBQ2QsV0FBVyxDQUFDLFFBQVE7QUFFaEMsUUFBUSxFQUFFLElBQUk7QUFDZCxNQUFNLEVBQUUsR0FBRyxDQUFDO0VBRVY7O0VBRUE7RUFDQTtFQUNBO0VBQ0E7RUFDQSxNQUFNa0MsZ0JBQWdCLEdBQUcvRCxtQkFBbUIsQ0FBQyxDQUFDO0VBQzlDLE1BQU1nRSxhQUFhLEdBQ2pCRCxnQkFBZ0IsS0FBSyxLQUFLLElBQzFCQSxnQkFBZ0IsS0FBSyxNQUFNLElBQzNCQSxnQkFBZ0IsS0FBSyxJQUFJO0VBRTNCLE1BQU1FLE1BQU0sR0FBRyxDQUNiO0lBQ0UvQyxLQUFLLEVBQUUsaUJBQWlCO0lBQ3hCQyxLQUFLLEVBQUVVLFdBQVcsQ0FBQ3FDO0VBQ3JCLENBQUMsRUFDRDtJQUNFaEQsS0FBSyxFQUFFLDJCQUEyQjtJQUNsQ0MsS0FBSyxFQUFFVSxXQUFXLENBQUNzQztFQUNyQixDQUFDLEVBQ0QsSUFBSUgsYUFBYSxHQUNiLENBQ0U7SUFDRTlDLEtBQUssRUFBRSw0QkFBNEI7SUFDbkNDLEtBQUssRUFBRVUsV0FBVyxDQUFDdUM7RUFDckIsQ0FBQyxDQUNGLEdBQ0QsRUFBRSxDQUFDLENBQ1I7RUFFRCxPQUNFLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU07QUFDcEQsTUFBTSxDQUFDSCxNQUFNLENBQUNJLElBQUksQ0FBQyxDQUFDO01BQUVsRDtJQUFNLENBQUMsS0FBS0EsS0FBSyxDQUFDLElBQ2hDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxnREFBZ0QsRUFBRSxJQUFJLENBQ3RFO0FBQ1A7QUFDQSxNQUFNLENBQUM4QyxNQUFNLENBQUNLLEdBQUcsQ0FDVCxDQUFDO01BQUVwRCxLQUFLO01BQUVDLEtBQUssRUFBTEE7SUFBTSxDQUFDLEtBQ2ZBLE9BQUssSUFDSCxDQUFDLFFBQVEsQ0FDUCxHQUFHLENBQUMsQ0FBQ0QsS0FBSyxDQUFDLENBQ1gsS0FBSyxDQUFDLENBQUNBLEtBQUssQ0FBQyxDQUNiLEtBQUssQ0FBQyxDQUFDQyxPQUFLLENBQUMsQ0FDYixRQUFRLENBQUMsQ0FBQ0MsUUFBUSxDQUFDLEdBRzNCLENBQUM7QUFDUDtBQUNBLE1BQU0sQ0FBQ1MsV0FBVyxDQUFDMEMsV0FBVyxJQUN0QixDQUFDLGlCQUFpQixDQUNoQixVQUFVLENBQUMsQ0FBQzFDLFdBQVcsQ0FBQzBDLFdBQVcsQ0FBQyxDQUNwQyxRQUFRLENBQUMsQ0FBQ25ELFFBQVEsQ0FBQyxHQUV0QjtBQUNQO0FBQ0EsTUFBTSxDQUFDTCwrQkFBK0IsQ0FBQyxDQUFDLElBQ2hDLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLENBQUNLLFFBQVEsQ0FBQyxHQUN6QztBQUNQO0FBQ0EsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRO0FBQ3BCLFFBQVEsQ0FBQyx3QkFBd0IsQ0FDdkIsTUFBTSxDQUFDLFlBQVksQ0FDbkIsT0FBTyxDQUFDLFVBQVUsQ0FDbEIsUUFBUSxDQUFDLEtBQUssQ0FDZCxXQUFXLENBQUMsUUFBUTtBQUU5QixNQUFNLEVBQUUsSUFBSTtBQUNaLElBQUksRUFBRSxHQUFHLENBQUM7QUFFVjtBQUVBLEtBQUtvRCxzQkFBc0IsR0FBRztFQUM1QjNFLFVBQVUsRUFBRVEsVUFBVTtFQUN0QmUsUUFBUSxFQUFFLE1BQU07QUFDbEIsQ0FBQztBQUVELE1BQU1xRCx5QkFBeUIsR0FBRyxhQUFhO0FBRS9DLFNBQUFDLGtCQUFBbEQsRUFBQTtFQUFBLE1BQUFDLENBQUEsR0FBQUMsRUFBQTtFQUEyQjtJQUFBN0IsVUFBQTtJQUFBdUI7RUFBQSxJQUFBSSxFQUdGO0VBQ3ZCLE1BQUF1QyxnQkFBQSxHQUF5Qi9ELG1CQUFtQixDQUFDLENBQUM7RUFDOUMsTUFBQTJFLFVBQUEsR0FBbUJaLGdCQUFnQixLQUFLLEtBQW1DLElBQTFCQSxnQkFBZ0IsS0FBSyxLQUFLO0VBQzNFLElBQUksQ0FBQ1ksVUFBVTtJQUFBLE9BRU4sS0FBSztFQUFBO0VBR2QsSUFBSSxDQUFDOUUsVUFBVSxDQUFBK0UsVUFBVztJQUN4QixJQUFJOUUsaUJBQWlCLENBQUErRSxTQUFVLENBQUMsQ0FBQztNQUFBLElBQUFsRCxFQUFBO01BQUEsSUFBQUYsQ0FBQSxRQUFBcUQsTUFBQSxDQUFBQyxHQUFBO1FBRTdCcEQsRUFBQSxJQUFDLEdBQUcsQ0FBZSxhQUFRLENBQVIsUUFBUSxDQUN6QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUosS0FBRyxDQUFDLENBQUU4QywwQkFBd0IsQ0FBRSxFQUFyQyxJQUFJLENBQ0wsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFSLEtBQU8sQ0FBQyxDQUFDLGdEQUFnRCxFQUE5RCxJQUFJLENBQ1AsRUFIQyxHQUFHLENBR0U7UUFBQWhELENBQUEsTUFBQUUsRUFBQTtNQUFBO1FBQUFBLEVBQUEsR0FBQUYsQ0FBQTtNQUFBO01BQUEsT0FITkUsRUFHTTtJQUFBO0lBRVQsT0FFTSxJQUFJO0VBQUE7RUFHYixJQUFJOUIsVUFBVSxDQUFBbUYsYUFBYyxLQUFLLElBQUk7SUFBQSxJQUFBckQsRUFBQTtJQUFBLElBQUFGLENBQUEsUUFBQXFELE1BQUEsQ0FBQUMsR0FBQTtNQUVqQ3BELEVBQUEsSUFBQyxHQUFHLENBQWUsYUFBUSxDQUFSLFFBQVEsQ0FDekIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFKLEtBQUcsQ0FBQyxDQUFFOEMsMEJBQXdCLENBQUUsRUFBckMsSUFBSSxDQUNMLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBUixLQUFPLENBQUMsQ0FBQyxTQUFTLEVBQXZCLElBQUksQ0FDUCxFQUhDLEdBQUcsQ0FHRTtNQUFBaEQsQ0FBQSxNQUFBRSxFQUFBO0lBQUE7TUFBQUEsRUFBQSxHQUFBRixDQUFBO0lBQUE7SUFBQSxPQUhORSxFQUdNO0VBQUE7RUFJVixJQUNFLE9BQU85QixVQUFVLENBQUFvRixZQUFhLEtBQUssUUFDTyxJQUExQyxPQUFPcEYsVUFBVSxDQUFBZ0MsV0FBWSxLQUFLLFFBQVE7SUFBQSxPQUVuQyxJQUFJO0VBQUE7RUFHMkIsTUFBQUYsRUFBQSxHQUFBOUIsVUFBVSxDQUFBb0YsWUFBYSxHQUFHLEdBQUc7RUFBQSxJQUFBOUMsRUFBQTtFQUFBLElBQUFWLENBQUEsUUFBQUUsRUFBQTtJQUF4Q1EsRUFBQSxHQUFBcEMsVUFBVSxDQUFDNEIsRUFBNkIsRUFBRSxDQUFDLENBQUM7SUFBQUYsQ0FBQSxNQUFBRSxFQUFBO0lBQUFGLENBQUEsTUFBQVUsRUFBQTtFQUFBO0lBQUFBLEVBQUEsR0FBQVYsQ0FBQTtFQUFBO0VBQXpFLE1BQUF5RCxvQkFBQSxHQUE2Qi9DLEVBQTRDO0VBQ2hDLE1BQUFDLEVBQUEsR0FBQXZDLFVBQVUsQ0FBQW1GLGFBQWMsR0FBRyxHQUFHO0VBQUEsSUFBQTNDLEVBQUE7RUFBQSxJQUFBWixDQUFBLFFBQUFXLEVBQUE7SUFBekNDLEVBQUEsR0FBQXRDLFVBQVUsQ0FBQ3FDLEVBQThCLEVBQUUsQ0FBQyxDQUFDO0lBQUFYLENBQUEsTUFBQVcsRUFBQTtJQUFBWCxDQUFBLE1BQUFZLEVBQUE7RUFBQTtJQUFBQSxFQUFBLEdBQUFaLENBQUE7RUFBQTtFQUEzRSxNQUFBMEQscUJBQUEsR0FBOEI5QyxFQUE2QztFQUFBLElBQUErQyxFQUFBO0VBQUEsSUFBQTdDLEVBQUE7RUFBQSxJQUFBQyxFQUFBO0VBQUEsSUFBQUMsRUFBQTtFQUFBLElBQUFoQixDQUFBLFFBQUE1QixVQUFBLENBQUFnQyxXQUFBO0lBQzNFLE1BQUF3RCxHQUFBLEdBQVksSUFBSUMsSUFBSSxDQUFDLENBQUM7SUFDdEIsTUFBQUMsYUFBQSxHQUFzQixJQUFJRCxJQUFJLENBQUNELEdBQUcsQ0FBQUcsV0FBWSxDQUFDLENBQUMsRUFBRUgsR0FBRyxDQUFBSSxRQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7SUFHckVMLEVBQUEsR0FBQTdELFFBQVE7SUFDQWtELEVBQUEsQ0FBQUEsQ0FBQSxDQUFBQSx5QkFBeUI7SUFFakJsQyxFQUFBLEdBQUExQyxVQUFVLENBQUFnQyxXQUFZO0lBRXhCVyxFQUFBLEdBQUErQyxhQUFhLENBQUFHLFdBQVksQ0FBQyxDQUFDO0lBQUFqRSxDQUFBLE1BQUE1QixVQUFBLENBQUFnQyxXQUFBO0lBQUFKLENBQUEsTUFBQTJELEVBQUE7SUFBQTNELENBQUEsTUFBQWMsRUFBQTtJQUFBZCxDQUFBLE1BQUFlLEVBQUE7SUFBQWYsQ0FBQSxPQUFBZ0IsRUFBQTtFQUFBO0lBQUEyQyxFQUFBLEdBQUEzRCxDQUFBO0lBQUFjLEVBQUEsR0FBQWQsQ0FBQTtJQUFBZSxFQUFBLEdBQUFmLENBQUE7SUFBQWdCLEVBQUEsR0FBQWhCLENBQUE7RUFBQTtFQUFBLElBQUFpQixFQUFBO0VBQUEsSUFBQWpCLENBQUEsU0FBQWMsRUFBQSxJQUFBZCxDQUFBLFNBQUFlLEVBQUE7SUFIakNFLEVBQUE7TUFBQWIsV0FBQSxFQUNRVSxFQUFzQjtNQUFBVCxTQUFBLEVBRXhCVTtJQUNiLENBQUM7SUFBQWYsQ0FBQSxPQUFBYyxFQUFBO0lBQUFkLENBQUEsT0FBQWUsRUFBQTtJQUFBZixDQUFBLE9BQUFpQixFQUFBO0VBQUE7SUFBQUEsRUFBQSxHQUFBakIsQ0FBQTtFQUFBO0VBRWEsTUFBQWtFLEVBQUEsTUFBR1Qsb0JBQW9CLE1BQU1DLHFCQUFxQixRQUFRO0VBQUEsSUFBQVMsR0FBQTtFQUFBLElBQUFuRSxDQUFBLFNBQUEyRCxFQUFBLElBQUEzRCxDQUFBLFNBQUFMLFFBQUEsSUFBQUssQ0FBQSxTQUFBZ0IsRUFBQSxJQUFBaEIsQ0FBQSxTQUFBaUIsRUFBQSxJQUFBakIsQ0FBQSxTQUFBa0UsRUFBQTtJQVIxRUMsR0FBQSxJQUFDLEVBQVEsQ0FDQW5CLEtBQXlCLENBQXpCQSxHQUF3QixDQUFDLENBQ3pCLEtBSU4sQ0FKTSxDQUFBL0IsRUFJUCxDQUFDLENBQ2dCLGVBQUssQ0FBTCxNQUFJLENBQUMsQ0FDUixZQUEwRCxDQUExRCxDQUFBaUQsRUFBeUQsQ0FBQyxDQUM5RHZFLFFBQVEsQ0FBUkEsU0FBTyxDQUFDLEdBQ2xCO0lBQUFLLENBQUEsT0FBQTJELEVBQUE7SUFBQTNELENBQUEsT0FBQUwsUUFBQTtJQUFBSyxDQUFBLE9BQUFnQixFQUFBO0lBQUFoQixDQUFBLE9BQUFpQixFQUFBO0lBQUFqQixDQUFBLE9BQUFrRSxFQUFBO0lBQUFsRSxDQUFBLE9BQUFtRSxHQUFBO0VBQUE7SUFBQUEsR0FBQSxHQUFBbkUsQ0FBQTtFQUFBO0VBQUEsT0FWRm1FLEdBVUU7QUFBQSIsImlnbm9yZUxpc3QiOltdfQ==