├── logo-16.png ├── logo-32.png ├── logo-48.png ├── logo-128.png ├── manifest.json ├── README.md ├── options.js ├── options.html ├── styles.css ├── content.bundle.js └── background.bundle.js /logo-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sabber-slt/fact-yab/HEAD/logo-16.png -------------------------------------------------------------------------------- /logo-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sabber-slt/fact-yab/HEAD/logo-32.png -------------------------------------------------------------------------------- /logo-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sabber-slt/fact-yab/HEAD/logo-48.png -------------------------------------------------------------------------------- /logo-128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sabber-slt/fact-yab/HEAD/logo-128.png -------------------------------------------------------------------------------- /manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Fact Yab", 3 | "description": "Fact Yab is a Chrome extension that uses OpenAI's GPT-3 to check the tweets facts.", 4 | "version": "0.0.1", 5 | "manifest_version": 3, 6 | "homepage_url": "https://github.com/sabber-slt/fact-yab", 7 | "action": {}, 8 | "permissions": ["scripting", "activeTab", "storage", "clipboardWrite"], 9 | "options_ui": { 10 | "page": "options.html", 11 | "open_in_tab": false 12 | }, 13 | "icons": { 14 | "16": "logo-16.png", 15 | "32": "logo-32.png", 16 | "48": "logo-48.png", 17 | "128": "logo-128.png" 18 | }, 19 | "host_permissions": ["https://*.openai.com/"], 20 | "background": { 21 | "service_worker": "background.bundle.js" 22 | }, 23 | 24 | "web_accessible_resources": [ 25 | { 26 | "resources": ["styles.css"], 27 | "matches": [""] 28 | } 29 | ] 30 | } 31 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Fact-Yab Chrome Extension 2 | 3 | ## Description 4 | 5 | This is a Chrome browser extension that allows users to fact-check tweets simply by hovering the mouse over them. This extension aims to provide users with quick and easy access to factual information about the content of tweets, helping them discern accurate information from potentially misleading or false claims. 6 | 7 | ![Fact Checker Screenshot](https://res.cloudinary.com/dcxu5wipn/image/upload/v1690779736/Screenshot_85_g6yukc.png) 8 | 9 | ## Features 10 | 11 | - **Hover Fact-Checking**: Enables users to verify the accuracy of tweets by hovering their mouse pointer over them. The extension will display relevant fact-check information in a non-intrusive way. 12 | 13 | ## Installation 14 | 15 | To install the Fact Checker Chrome extension, follow these steps: 16 | 17 | 1. Clone the repository or download the latest release package. 18 | 19 | 2. Open the Chrome browser and navigate to `chrome://extensions`. 20 | 21 | 3. Enable Developer Mode by toggling the switch in the top-right corner of the page. 22 | 23 | 4. Click on the "Load unpacked" button and select the folder containing the extension files. 24 | 25 | 5. The Fact Checker extension will now be added to your Chrome browser. 26 | -------------------------------------------------------------------------------- /options.js: -------------------------------------------------------------------------------- 1 | const defaultPrompt="Is the following statement true, false, or uncertain? answer in persian",defaultAPIKey="";function show_save_status(){var e=document.getElementById("status");e.textContent="Options saved.",setTimeout((function(){e.textContent=""}),750)}function save_options(){var e=document.getElementById("prompt").value,t=document.getElementById("apiKey").value;chrome.storage.sync.set({prompt:e,apiKey:t},show_save_status)}function restore_options(){chrome.storage.sync.set({prompt:defaultPrompt,apiKey:""},(function(){document.getElementById("prompt").value=defaultPrompt,document.getElementById("apiKey").value="",show_save_status()}))}chrome.storage.sync.get("prompt",(function(e){e.prompt?document.getElementById("prompt").value=e.prompt:document.getElementById("prompt").value=defaultPrompt})),chrome.storage.sync.get("apiKey",(function(e){e.apiKey?document.getElementById("apiKey").value=e.apiKey:document.getElementById("apiKey").value=""})),chrome.storage.sync.get({prompt:defaultPrompt},(function(e){document.getElementById("prompt").value=e.prompt})),chrome.storage.sync.get({apiKey:""},(function(e){document.getElementById("apiKey").value=e.apiKey})),document.getElementById("saveButton").addEventListener("click",save_options),document.getElementById("resetButton").addEventListener("click",restore_options); -------------------------------------------------------------------------------- /options.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Fact Yab 5 | 63 | 64 | 65 |

Fact Yab

66 |
67 | 68 | 69 | 70 | 71 |
72 | 73 | 74 |
75 |
76 | 77 | 78 | 79 | -------------------------------------------------------------------------------- /styles.css: -------------------------------------------------------------------------------- 1 | /* 2 | ! tailwindcss v3.3.3 | MIT License | https://tailwindcss.com 3 | */ 4 | 5 | /* 6 | 1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) 7 | 2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) 8 | */ 9 | 10 | *, 11 | ::before, 12 | ::after { 13 | box-sizing: border-box; 14 | /* 1 */ 15 | border-width: 0; 16 | /* 2 */ 17 | border-style: solid; 18 | /* 2 */ 19 | border-color: #e5e7eb; 20 | /* 2 */ 21 | } 22 | 23 | ::before, 24 | ::after { 25 | --tw-content: ''; 26 | } 27 | 28 | /* 29 | 1. Use a consistent sensible line-height in all browsers. 30 | 2. Prevent adjustments of font size after orientation changes in iOS. 31 | 3. Use a more readable tab size. 32 | 4. Use the user's configured `sans` font-family by default. 33 | 5. Use the user's configured `sans` font-feature-settings by default. 34 | 6. Use the user's configured `sans` font-variation-settings by default. 35 | */ 36 | 37 | html { 38 | line-height: 1.5; 39 | /* 1 */ 40 | -webkit-text-size-adjust: 100%; 41 | /* 2 */ 42 | -moz-tab-size: 4; 43 | /* 3 */ 44 | -o-tab-size: 4; 45 | tab-size: 4; 46 | /* 3 */ 47 | font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; 48 | /* 4 */ 49 | font-feature-settings: normal; 50 | /* 5 */ 51 | font-variation-settings: normal; 52 | /* 6 */ 53 | } 54 | 55 | /* 56 | 1. Remove the margin in all browsers. 57 | 2. Inherit line-height from `html` so users can set them as a class directly on the `html` element. 58 | */ 59 | 60 | body { 61 | margin: 0; 62 | /* 1 */ 63 | line-height: inherit; 64 | /* 2 */ 65 | } 66 | 67 | /* 68 | 1. Add the correct height in Firefox. 69 | 2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) 70 | 3. Ensure horizontal rules are visible by default. 71 | */ 72 | 73 | hr { 74 | height: 0; 75 | /* 1 */ 76 | color: inherit; 77 | /* 2 */ 78 | border-top-width: 1px; 79 | /* 3 */ 80 | } 81 | 82 | /* 83 | Add the correct text decoration in Chrome, Edge, and Safari. 84 | */ 85 | 86 | abbr:where([title]) { 87 | -webkit-text-decoration: underline dotted; 88 | text-decoration: underline dotted; 89 | } 90 | 91 | /* 92 | Remove the default font size and weight for headings. 93 | */ 94 | 95 | h1, 96 | h2, 97 | h3, 98 | h4, 99 | h5, 100 | h6 { 101 | font-size: inherit; 102 | font-weight: inherit; 103 | } 104 | 105 | /* 106 | Reset links to optimize for opt-in styling instead of opt-out. 107 | */ 108 | 109 | a { 110 | color: inherit; 111 | text-decoration: inherit; 112 | } 113 | 114 | /* 115 | Add the correct font weight in Edge and Safari. 116 | */ 117 | 118 | b, 119 | strong { 120 | font-weight: bolder; 121 | } 122 | 123 | /* 124 | 1. Use the user's configured `mono` font family by default. 125 | 2. Correct the odd `em` font sizing in all browsers. 126 | */ 127 | 128 | code, 129 | kbd, 130 | samp, 131 | pre { 132 | font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; 133 | /* 1 */ 134 | font-size: 1em; 135 | /* 2 */ 136 | } 137 | 138 | /* 139 | Add the correct font size in all browsers. 140 | */ 141 | 142 | small { 143 | font-size: 80%; 144 | } 145 | 146 | /* 147 | Prevent `sub` and `sup` elements from affecting the line height in all browsers. 148 | */ 149 | 150 | sub, 151 | sup { 152 | font-size: 75%; 153 | line-height: 0; 154 | position: relative; 155 | vertical-align: baseline; 156 | } 157 | 158 | sub { 159 | bottom: -0.25em; 160 | } 161 | 162 | sup { 163 | top: -0.5em; 164 | } 165 | 166 | /* 167 | 1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) 168 | 2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) 169 | 3. Remove gaps between table borders by default. 170 | */ 171 | 172 | table { 173 | text-indent: 0; 174 | /* 1 */ 175 | border-color: inherit; 176 | /* 2 */ 177 | border-collapse: collapse; 178 | /* 3 */ 179 | } 180 | 181 | /* 182 | 1. Change the font styles in all browsers. 183 | 2. Remove the margin in Firefox and Safari. 184 | 3. Remove default padding in all browsers. 185 | */ 186 | 187 | button, 188 | input, 189 | optgroup, 190 | select, 191 | textarea { 192 | font-family: inherit; 193 | /* 1 */ 194 | font-feature-settings: inherit; 195 | /* 1 */ 196 | font-variation-settings: inherit; 197 | /* 1 */ 198 | font-size: 100%; 199 | /* 1 */ 200 | font-weight: inherit; 201 | /* 1 */ 202 | line-height: inherit; 203 | /* 1 */ 204 | color: inherit; 205 | /* 1 */ 206 | margin: 0; 207 | /* 2 */ 208 | padding: 0; 209 | /* 3 */ 210 | } 211 | 212 | /* 213 | Remove the inheritance of text transform in Edge and Firefox. 214 | */ 215 | 216 | button, 217 | select { 218 | text-transform: none; 219 | } 220 | 221 | /* 222 | 1. Correct the inability to style clickable types in iOS and Safari. 223 | 2. Remove default button styles. 224 | */ 225 | 226 | button, 227 | [type='button'], 228 | [type='reset'], 229 | [type='submit'] { 230 | -webkit-appearance: button; 231 | /* 1 */ 232 | background-color: transparent; 233 | /* 2 */ 234 | background-image: none; 235 | /* 2 */ 236 | } 237 | 238 | /* 239 | Use the modern Firefox focus style for all focusable elements. 240 | */ 241 | 242 | :-moz-focusring { 243 | outline: auto; 244 | } 245 | 246 | /* 247 | Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) 248 | */ 249 | 250 | :-moz-ui-invalid { 251 | box-shadow: none; 252 | } 253 | 254 | /* 255 | Add the correct vertical alignment in Chrome and Firefox. 256 | */ 257 | 258 | progress { 259 | vertical-align: baseline; 260 | } 261 | 262 | /* 263 | Correct the cursor style of increment and decrement buttons in Safari. 264 | */ 265 | 266 | ::-webkit-inner-spin-button, 267 | ::-webkit-outer-spin-button { 268 | height: auto; 269 | } 270 | 271 | /* 272 | 1. Correct the odd appearance in Chrome and Safari. 273 | 2. Correct the outline style in Safari. 274 | */ 275 | 276 | [type='search'] { 277 | -webkit-appearance: textfield; 278 | /* 1 */ 279 | outline-offset: -2px; 280 | /* 2 */ 281 | } 282 | 283 | /* 284 | Remove the inner padding in Chrome and Safari on macOS. 285 | */ 286 | 287 | ::-webkit-search-decoration { 288 | -webkit-appearance: none; 289 | } 290 | 291 | /* 292 | 1. Correct the inability to style clickable types in iOS and Safari. 293 | 2. Change font properties to `inherit` in Safari. 294 | */ 295 | 296 | ::-webkit-file-upload-button { 297 | -webkit-appearance: button; 298 | /* 1 */ 299 | font: inherit; 300 | /* 2 */ 301 | } 302 | 303 | /* 304 | Add the correct display in Chrome and Safari. 305 | */ 306 | 307 | summary { 308 | display: list-item; 309 | } 310 | 311 | /* 312 | Removes the default spacing and border for appropriate elements. 313 | */ 314 | 315 | blockquote, 316 | dl, 317 | dd, 318 | h1, 319 | h2, 320 | h3, 321 | h4, 322 | h5, 323 | h6, 324 | hr, 325 | figure, 326 | p, 327 | pre { 328 | margin: 0; 329 | } 330 | 331 | fieldset { 332 | margin: 0; 333 | padding: 0; 334 | } 335 | 336 | legend { 337 | padding: 0; 338 | } 339 | 340 | ol, 341 | ul, 342 | menu { 343 | list-style: none; 344 | margin: 0; 345 | padding: 0; 346 | } 347 | 348 | /* 349 | Reset default styling for dialogs. 350 | */ 351 | 352 | dialog { 353 | padding: 0; 354 | } 355 | 356 | /* 357 | Prevent resizing textareas horizontally by default. 358 | */ 359 | 360 | textarea { 361 | resize: vertical; 362 | } 363 | 364 | /* 365 | 1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) 366 | 2. Set the default placeholder color to the user's configured gray 400 color. 367 | */ 368 | 369 | input::-moz-placeholder, textarea::-moz-placeholder { 370 | opacity: 1; 371 | /* 1 */ 372 | color: #9ca3af; 373 | /* 2 */ 374 | } 375 | 376 | input::placeholder, 377 | textarea::placeholder { 378 | opacity: 1; 379 | /* 1 */ 380 | color: #9ca3af; 381 | /* 2 */ 382 | } 383 | 384 | /* 385 | Set the default cursor for buttons. 386 | */ 387 | 388 | button, 389 | [role="button"] { 390 | cursor: pointer; 391 | } 392 | 393 | /* 394 | Make sure disabled buttons don't get the pointer cursor. 395 | */ 396 | 397 | :disabled { 398 | cursor: default; 399 | } 400 | 401 | /* 402 | 1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14) 403 | 2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) 404 | This can trigger a poorly considered lint error in some tools but is included by design. 405 | */ 406 | 407 | img, 408 | svg, 409 | video, 410 | canvas, 411 | audio, 412 | iframe, 413 | embed, 414 | object { 415 | display: block; 416 | /* 1 */ 417 | vertical-align: middle; 418 | /* 2 */ 419 | } 420 | 421 | /* 422 | Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) 423 | */ 424 | 425 | img, 426 | video { 427 | max-width: 100%; 428 | height: auto; 429 | } 430 | 431 | /* Make elements with the HTML hidden attribute stay hidden by default */ 432 | 433 | [hidden] { 434 | display: none; 435 | } 436 | 437 | *, ::before, ::after { 438 | --tw-border-spacing-x: 0; 439 | --tw-border-spacing-y: 0; 440 | --tw-translate-x: 0; 441 | --tw-translate-y: 0; 442 | --tw-rotate: 0; 443 | --tw-skew-x: 0; 444 | --tw-skew-y: 0; 445 | --tw-scale-x: 1; 446 | --tw-scale-y: 1; 447 | --tw-pan-x: ; 448 | --tw-pan-y: ; 449 | --tw-pinch-zoom: ; 450 | --tw-scroll-snap-strictness: proximity; 451 | --tw-gradient-from-position: ; 452 | --tw-gradient-via-position: ; 453 | --tw-gradient-to-position: ; 454 | --tw-ordinal: ; 455 | --tw-slashed-zero: ; 456 | --tw-numeric-figure: ; 457 | --tw-numeric-spacing: ; 458 | --tw-numeric-fraction: ; 459 | --tw-ring-inset: ; 460 | --tw-ring-offset-width: 0px; 461 | --tw-ring-offset-color: #fff; 462 | --tw-ring-color: rgb(59 130 246 / 0.5); 463 | --tw-ring-offset-shadow: 0 0 #0000; 464 | --tw-ring-shadow: 0 0 #0000; 465 | --tw-shadow: 0 0 #0000; 466 | --tw-shadow-colored: 0 0 #0000; 467 | --tw-blur: ; 468 | --tw-brightness: ; 469 | --tw-contrast: ; 470 | --tw-grayscale: ; 471 | --tw-hue-rotate: ; 472 | --tw-invert: ; 473 | --tw-saturate: ; 474 | --tw-sepia: ; 475 | --tw-drop-shadow: ; 476 | --tw-backdrop-blur: ; 477 | --tw-backdrop-brightness: ; 478 | --tw-backdrop-contrast: ; 479 | --tw-backdrop-grayscale: ; 480 | --tw-backdrop-hue-rotate: ; 481 | --tw-backdrop-invert: ; 482 | --tw-backdrop-opacity: ; 483 | --tw-backdrop-saturate: ; 484 | --tw-backdrop-sepia: ; 485 | } 486 | 487 | ::backdrop { 488 | --tw-border-spacing-x: 0; 489 | --tw-border-spacing-y: 0; 490 | --tw-translate-x: 0; 491 | --tw-translate-y: 0; 492 | --tw-rotate: 0; 493 | --tw-skew-x: 0; 494 | --tw-skew-y: 0; 495 | --tw-scale-x: 1; 496 | --tw-scale-y: 1; 497 | --tw-pan-x: ; 498 | --tw-pan-y: ; 499 | --tw-pinch-zoom: ; 500 | --tw-scroll-snap-strictness: proximity; 501 | --tw-gradient-from-position: ; 502 | --tw-gradient-via-position: ; 503 | --tw-gradient-to-position: ; 504 | --tw-ordinal: ; 505 | --tw-slashed-zero: ; 506 | --tw-numeric-figure: ; 507 | --tw-numeric-spacing: ; 508 | --tw-numeric-fraction: ; 509 | --tw-ring-inset: ; 510 | --tw-ring-offset-width: 0px; 511 | --tw-ring-offset-color: #fff; 512 | --tw-ring-color: rgb(59 130 246 / 0.5); 513 | --tw-ring-offset-shadow: 0 0 #0000; 514 | --tw-ring-shadow: 0 0 #0000; 515 | --tw-shadow: 0 0 #0000; 516 | --tw-shadow-colored: 0 0 #0000; 517 | --tw-blur: ; 518 | --tw-brightness: ; 519 | --tw-contrast: ; 520 | --tw-grayscale: ; 521 | --tw-hue-rotate: ; 522 | --tw-invert: ; 523 | --tw-saturate: ; 524 | --tw-sepia: ; 525 | --tw-drop-shadow: ; 526 | --tw-backdrop-blur: ; 527 | --tw-backdrop-brightness: ; 528 | --tw-backdrop-contrast: ; 529 | --tw-backdrop-grayscale: ; 530 | --tw-backdrop-hue-rotate: ; 531 | --tw-backdrop-invert: ; 532 | --tw-backdrop-opacity: ; 533 | --tw-backdrop-saturate: ; 534 | --tw-backdrop-sepia: ; 535 | } 536 | 537 | .container { 538 | width: 100%; 539 | } 540 | 541 | @media (min-width: 640px) { 542 | .container { 543 | max-width: 640px; 544 | } 545 | } 546 | 547 | @media (min-width: 768px) { 548 | .container { 549 | max-width: 768px; 550 | } 551 | } 552 | 553 | @media (min-width: 1024px) { 554 | .container { 555 | max-width: 1024px; 556 | } 557 | } 558 | 559 | @media (min-width: 1280px) { 560 | .container { 561 | max-width: 1280px; 562 | } 563 | } 564 | 565 | @media (min-width: 1536px) { 566 | .container { 567 | max-width: 1536px; 568 | } 569 | } 570 | 571 | .visible { 572 | visibility: visible; 573 | } 574 | 575 | .fixed { 576 | position: fixed; 577 | } 578 | 579 | .right-4 { 580 | right: 1rem; 581 | } 582 | 583 | .top-8 { 584 | top: 2rem; 585 | } 586 | 587 | .flex { 588 | display: flex; 589 | } 590 | 591 | .hidden { 592 | display: none; 593 | } 594 | 595 | .h-1 { 596 | height: 0.25rem; 597 | } 598 | 599 | .h-\[24px\] { 600 | height: 24px; 601 | } 602 | 603 | .h-\[40px\] { 604 | height: 40px; 605 | } 606 | 607 | .h-full { 608 | height: 100%; 609 | } 610 | 611 | .max-h-\[80\%\] { 612 | max-height: 80%; 613 | } 614 | 615 | .w-6 { 616 | width: 1.5rem; 617 | } 618 | 619 | .w-full { 620 | width: 100%; 621 | } 622 | 623 | .min-w-\[30\%\] { 624 | min-width: 30%; 625 | } 626 | 627 | .max-w-\[30\%\] { 628 | max-width: 30%; 629 | } 630 | 631 | .cursor-pointer { 632 | cursor: pointer; 633 | } 634 | 635 | .flex-col { 636 | flex-direction: column; 637 | } 638 | 639 | .items-center { 640 | align-items: center; 641 | } 642 | 643 | .justify-center { 644 | justify-content: center; 645 | } 646 | 647 | .justify-between { 648 | justify-content: space-between; 649 | } 650 | 651 | .overflow-y-auto { 652 | overflow-y: auto; 653 | } 654 | 655 | .whitespace-nowrap { 656 | white-space: nowrap; 657 | } 658 | 659 | .whitespace-pre-line { 660 | white-space: pre-line; 661 | } 662 | 663 | .rounded-lg { 664 | border-radius: 0.5rem; 665 | } 666 | 667 | .rounded-t-lg { 668 | border-top-left-radius: 0.5rem; 669 | border-top-right-radius: 0.5rem; 670 | } 671 | 672 | .bg-gray-200 { 673 | --tw-bg-opacity: 1; 674 | background-color: rgb(229 231 235 / var(--tw-bg-opacity)); 675 | } 676 | 677 | .bg-gray-300 { 678 | --tw-bg-opacity: 1; 679 | background-color: rgb(209 213 219 / var(--tw-bg-opacity)); 680 | } 681 | 682 | .bg-white { 683 | --tw-bg-opacity: 1; 684 | background-color: rgb(255 255 255 / var(--tw-bg-opacity)); 685 | } 686 | 687 | .px-4 { 688 | padding-left: 1rem; 689 | padding-right: 1rem; 690 | } 691 | 692 | .py-4 { 693 | padding-top: 1rem; 694 | padding-bottom: 1rem; 695 | } 696 | 697 | .text-xl { 698 | font-size: 1.25rem; 699 | line-height: 1.75rem; 700 | } 701 | 702 | .font-black { 703 | font-weight: 900; 704 | } 705 | 706 | .font-bold { 707 | font-weight: 700; 708 | } 709 | 710 | .text-gray-700 { 711 | --tw-text-opacity: 1; 712 | color: rgb(55 65 81 / var(--tw-text-opacity)); 713 | } 714 | 715 | .shadow-md { 716 | --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); 717 | --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color); 718 | box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); 719 | } 720 | 721 | .filter { 722 | filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); 723 | } 724 | 725 | .hover\:bg-sky-200:hover { 726 | --tw-bg-opacity: 1; 727 | background-color: rgb(186 230 253 / var(--tw-bg-opacity)); 728 | } 729 | -------------------------------------------------------------------------------- /content.bundle.js: -------------------------------------------------------------------------------- 1 | (()=>{var t={586:()=>{"use strict";const t=({props:e,tag:r,children:n,name:o},i)=>{const a=document.createElement(r);return Object.entries(e).forEach((([t,e])=>{"style"===t?Object.entries(e).forEach((([t,e])=>{a.style[t]=e})):a[t]=e})),n&&n.forEach((e=>{if(e){const r=t(e,i);a.appendChild(r)}})),o&&i&&(i[o]=a),a};!async function(){const e=t({tag:"div",props:{className:"fact-gpt-container"},children:[{tag:"div",props:{className:"min-w-[30%] max-h-[80%] max-w-[30%] fixed right-4 top-8 flex flex-col items-center justify-center rounded-lg bg-white shadow-md"},children:[{tag:"div",props:{className:"flex h-[40px] w-full items-center justify-between rounded-t-lg bg-gray-200 px-4"},children:[{tag:"div",props:{id:"fact__heading-text",className:"text-xl font-black text-gray-700 flex items-center justify-center h-full w-full whitespace-nowrap"}},{tag:"img",props:{id:"fact__close-button",className:"h-[24px] w-6 cursor-pointer rounded-lg hover:bg-sky-200",src:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxOC4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMjQgMjQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDI0IDI0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwb2x5Z29uIHBvaW50cz0iMTcuNywxNi4yIDEzLjQsMTIgMTcuNyw3LjggMTYuMiw2LjMgMTIsMTAuNiA3LjgsNi4zIDYuMyw3LjggMTAuNiwxMiA2LjMsMTYuMiA3LjgsMTcuNyAxMiwxMy40IDE2LjIsMTcuNyAiLz4NCjwvc3ZnPg0K",alt:"close"}}]},{tag:"div",props:{className:"w-full h-1 bg-gray-300"}},{tag:"div",props:{className:"h-full w-full overflow-y-auto px-4 py-4"},children:[{tag:"div",props:{id:"fact__body",className:"text-3-xl flex flex-col whitespace-pre-line text-gray-700 font-bold"}}]}]}]});let r=document.createElement("div");r.id="fact-root",document.body.appendChild(r);let n=r.attachShadow({mode:"open"});n.querySelector(".fact-styles")||function(t,e,r){const n=chrome.runtime.getURL("styles.css"),o=document.createElement("link");o.setAttribute("rel","stylesheet"),o.setAttribute("type","text/css"),o.setAttribute("href",n),r&&(o.className=r),t.appendChild(o);const i=document.createElement("style");i.textContent="\n :host {\n all: initial;\n }\n .fact-gpt-container * {\n font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;\n font-weight: 500;\n line-height: normal;\n font-size: 14px;\n text-align: right;\n direction: rtl;\n }\n ",t.appendChild(i)}(n,0,"fact-styles"),n.appendChild(e),r.style.position="fixed",r.style.zIndex="9999",e.querySelector("#fact__heading-text").innerHTML="

Fact Yab

";const o=e.querySelector("#fact__body");let i;o.innerHTML="

لطفا صبر کنید

",e.querySelector("#fact__close-button").addEventListener("click",(function(){document.body.removeChild(r)}));let a=window.getSelection();var c;a.isCollapsed?(c=document.querySelector("#hover"),i=void navigator.clipboard.writeText(undefined).then((function(){c.textContent="Copied"}),(function(){c.textContent="Failed"}))):i=a.toString();const s=chrome.runtime.connect();s.onMessage.addListener((function(t){t.answer?o.innerHTML=t.answer:"UNAUTHORIZED"===t.error?o.innerHTML='

لطفا وارد وب سایت شوید chat.openai.com

':o.innerHTML="

خطا

"})),s.postMessage({content:i})}()},666:t=>{var e=function(t){"use strict";var e,r=Object.prototype,n=r.hasOwnProperty,o=Object.defineProperty||function(t,e,r){t[e]=r.value},i="function"==typeof Symbol?Symbol:{},a=i.iterator||"@@iterator",c=i.asyncIterator||"@@asyncIterator",s=i.toStringTag||"@@toStringTag";function l(t,e,r){return Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}),t[e]}try{l({},"")}catch(t){l=function(t,e,r){return t[e]=r}}function u(t,e,r,n){var i=e&&e.prototype instanceof v?e:v,a=Object.create(i.prototype),c=new _(n||[]);return o(a,"_invoke",{value:j(t,r,c)}),a}function h(t,e,r){try{return{type:"normal",arg:t.call(e,r)}}catch(t){return{type:"throw",arg:t}}}t.wrap=u;var f="suspendedStart",p="suspendedYield",d="executing",y="completed",g={};function v(){}function m(){}function w(){}var x={};l(x,a,(function(){return this}));var b=Object.getPrototypeOf,L=b&&b(b(A([])));L&&L!==r&&n.call(L,a)&&(x=L);var I=w.prototype=v.prototype=Object.create(x);function E(t){["next","throw","return"].forEach((function(e){l(t,e,(function(t){return this._invoke(e,t)}))}))}function N(t,e){function r(o,i,a,c){var s=h(t[o],t,i);if("throw"!==s.type){var l=s.arg,u=l.value;return u&&"object"==typeof u&&n.call(u,"__await")?e.resolve(u.__await).then((function(t){r("next",t,a,c)}),(function(t){r("throw",t,a,c)})):e.resolve(u).then((function(t){l.value=t,a(l)}),(function(t){return r("throw",t,a,c)}))}c(s.arg)}var i;o(this,"_invoke",{value:function(t,n){function o(){return new e((function(e,o){r(t,n,e,o)}))}return i=i?i.then(o,o):o()}})}function j(t,e,r){var n=f;return function(o,i){if(n===d)throw new Error("Generator is already running");if(n===y){if("throw"===o)throw i;return C()}for(r.method=o,r.arg=i;;){var a=r.delegate;if(a){var c=M(a,r);if(c){if(c===g)continue;return c}}if("next"===r.method)r.sent=r._sent=r.arg;else if("throw"===r.method){if(n===f)throw n=y,r.arg;r.dispatchException(r.arg)}else"return"===r.method&&r.abrupt("return",r.arg);n=d;var s=h(t,e,r);if("normal"===s.type){if(n=r.done?y:p,s.arg===g)continue;return{value:s.arg,done:r.done}}"throw"===s.type&&(n=y,r.method="throw",r.arg=s.arg)}}}function M(t,r){var n=r.method,o=t.iterator[n];if(o===e)return r.delegate=null,"throw"===n&&t.iterator.return&&(r.method="return",r.arg=e,M(t,r),"throw"===r.method)||"return"!==n&&(r.method="throw",r.arg=new TypeError("The iterator does not provide a '"+n+"' method")),g;var i=h(o,t.iterator,r.arg);if("throw"===i.type)return r.method="throw",r.arg=i.arg,r.delegate=null,g;var a=i.arg;return a?a.done?(r[t.resultName]=a.value,r.next=t.nextLoc,"return"!==r.method&&(r.method="next",r.arg=e),r.delegate=null,g):a:(r.method="throw",r.arg=new TypeError("iterator result is not an object"),r.delegate=null,g)}function T(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function S(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function _(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(T,this),this.reset(!0)}function A(t){if(t){var r=t[a];if(r)return r.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var o=-1,i=function r(){for(;++o=0;--i){var a=this.tryEntries[i],c=a.completion;if("root"===a.tryLoc)return o("end");if(a.tryLoc<=this.prev){var s=n.call(a,"catchLoc"),l=n.call(a,"finallyLoc");if(s&&l){if(this.prev=0;--r){var o=this.tryEntries[r];if(o.tryLoc<=this.prev&&n.call(o,"finallyLoc")&&this.prev=0;--e){var r=this.tryEntries[e];if(r.finallyLoc===t)return this.complete(r.completion,r.afterLoc),S(r),g}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.tryLoc===t){var n=r.completion;if("throw"===n.type){var o=n.arg;S(r)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(t,r,n){return this.delegate={iterator:A(t),resultName:r,nextLoc:n},"next"===this.method&&(this.arg=e),g}},t}(t.exports);try{regeneratorRuntime=e}catch(t){"object"==typeof globalThis?globalThis.regeneratorRuntime=e:Function("r","regeneratorRuntime = r")(e)}}},e={};function r(n){var o=e[n];if(void 0!==o)return o.exports;var i=e[n]={exports:{}};return t[n](i,i.exports,r),i.exports}r(666),r(586)})(); 2 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,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U0FBVXVDLEVBQU82QyxHQUNqQmYsV0FBWUEsRUFDWkUsUUFBU0EsR0FHUyxTQUFoQnBDLEtBQUtPLFNBR1BQLEtBQUtYLElBQU1yQyxHQUdONEMsQ0FDVCxHQU9LN0MsQ0FFVCxDQXZ0QmMsQ0E0dEJpQnlJLEVBQU96SSxTQUd0QyxJQUNFMEksbUJBQXFCM0ssQ0FDdkIsQ0FBRSxNQUFPNEssR0FXbUIsaUJBQWZDLFdBQ1RBLFdBQVdGLG1CQUFxQjNLLEVBRWhDOEssU0FBUyxJQUFLLHlCQUFkQSxDQUF3QzlLLEVBRTVDLEMsR0N2dkJJK0ssRUFBMkIsQ0FBQyxFQUdoQyxTQUFTQyxFQUFvQkMsR0FFNUIsSUFBSUMsRUFBZUgsRUFBeUJFLEdBQzVDLFFBQXFCL0ksSUFBakJnSixFQUNILE9BQU9BLEVBQWFqSixRQUdyQixJQUFJeUksRUFBU0ssRUFBeUJFLEdBQVksQ0FHakRoSixRQUFTLENBQUMsR0FPWCxPQUhBa0osRUFBb0JGLEdBQVVQLEVBQVFBLEVBQU96SSxRQUFTK0ksR0FHL0NOLEVBQU96SSxPQUNmLENDbkJBK0ksRUFBb0IsS0FDTUEsRUFBb0IsSSIsInNvdXJjZXMiOlsid2VicGFjazovL2dwdC8uL2Nocm9tZS9zcmMvY29udGVudC9pbmRleC5qcyIsIndlYnBhY2s6Ly9ncHQvLi9ub2RlX21vZHVsZXMvcmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lLmpzIiwid2VicGFjazovL2dwdC93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9ncHQvd2VicGFjay9zdGFydHVwIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBDcm9zc0lDIGZyb20gXCIuLi8uLi8uLi9hc3NldHMvcmVzL2Nyb3NzLnN2Z1wiO1xyXG5cclxuLy8gQ2hlY2sgZ2l2ZW4gaXRlbSBhZ2FpbnN0IGJsYWNrbGlzdCwgcmV0dXJuIG51bGwgaWYgaW4gYmxhY2tsaXN0XHJcbmNvbnN0IGJsYWNrbGlzdCA9IFtcImNvbW1lbnRcIl07XHJcblxyXG5mdW5jdGlvbiBhZGRTdHlsZXNoZWV0KGRvYywgbGluaywgY2xhc3NOKSB7XHJcbiAgY29uc3QgcGF0aCA9IGNocm9tZS5ydW50aW1lLmdldFVSTChsaW5rKSxcclxuICAgIHN0eWxlTGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJsaW5rXCIpO1xyXG5cclxuICBzdHlsZUxpbmsuc2V0QXR0cmlidXRlKFwicmVsXCIsIFwic3R5bGVzaGVldFwiKTtcclxuICBzdHlsZUxpbmsuc2V0QXR0cmlidXRlKFwidHlwZVwiLCBcInRleHQvY3NzXCIpO1xyXG4gIHN0eWxlTGluay5zZXRBdHRyaWJ1dGUoXCJocmVmXCIsIHBhdGgpO1xyXG5cclxuICBpZiAoY2xhc3NOKSBzdHlsZUxpbmsuY2xhc3NOYW1lID0gY2xhc3NOO1xyXG5cclxuICBkb2MuYXBwZW5kQ2hpbGQoc3R5bGVMaW5rKTtcclxuXHJcbiAgY29uc3Qgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIik7XHJcbiAgc3R5bGUudGV4dENvbnRlbnQgPSBgXHJcbiAgICA6aG9zdCB7XHJcbiAgICAgIGFsbDogaW5pdGlhbDtcclxuICAgIH1cclxuICAgIC5mYWN0LWdwdC1jb250YWluZXIgKiB7XHJcbiAgICAgIGZvbnQtZmFtaWx5OiBzeXN0ZW0tdWksIC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgJ1NlZ29lIFVJJywgUm9ib3RvLCBPeHlnZW4sIFVidW50dSwgQ2FudGFyZWxsLCAnT3BlbiBTYW5zJywgJ0hlbHZldGljYSBOZXVlJywgc2Fucy1zZXJpZjtcclxuICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcclxuICAgICAgbGluZS1oZWlnaHQ6IG5vcm1hbDtcclxuICAgICAgZm9udC1zaXplOiAxNHB4O1xyXG4gICAgICB0ZXh0LWFsaWduOiByaWdodDtcclxuICAgICAgZGlyZWN0aW9uOiBydGw7XHJcbiAgICB9XHJcbiAgYDtcclxuICBkb2MuYXBwZW5kQ2hpbGQoc3R5bGUpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjb3B5VGV4dFRvQ2xpcGJvYXJkKHRleHQpIHtcclxuICB2YXIgY29weUJ1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjaG92ZXJcIik7XHJcbiAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQodGV4dCkudGhlbihcclxuICAgIGZ1bmN0aW9uICgpIHtcclxuICAgICAgY29weUJ1dHRvbi50ZXh0Q29udGVudCA9IFwiQ29waWVkXCI7XHJcbiAgICB9LFxyXG4gICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICBjb3B5QnV0dG9uLnRleHRDb250ZW50ID0gXCJGYWlsZWRcIjtcclxuICAgIH1cclxuICApO1xyXG59XHJcblxyXG5jb25zdCBjZSA9ICh7IHByb3BzLCB0YWcsIGNoaWxkcmVuLCBuYW1lIH0sIGVsZW1lbnRzT2JqKSA9PiB7XHJcbiAgY29uc3QgZWxtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWcpO1xyXG4gIE9iamVjdC5lbnRyaWVzKHByb3BzKS5mb3JFYWNoKChbaywgdl0pID0+IHtcclxuICAgIGlmIChrID09PSBcInN0eWxlXCIpIHtcclxuICAgICAgT2JqZWN0LmVudHJpZXModikuZm9yRWFjaCgoW2syLCB2Ml0pID0+IHtcclxuICAgICAgICBlbG0uc3R5bGVbazJdID0gdjI7XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZWxtW2tdID0gdjtcclxuICAgIH1cclxuICB9KTtcclxuICBpZiAoY2hpbGRyZW4pIHtcclxuICAgIGNoaWxkcmVuLmZvckVhY2goKHgpID0+IHtcclxuICAgICAgaWYgKHgpIHtcclxuICAgICAgICBjb25zdCBjaGlsZCA9IGNlKHgsIGVsZW1lbnRzT2JqKTtcclxuICAgICAgICBlbG0uYXBwZW5kQ2hpbGQoY2hpbGQpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbiAgaWYgKG5hbWUgJiYgZWxlbWVudHNPYmopIHtcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxyXG4gICAgZWxlbWVudHNPYmpbbmFtZV0gPSBlbG07XHJcbiAgfVxyXG4gIHJldHVybiBlbG07XHJcbn07XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVDb250YWluZXIoKSB7XHJcbiAgcmV0dXJuIGNlKHtcclxuICAgIHRhZzogXCJkaXZcIixcclxuICAgIHByb3BzOiB7IGNsYXNzTmFtZTogXCJmYWN0LWdwdC1jb250YWluZXJcIiB9LFxyXG4gICAgY2hpbGRyZW46IFtcclxuICAgICAge1xyXG4gICAgICAgIHRhZzogXCJkaXZcIixcclxuICAgICAgICBwcm9wczoge1xyXG4gICAgICAgICAgY2xhc3NOYW1lOlxyXG4gICAgICAgICAgICBcIm1pbi13LVszMCVdICBtYXgtaC1bODAlXSBtYXgtdy1bMzAlXSBmaXhlZCByaWdodC00IHRvcC04IGZsZXggZmxleC1jb2wgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtbGcgYmctd2hpdGUgc2hhZG93LW1kXCIsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBjaGlsZHJlbjogW1xyXG4gICAgICAgICAgLy8gaGVhZGluZ1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICB0YWc6IFwiZGl2XCIsXHJcbiAgICAgICAgICAgIHByb3BzOiB7XHJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lOlxyXG4gICAgICAgICAgICAgICAgXCJmbGV4IGgtWzQwcHhdIHctZnVsbCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIHJvdW5kZWQtdC1sZyBiZy1ncmF5LTIwMCBweC00XCIsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGNoaWxkcmVuOiBbXHJcbiAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGFnOiBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgcHJvcHM6IHtcclxuICAgICAgICAgICAgICAgICAgaWQ6IFwiZmFjdF9faGVhZGluZy10ZXh0XCIsXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTpcclxuICAgICAgICAgICAgICAgICAgICBcInRleHQteGwgZm9udC1ibGFjayB0ZXh0LWdyYXktNzAwIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGgtZnVsbCB3LWZ1bGwgd2hpdGVzcGFjZS1ub3dyYXBcIixcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0YWc6IFwiaW1nXCIsXHJcbiAgICAgICAgICAgICAgICBwcm9wczoge1xyXG4gICAgICAgICAgICAgICAgICBpZDogXCJmYWN0X19jbG9zZS1idXR0b25cIixcclxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOlxyXG4gICAgICAgICAgICAgICAgICAgIFwiaC1bMjRweF0gdy02IGN1cnNvci1wb2ludGVyIHJvdW5kZWQtbGcgaG92ZXI6Ymctc2t5LTIwMFwiLFxyXG4gICAgICAgICAgICAgICAgICBzcmM6IENyb3NzSUMsXHJcbiAgICAgICAgICAgICAgICAgIGFsdDogXCJjbG9zZVwiLFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBdLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIC8vIGRpdmlkZXJcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgdGFnOiBcImRpdlwiLFxyXG4gICAgICAgICAgICBwcm9wczogeyBjbGFzc05hbWU6IFwidy1mdWxsIGgtMSBiZy1ncmF5LTMwMFwiIH0sXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgLy8gYm9keVxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICB0YWc6IFwiZGl2XCIsXHJcbiAgICAgICAgICAgIHByb3BzOiB7XHJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcImgtZnVsbCB3LWZ1bGwgb3ZlcmZsb3cteS1hdXRvIHB4LTQgcHktNFwiLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBjaGlsZHJlbjogW1xyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRhZzogXCJkaXZcIixcclxuICAgICAgICAgICAgICAgIHByb3BzOiB7XHJcbiAgICAgICAgICAgICAgICAgIGlkOiBcImZhY3RfX2JvZHlcIixcclxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOlxyXG4gICAgICAgICAgICAgICAgICAgIFwidGV4dC0zLXhsIGZsZXggZmxleC1jb2wgd2hpdGVzcGFjZS1wcmUtbGluZSB0ZXh0LWdyYXktNzAwIGZvbnQtYm9sZFwiLFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBdLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICBdLFxyXG4gICAgICB9LFxyXG4gICAgXSxcclxuICB9KTtcclxufVxyXG5cclxuYXN5bmMgZnVuY3Rpb24gcnVuKCkge1xyXG4gIGNvbnN0IGNvbnRhaW5lciA9IGNyZWF0ZUNvbnRhaW5lcigpO1xyXG5cclxuICBsZXQgcm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgcm9vdC5pZCA9IFwiZmFjdC1yb290XCI7XHJcbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChyb290KTtcclxuXHJcbiAgbGV0IHNoYWRvd1Jvb3QgPSByb290LmF0dGFjaFNoYWRvdyh7IG1vZGU6IFwib3BlblwiIH0pO1xyXG5cclxuICBpZiAoIXNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcihcIi5mYWN0LXN0eWxlc1wiKSlcclxuICAgIGFkZFN0eWxlc2hlZXQoc2hhZG93Um9vdCwgXCJzdHlsZXMuY3NzXCIsIFwiZmFjdC1zdHlsZXNcIik7XHJcblxyXG4gIHNoYWRvd1Jvb3QuYXBwZW5kQ2hpbGQoY29udGFpbmVyKTtcclxuXHJcbiAgLy8gQWRkaW5nIHN0eWxlcyB0byBwb3NpdGlvbiB0aGUgcm9vdFxyXG4gIHJvb3Quc3R5bGUucG9zaXRpb24gPSBcImZpeGVkXCI7XHJcbiAgcm9vdC5zdHlsZS56SW5kZXggPSBcIjk5OTlcIjsgLy8gTWFrZSBzdXJlIGl0J3Mgb24gdG9wIG9mIG90aGVyIGVsZW1lbnRzXHJcblxyXG4gIGNvbnN0IGlubmVyQ29udGFpbmVySGVhZGluZyA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKFwiI2ZhY3RfX2hlYWRpbmctdGV4dFwiKTtcclxuICBpbm5lckNvbnRhaW5lckhlYWRpbmcuaW5uZXJIVE1MID0gXCI8cD5GYWN0IFlhYjwvcD5cIjtcclxuXHJcbiAgY29uc3QgaW5uZXJDb250YWluZXJCb2R5ID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoXCIjZmFjdF9fYm9keVwiKTtcclxuICBpbm5lckNvbnRhaW5lckJvZHkuaW5uZXJIVE1MID0gXCI8cD7ZhNi32YHYpyDYtdio2LEg2qnZhtuM2K88L3A+XCI7XHJcblxyXG4gIGNvbnN0IGNsb3NlQnV0dG9uID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoXCIjZmFjdF9fY2xvc2UtYnV0dG9uXCIpO1xyXG4gIGNsb3NlQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbiAoKSB7XHJcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHJvb3QpO1xyXG4gIH0pO1xyXG5cclxuICBsZXQgY29udGVudDtcclxuICBsZXQgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG5cclxuICBpZiAoc2VsZWN0aW9uLmlzQ29sbGFwc2VkKSB7XHJcbiAgICBjb250ZW50ID0gY29weVRleHRUb0NsaXBib2FyZCgpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBjb250ZW50ID0gc2VsZWN0aW9uLnRvU3RyaW5nKCk7XHJcbiAgfVxyXG5cclxuICBjb25zdCBwb3J0ID0gY2hyb21lLnJ1bnRpbWUuY29ubmVjdCgpO1xyXG4gIHBvcnQub25NZXNzYWdlLmFkZExpc3RlbmVyKGZ1bmN0aW9uIChtc2cpIHtcclxuICAgIGlmIChtc2cuYW5zd2VyKSB7XHJcbiAgICAgIGlubmVyQ29udGFpbmVyQm9keS5pbm5lckhUTUwgPSBtc2cuYW5zd2VyO1xyXG4gICAgfSBlbHNlIGlmIChtc2cuZXJyb3IgPT09IFwiVU5BVVRIT1JJWkVEXCIpIHtcclxuICAgICAgaW5uZXJDb250YWluZXJCb2R5LmlubmVySFRNTCA9XHJcbiAgICAgICAgJzxwPtmE2LfZgdinINmI2KfYsdivINmI2Kgg2LPYp9uM2Kog2LTZiNuM2K8gPGEgaHJlZj1cImh0dHBzOi8vY2hhdC5vcGVuYWkuY29tXCIgdGFyZ2V0PVwiX2JsYW5rXCI+Y2hhdC5vcGVuYWkuY29tPC9hPjwvcD4nO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaW5uZXJDb250YWluZXJCb2R5LmlubmVySFRNTCA9IFwiPHA+2K7Yt9inPC9wPlwiO1xyXG4gICAgfVxyXG4gIH0pO1xyXG4gIHBvcnQucG9zdE1lc3NhZ2UoeyBjb250ZW50IH0pO1xyXG59XHJcblxyXG5ydW4oKTtcclxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG52YXIgcnVudGltZSA9IChmdW5jdGlvbiAoZXhwb3J0cykge1xuICBcInVzZSBzdHJpY3RcIjtcblxuICB2YXIgT3AgPSBPYmplY3QucHJvdG90eXBlO1xuICB2YXIgaGFzT3duID0gT3AuaGFzT3duUHJvcGVydHk7XG4gIHZhciBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSB8fCBmdW5jdGlvbiAob2JqLCBrZXksIGRlc2MpIHsgb2JqW2tleV0gPSBkZXNjLnZhbHVlOyB9O1xuICB2YXIgdW5kZWZpbmVkOyAvLyBNb3JlIGNvbXByZXNzaWJsZSB0aGFuIHZvaWQgMC5cbiAgdmFyICRTeW1ib2wgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgPyBTeW1ib2wgOiB7fTtcbiAgdmFyIGl0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5pdGVyYXRvciB8fCBcIkBAaXRlcmF0b3JcIjtcbiAgdmFyIGFzeW5jSXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLmFzeW5jSXRlcmF0b3IgfHwgXCJAQGFzeW5jSXRlcmF0b3JcIjtcbiAgdmFyIHRvU3RyaW5nVGFnU3ltYm9sID0gJFN5bWJvbC50b1N0cmluZ1RhZyB8fCBcIkBAdG9TdHJpbmdUYWdcIjtcblxuICBmdW5jdGlvbiBkZWZpbmUob2JqLCBrZXksIHZhbHVlKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgICByZXR1cm4gb2JqW2tleV07XG4gIH1cbiAgdHJ5IHtcbiAgICAvLyBJRSA4IGhhcyBhIGJyb2tlbiBPYmplY3QuZGVmaW5lUHJvcGVydHkgdGhhdCBvbmx5IHdvcmtzIG9uIERPTSBvYmplY3RzLlxuICAgIGRlZmluZSh7fSwgXCJcIik7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGRlZmluZSA9IGZ1bmN0aW9uKG9iaiwga2V5LCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIG9ialtrZXldID0gdmFsdWU7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpIHtcbiAgICAvLyBJZiBvdXRlckZuIHByb3ZpZGVkIGFuZCBvdXRlckZuLnByb3RvdHlwZSBpcyBhIEdlbmVyYXRvciwgdGhlbiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvci5cbiAgICB2YXIgcHJvdG9HZW5lcmF0b3IgPSBvdXRlckZuICYmIG91dGVyRm4ucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuZXJhdG9yID8gb3V0ZXJGbiA6IEdlbmVyYXRvcjtcbiAgICB2YXIgZ2VuZXJhdG9yID0gT2JqZWN0LmNyZWF0ZShwcm90b0dlbmVyYXRvci5wcm90b3R5cGUpO1xuICAgIHZhciBjb250ZXh0ID0gbmV3IENvbnRleHQodHJ5TG9jc0xpc3QgfHwgW10pO1xuXG4gICAgLy8gVGhlIC5faW52b2tlIG1ldGhvZCB1bmlmaWVzIHRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIC5uZXh0LFxuICAgIC8vIC50aHJvdywgYW5kIC5yZXR1cm4gbWV0aG9kcy5cbiAgICBkZWZpbmVQcm9wZXJ0eShnZW5lcmF0b3IsIFwiX2ludm9rZVwiLCB7IHZhbHVlOiBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpIH0pO1xuXG4gICAgcmV0dXJuIGdlbmVyYXRvcjtcbiAgfVxuICBleHBvcnRzLndyYXAgPSB3cmFwO1xuXG4gIC8vIFRyeS9jYXRjaCBoZWxwZXIgdG8gbWluaW1pemUgZGVvcHRpbWl6YXRpb25zLiBSZXR1cm5zIGEgY29tcGxldGlvblxuICAvLyByZWNvcmQgbGlrZSBjb250ZXh0LnRyeUVudHJpZXNbaV0uY29tcGxldGlvbi4gVGhpcyBpbnRlcmZhY2UgY291bGRcbiAgLy8gaGF2ZSBiZWVuIChhbmQgd2FzIHByZXZpb3VzbHkpIGRlc2lnbmVkIHRvIHRha2UgYSBjbG9zdXJlIHRvIGJlXG4gIC8vIGludm9rZWQgd2l0aG91dCBhcmd1bWVudHMsIGJ1dCBpbiBhbGwgdGhlIGNhc2VzIHdlIGNhcmUgYWJvdXQgd2VcbiAgLy8gYWxyZWFkeSBoYXZlIGFuIGV4aXN0aW5nIG1ldGhvZCB3ZSB3YW50IHRvIGNhbGwsIHNvIHRoZXJlJ3Mgbm8gbmVlZFxuICAvLyB0byBjcmVhdGUgYSBuZXcgZnVuY3Rpb24gb2JqZWN0LiBXZSBjYW4gZXZlbiBnZXQgYXdheSB3aXRoIGFzc3VtaW5nXG4gIC8vIHRoZSBtZXRob2QgdGFrZXMgZXhhY3RseSBvbmUgYXJndW1lbnQsIHNpbmNlIHRoYXQgaGFwcGVucyB0byBiZSB0cnVlXG4gIC8vIGluIGV2ZXJ5IGNhc2UsIHNvIHdlIGRvbid0IGhhdmUgdG8gdG91Y2ggdGhlIGFyZ3VtZW50cyBvYmplY3QuIFRoZVxuICAvLyBvbmx5IGFkZGl0aW9uYWwgYWxsb2NhdGlvbiByZXF1aXJlZCBpcyB0aGUgY29tcGxldGlvbiByZWNvcmQsIHdoaWNoXG4gIC8vIGhhcyBhIHN0YWJsZSBzaGFwZSBhbmQgc28gaG9wZWZ1bGx5IHNob3VsZCBiZSBjaGVhcCB0byBhbGxvY2F0ZS5cbiAgZnVuY3Rpb24gdHJ5Q2F0Y2goZm4sIG9iaiwgYXJnKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwibm9ybWFsXCIsIGFyZzogZm4uY2FsbChvYmosIGFyZykgfTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwidGhyb3dcIiwgYXJnOiBlcnIgfTtcbiAgICB9XG4gIH1cblxuICB2YXIgR2VuU3RhdGVTdXNwZW5kZWRTdGFydCA9IFwic3VzcGVuZGVkU3RhcnRcIjtcbiAgdmFyIEdlblN0YXRlU3VzcGVuZGVkWWllbGQgPSBcInN1c3BlbmRlZFlpZWxkXCI7XG4gIHZhciBHZW5TdGF0ZUV4ZWN1dGluZyA9IFwiZXhlY3V0aW5nXCI7XG4gIHZhciBHZW5TdGF0ZUNvbXBsZXRlZCA9IFwiY29tcGxldGVkXCI7XG5cbiAgLy8gUmV0dXJuaW5nIHRoaXMgb2JqZWN0IGZyb20gdGhlIGlubmVyRm4gaGFzIHRoZSBzYW1lIGVmZmVjdCBhc1xuICAvLyBicmVha2luZyBvdXQgb2YgdGhlIGRpc3BhdGNoIHN3aXRjaCBzdGF0ZW1lbnQuXG4gIHZhciBDb250aW51ZVNlbnRpbmVsID0ge307XG5cbiAgLy8gRHVtbXkgY29uc3RydWN0b3IgZnVuY3Rpb25zIHRoYXQgd2UgdXNlIGFzIHRoZSAuY29uc3RydWN0b3IgYW5kXG4gIC8vIC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcyBmb3IgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIEdlbmVyYXRvclxuICAvLyBvYmplY3RzLiBGb3IgZnVsbCBzcGVjIGNvbXBsaWFuY2UsIHlvdSBtYXkgd2lzaCB0byBjb25maWd1cmUgeW91clxuICAvLyBtaW5pZmllciBub3QgdG8gbWFuZ2xlIHRoZSBuYW1lcyBvZiB0aGVzZSB0d28gZnVuY3Rpb25zLlxuICBmdW5jdGlvbiBHZW5lcmF0b3IoKSB7fVxuICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvbigpIHt9XG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKCkge31cblxuICAvLyBUaGlzIGlzIGEgcG9seWZpbGwgZm9yICVJdGVyYXRvclByb3RvdHlwZSUgZm9yIGVudmlyb25tZW50cyB0aGF0XG4gIC8vIGRvbid0IG5hdGl2ZWx5IHN1cHBvcnQgaXQuXG4gIHZhciBJdGVyYXRvclByb3RvdHlwZSA9IHt9O1xuICBkZWZpbmUoSXRlcmF0b3JQcm90b3R5cGUsIGl0ZXJhdG9yU3ltYm9sLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0pO1xuXG4gIHZhciBnZXRQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjtcbiAgdmFyIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG8gJiYgZ2V0UHJvdG8oZ2V0UHJvdG8odmFsdWVzKFtdKSkpO1xuICBpZiAoTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgJiZcbiAgICAgIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICE9PSBPcCAmJlxuICAgICAgaGFzT3duLmNhbGwoTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUsIGl0ZXJhdG9yU3ltYm9sKSkge1xuICAgIC8vIFRoaXMgZW52aXJvbm1lbnQgaGFzIGEgbmF0aXZlICVJdGVyYXRvclByb3RvdHlwZSU7IHVzZSBpdCBpbnN0ZWFkXG4gICAgLy8gb2YgdGhlIHBvbHlmaWxsLlxuICAgIEl0ZXJhdG9yUHJvdG90eXBlID0gTmF0aXZlSXRlcmF0b3JQcm90b3R5cGU7XG4gIH1cblxuICB2YXIgR3AgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5wcm90b3R5cGUgPVxuICAgIEdlbmVyYXRvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlKTtcbiAgR2VuZXJhdG9yRnVuY3Rpb24ucHJvdG90eXBlID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7XG4gIGRlZmluZVByb3BlcnR5KEdwLCBcImNvbnN0cnVjdG9yXCIsIHsgdmFsdWU6IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLCBjb25maWd1cmFibGU6IHRydWUgfSk7XG4gIGRlZmluZVByb3BlcnR5KFxuICAgIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLFxuICAgIFwiY29uc3RydWN0b3JcIixcbiAgICB7IHZhbHVlOiBHZW5lcmF0b3JGdW5jdGlvbiwgY29uZmlndXJhYmxlOiB0cnVlIH1cbiAgKTtcbiAgR2VuZXJhdG9yRnVuY3Rpb24uZGlzcGxheU5hbWUgPSBkZWZpbmUoXG4gICAgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsXG4gICAgdG9TdHJpbmdUYWdTeW1ib2wsXG4gICAgXCJHZW5lcmF0b3JGdW5jdGlvblwiXG4gICk7XG5cbiAgLy8gSGVscGVyIGZvciBkZWZpbmluZyB0aGUgLm5leHQsIC50aHJvdywgYW5kIC5yZXR1cm4gbWV0aG9kcyBvZiB0aGVcbiAgLy8gSXRlcmF0b3IgaW50ZXJmYWNlIGluIHRlcm1zIG9mIGEgc2luZ2xlIC5faW52b2tlIG1ldGhvZC5cbiAgZnVuY3Rpb24gZGVmaW5lSXRlcmF0b3JNZXRob2RzKHByb3RvdHlwZSkge1xuICAgIFtcIm5leHRcIiwgXCJ0aHJvd1wiLCBcInJldHVyblwiXS5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZCkge1xuICAgICAgZGVmaW5lKHByb3RvdHlwZSwgbWV0aG9kLCBmdW5jdGlvbihhcmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ludm9rZShtZXRob2QsIGFyZyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGV4cG9ydHMuaXNHZW5lcmF0b3JGdW5jdGlvbiA9IGZ1bmN0aW9uKGdlbkZ1bikge1xuICAgIHZhciBjdG9yID0gdHlwZW9mIGdlbkZ1biA9PT0gXCJmdW5jdGlvblwiICYmIGdlbkZ1bi5jb25zdHJ1Y3RvcjtcbiAgICByZXR1cm4gY3RvclxuICAgICAgPyBjdG9yID09PSBHZW5lcmF0b3JGdW5jdGlvbiB8fFxuICAgICAgICAvLyBGb3IgdGhlIG5hdGl2ZSBHZW5lcmF0b3JGdW5jdGlvbiBjb25zdHJ1Y3RvciwgdGhlIGJlc3Qgd2UgY2FuXG4gICAgICAgIC8vIGRvIGlzIHRvIGNoZWNrIGl0cyAubmFtZSBwcm9wZXJ0eS5cbiAgICAgICAgKGN0b3IuZGlzcGxheU5hbWUgfHwgY3Rvci5uYW1lKSA9PT0gXCJHZW5lcmF0b3JGdW5jdGlvblwiXG4gICAgICA6IGZhbHNlO1xuICB9O1xuXG4gIGV4cG9ydHMubWFyayA9IGZ1bmN0aW9uKGdlbkZ1bikge1xuICAgIGlmIChPYmplY3Quc2V0UHJvdG90eXBlT2YpIHtcbiAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihnZW5GdW4sIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ2VuRnVuLl9fcHJvdG9fXyA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlO1xuICAgICAgZGVmaW5lKGdlbkZ1biwgdG9TdHJpbmdUYWdTeW1ib2wsIFwiR2VuZXJhdG9yRnVuY3Rpb25cIik7XG4gICAgfVxuICAgIGdlbkZ1bi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEdwKTtcbiAgICByZXR1cm4gZ2VuRnVuO1xuICB9O1xuXG4gIC8vIFdpdGhpbiB0aGUgYm9keSBvZiBhbnkgYXN5bmMgZnVuY3Rpb24sIGBhd2FpdCB4YCBpcyB0cmFuc2Zvcm1lZCB0b1xuICAvLyBgeWllbGQgcmVnZW5lcmF0b3JSdW50aW1lLmF3cmFwKHgpYCwgc28gdGhhdCB0aGUgcnVudGltZSBjYW4gdGVzdFxuICAvLyBgaGFzT3duLmNhbGwodmFsdWUsIFwiX19hd2FpdFwiKWAgdG8gZGV0ZXJtaW5lIGlmIHRoZSB5aWVsZGVkIHZhbHVlIGlzXG4gIC8vIG1lYW50IHRvIGJlIGF3YWl0ZWQuXG4gIGV4cG9ydHMuYXdyYXAgPSBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4geyBfX2F3YWl0OiBhcmcgfTtcbiAgfTtcblxuICBmdW5jdGlvbiBBc3luY0l0ZXJhdG9yKGdlbmVyYXRvciwgUHJvbWlzZUltcGwpIHtcbiAgICBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGdlbmVyYXRvclttZXRob2RdLCBnZW5lcmF0b3IsIGFyZyk7XG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICByZWplY3QocmVjb3JkLmFyZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcmVzdWx0ID0gcmVjb3JkLmFyZztcbiAgICAgICAgdmFyIHZhbHVlID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICBpZiAodmFsdWUgJiZcbiAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgICAgaGFzT3duLmNhbGwodmFsdWUsIFwiX19hd2FpdFwiKSkge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlSW1wbC5yZXNvbHZlKHZhbHVlLl9fYXdhaXQpLnRoZW4oZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgIGludm9rZShcIm5leHRcIiwgdmFsdWUsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSwgZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICBpbnZva2UoXCJ0aHJvd1wiLCBlcnIsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUHJvbWlzZUltcGwucmVzb2x2ZSh2YWx1ZSkudGhlbihmdW5jdGlvbih1bndyYXBwZWQpIHtcbiAgICAgICAgICAvLyBXaGVuIGEgeWllbGRlZCBQcm9taXNlIGlzIHJlc29sdmVkLCBpdHMgZmluYWwgdmFsdWUgYmVjb21lc1xuICAgICAgICAgIC8vIHRoZSAudmFsdWUgb2YgdGhlIFByb21pc2U8e3ZhbHVlLGRvbmV9PiByZXN1bHQgZm9yIHRoZVxuICAgICAgICAgIC8vIGN1cnJlbnQgaXRlcmF0aW9uLlxuICAgICAgICAgIHJlc3VsdC52YWx1ZSA9IHVud3JhcHBlZDtcbiAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH0sIGZ1bmN0aW9uKGVycm9yKSB7XG4gICAgICAgICAgLy8gSWYgYSByZWplY3RlZCBQcm9taXNlIHdhcyB5aWVsZGVkLCB0aHJvdyB0aGUgcmVqZWN0aW9uIGJhY2tcbiAgICAgICAgICAvLyBpbnRvIHRoZSBhc3luYyBnZW5lcmF0b3IgZnVuY3Rpb24gc28gaXQgY2FuIGJlIGhhbmRsZWQgdGhlcmUuXG4gICAgICAgICAgcmV0dXJuIGludm9rZShcInRocm93XCIsIGVycm9yLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcHJldmlvdXNQcm9taXNlO1xuXG4gICAgZnVuY3Rpb24gZW5xdWV1ZShtZXRob2QsIGFyZykge1xuICAgICAgZnVuY3Rpb24gY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZUltcGwoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgaW52b2tlKG1ldGhvZCwgYXJnLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHByZXZpb3VzUHJvbWlzZSA9XG4gICAgICAgIC8vIElmIGVucXVldWUgaGFzIGJlZW4gY2FsbGVkIGJlZm9yZSwgdGhlbiB3ZSB3YW50IHRvIHdhaXQgdW50aWxcbiAgICAgICAgLy8gYWxsIHByZXZpb3VzIFByb21pc2VzIGhhdmUgYmVlbiByZXNvbHZlZCBiZWZvcmUgY2FsbGluZyBpbnZva2UsXG4gICAgICAgIC8vIHNvIHRoYXQgcmVzdWx0cyBhcmUgYWx3YXlzIGRlbGl2ZXJlZCBpbiB0aGUgY29ycmVjdCBvcmRlci4gSWZcbiAgICAgICAgLy8gZW5xdWV1ZSBoYXMgbm90IGJlZW4gY2FsbGVkIGJlZm9yZSwgdGhlbiBpdCBpcyBpbXBvcnRhbnQgdG9cbiAgICAgICAgLy8gY2FsbCBpbnZva2UgaW1tZWRpYXRlbHksIHdpdGhvdXQgd2FpdGluZyBvbiBhIGNhbGxiYWNrIHRvIGZpcmUsXG4gICAgICAgIC8vIHNvIHRoYXQgdGhlIGFzeW5jIGdlbmVyYXRvciBmdW5jdGlvbiBoYXMgdGhlIG9wcG9ydHVuaXR5IHRvIGRvXG4gICAgICAgIC8vIGFueSBuZWNlc3Nhcnkgc2V0dXAgaW4gYSBwcmVkaWN0YWJsZSB3YXkuIFRoaXMgcHJlZGljdGFiaWxpdHlcbiAgICAgICAgLy8gaXMgd2h5IHRoZSBQcm9taXNlIGNvbnN0cnVjdG9yIHN5bmNocm9ub3VzbHkgaW52b2tlcyBpdHNcbiAgICAgICAgLy8gZXhlY3V0b3IgY2FsbGJhY2ssIGFuZCB3aHkgYXN5bmMgZnVuY3Rpb25zIHN5bmNocm9ub3VzbHlcbiAgICAgICAgLy8gZXhlY3V0ZSBjb2RlIGJlZm9yZSB0aGUgZmlyc3QgYXdhaXQuIFNpbmNlIHdlIGltcGxlbWVudCBzaW1wbGVcbiAgICAgICAgLy8gYXN5bmMgZnVuY3Rpb25zIGluIHRlcm1zIG9mIGFzeW5jIGdlbmVyYXRvcnMsIGl0IGlzIGVzcGVjaWFsbHlcbiAgICAgICAgLy8gaW1wb3J0YW50IHRvIGdldCB0aGlzIHJpZ2h0LCBldmVuIHRob3VnaCBpdCByZXF1aXJlcyBjYXJlLlxuICAgICAgICBwcmV2aW91c1Byb21pc2UgPyBwcmV2aW91c1Byb21pc2UudGhlbihcbiAgICAgICAgICBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZyxcbiAgICAgICAgICAvLyBBdm9pZCBwcm9wYWdhdGluZyBmYWlsdXJlcyB0byBQcm9taXNlcyByZXR1cm5lZCBieSBsYXRlclxuICAgICAgICAgIC8vIGludm9jYXRpb25zIG9mIHRoZSBpdGVyYXRvci5cbiAgICAgICAgICBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZ1xuICAgICAgICApIDogY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKTtcbiAgICB9XG5cbiAgICAvLyBEZWZpbmUgdGhlIHVuaWZpZWQgaGVscGVyIG1ldGhvZCB0aGF0IGlzIHVzZWQgdG8gaW1wbGVtZW50IC5uZXh0LFxuICAgIC8vIC50aHJvdywgYW5kIC5yZXR1cm4gKHNlZSBkZWZpbmVJdGVyYXRvck1ldGhvZHMpLlxuICAgIGRlZmluZVByb3BlcnR5KHRoaXMsIFwiX2ludm9rZVwiLCB7IHZhbHVlOiBlbnF1ZXVlIH0pO1xuICB9XG5cbiAgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEFzeW5jSXRlcmF0b3IucHJvdG90eXBlKTtcbiAgZGVmaW5lKEFzeW5jSXRlcmF0b3IucHJvdG90eXBlLCBhc3luY0l0ZXJhdG9yU3ltYm9sLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0pO1xuICBleHBvcnRzLkFzeW5jSXRlcmF0b3IgPSBBc3luY0l0ZXJhdG9yO1xuXG4gIC8vIE5vdGUgdGhhdCBzaW1wbGUgYXN5bmMgZnVuY3Rpb25zIGFyZSBpbXBsZW1lbnRlZCBvbiB0b3Agb2ZcbiAgLy8gQXN5bmNJdGVyYXRvciBvYmplY3RzOyB0aGV5IGp1c3QgcmV0dXJuIGEgUHJvbWlzZSBmb3IgdGhlIHZhbHVlIG9mXG4gIC8vIHRoZSBmaW5hbCByZXN1bHQgcHJvZHVjZWQgYnkgdGhlIGl0ZXJhdG9yLlxuICBleHBvcnRzLmFzeW5jID0gZnVuY3Rpb24oaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QsIFByb21pc2VJbXBsKSB7XG4gICAgaWYgKFByb21pc2VJbXBsID09PSB2b2lkIDApIFByb21pc2VJbXBsID0gUHJvbWlzZTtcblxuICAgIHZhciBpdGVyID0gbmV3IEFzeW5jSXRlcmF0b3IoXG4gICAgICB3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSxcbiAgICAgIFByb21pc2VJbXBsXG4gICAgKTtcblxuICAgIHJldHVybiBleHBvcnRzLmlzR2VuZXJhdG9yRnVuY3Rpb24ob3V0ZXJGbilcbiAgICAgID8gaXRlciAvLyBJZiBvdXRlckZuIGlzIGEgZ2VuZXJhdG9yLCByZXR1cm4gdGhlIGZ1bGwgaXRlcmF0b3IuXG4gICAgICA6IGl0ZXIubmV4dCgpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdC5kb25lID8gcmVzdWx0LnZhbHVlIDogaXRlci5uZXh0KCk7XG4gICAgICAgIH0pO1xuICB9O1xuXG4gIGZ1bmN0aW9uIG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCkge1xuICAgIHZhciBzdGF0ZSA9IEdlblN0YXRlU3VzcGVuZGVkU3RhcnQ7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gaW52b2tlKG1ldGhvZCwgYXJnKSB7XG4gICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlRXhlY3V0aW5nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmdcIik7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVDb21wbGV0ZWQpIHtcbiAgICAgICAgaWYgKG1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgdGhyb3cgYXJnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQmUgZm9yZ2l2aW5nLCBwZXIgMjUuMy4zLjMuMyBvZiB0aGUgc3BlYzpcbiAgICAgICAgLy8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLWdlbmVyYXRvcnJlc3VtZVxuICAgICAgICByZXR1cm4gZG9uZVJlc3VsdCgpO1xuICAgICAgfVxuXG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IG1ldGhvZDtcbiAgICAgIGNvbnRleHQuYXJnID0gYXJnO1xuXG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICB2YXIgZGVsZWdhdGUgPSBjb250ZXh0LmRlbGVnYXRlO1xuICAgICAgICBpZiAoZGVsZWdhdGUpIHtcbiAgICAgICAgICB2YXIgZGVsZWdhdGVSZXN1bHQgPSBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KTtcbiAgICAgICAgICBpZiAoZGVsZWdhdGVSZXN1bHQpIHtcbiAgICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCA9PT0gQ29udGludWVTZW50aW5lbCkgY29udGludWU7XG4gICAgICAgICAgICByZXR1cm4gZGVsZWdhdGVSZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSBcIm5leHRcIikge1xuICAgICAgICAgIC8vIFNldHRpbmcgY29udGV4dC5fc2VudCBmb3IgbGVnYWN5IHN1cHBvcnQgb2YgQmFiZWwnc1xuICAgICAgICAgIC8vIGZ1bmN0aW9uLnNlbnQgaW1wbGVtZW50YXRpb24uXG4gICAgICAgICAgY29udGV4dC5zZW50ID0gY29udGV4dC5fc2VudCA9IGNvbnRleHQuYXJnO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dC5tZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVTdXNwZW5kZWRTdGFydCkge1xuICAgICAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUNvbXBsZXRlZDtcbiAgICAgICAgICAgIHRocm93IGNvbnRleHQuYXJnO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnRleHQuZGlzcGF0Y2hFeGNlcHRpb24oY29udGV4dC5hcmcpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dC5tZXRob2QgPT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgICBjb250ZXh0LmFicnVwdChcInJldHVyblwiLCBjb250ZXh0LmFyZyk7XG4gICAgICAgIH1cblxuICAgICAgICBzdGF0ZSA9IEdlblN0YXRlRXhlY3V0aW5nO1xuXG4gICAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChpbm5lckZuLCBzZWxmLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcIm5vcm1hbFwiKSB7XG4gICAgICAgICAgLy8gSWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBmcm9tIGlubmVyRm4sIHdlIGxlYXZlIHN0YXRlID09PVxuICAgICAgICAgIC8vIEdlblN0YXRlRXhlY3V0aW5nIGFuZCBsb29wIGJhY2sgZm9yIGFub3RoZXIgaW52b2NhdGlvbi5cbiAgICAgICAgICBzdGF0ZSA9IGNvbnRleHQuZG9uZVxuICAgICAgICAgICAgPyBHZW5TdGF0ZUNvbXBsZXRlZFxuICAgICAgICAgICAgOiBHZW5TdGF0ZVN1c3BlbmRlZFlpZWxkO1xuXG4gICAgICAgICAgaWYgKHJlY29yZC5hcmcgPT09IENvbnRpbnVlU2VudGluZWwpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZTogcmVjb3JkLmFyZyxcbiAgICAgICAgICAgIGRvbmU6IGNvbnRleHQuZG9uZVxuICAgICAgICAgIH07XG5cbiAgICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUNvbXBsZXRlZDtcbiAgICAgICAgICAvLyBEaXNwYXRjaCB0aGUgZXhjZXB0aW9uIGJ5IGxvb3BpbmcgYmFjayBhcm91bmQgdG8gdGhlXG4gICAgICAgICAgLy8gY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZykgY2FsbCBhYm92ZS5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHJlY29yZC5hcmc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLy8gQ2FsbCBkZWxlZ2F0ZS5pdGVyYXRvcltjb250ZXh0Lm1ldGhvZF0oY29udGV4dC5hcmcpIGFuZCBoYW5kbGUgdGhlXG4gIC8vIHJlc3VsdCwgZWl0aGVyIGJ5IHJldHVybmluZyBhIHsgdmFsdWUsIGRvbmUgfSByZXN1bHQgZnJvbSB0aGVcbiAgLy8gZGVsZWdhdGUgaXRlcmF0b3IsIG9yIGJ5IG1vZGlmeWluZyBjb250ZXh0Lm1ldGhvZCBhbmQgY29udGV4dC5hcmcsXG4gIC8vIHNldHRpbmcgY29udGV4dC5kZWxlZ2F0ZSB0byBudWxsLCBhbmQgcmV0dXJuaW5nIHRoZSBDb250aW51ZVNlbnRpbmVsLlxuICBmdW5jdGlvbiBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KSB7XG4gICAgdmFyIG1ldGhvZE5hbWUgPSBjb250ZXh0Lm1ldGhvZDtcbiAgICB2YXIgbWV0aG9kID0gZGVsZWdhdGUuaXRlcmF0b3JbbWV0aG9kTmFtZV07XG4gICAgaWYgKG1ldGhvZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBBIC50aHJvdyBvciAucmV0dXJuIHdoZW4gdGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGhhcyBubyAudGhyb3dcbiAgICAgIC8vIG1ldGhvZCwgb3IgYSBtaXNzaW5nIC5uZXh0IG1laHRvZCwgYWx3YXlzIHRlcm1pbmF0ZSB0aGVcbiAgICAgIC8vIHlpZWxkKiBsb29wLlxuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG5cbiAgICAgIC8vIE5vdGU6IFtcInJldHVyblwiXSBtdXN0IGJlIHVzZWQgZm9yIEVTMyBwYXJzaW5nIGNvbXBhdGliaWxpdHkuXG4gICAgICBpZiAobWV0aG9kTmFtZSA9PT0gXCJ0aHJvd1wiICYmIGRlbGVnYXRlLml0ZXJhdG9yW1wicmV0dXJuXCJdKSB7XG4gICAgICAgIC8vIElmIHRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBoYXMgYSByZXR1cm4gbWV0aG9kLCBnaXZlIGl0IGFcbiAgICAgICAgLy8gY2hhbmNlIHRvIGNsZWFuIHVwLlxuICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwicmV0dXJuXCI7XG4gICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgICBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KTtcblxuICAgICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIC8vIElmIG1heWJlSW52b2tlRGVsZWdhdGUoY29udGV4dCkgY2hhbmdlZCBjb250ZXh0Lm1ldGhvZCBmcm9tXG4gICAgICAgICAgLy8gXCJyZXR1cm5cIiB0byBcInRocm93XCIsIGxldCB0aGF0IG92ZXJyaWRlIHRoZSBUeXBlRXJyb3IgYmVsb3cuXG4gICAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChtZXRob2ROYW1lICE9PSBcInJldHVyblwiKSB7XG4gICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgICBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgXCJUaGUgaXRlcmF0b3IgZG9lcyBub3QgcHJvdmlkZSBhICdcIiArIG1ldGhvZE5hbWUgKyBcIicgbWV0aG9kXCIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2gobWV0aG9kLCBkZWxlZ2F0ZS5pdGVyYXRvciwgY29udGV4dC5hcmcpO1xuXG4gICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgY29udGV4dC5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICB2YXIgaW5mbyA9IHJlY29yZC5hcmc7XG5cbiAgICBpZiAoISBpbmZvKSB7XG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgIGNvbnRleHQuYXJnID0gbmV3IFR5cGVFcnJvcihcIml0ZXJhdG9yIHJlc3VsdCBpcyBub3QgYW4gb2JqZWN0XCIpO1xuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICBpZiAoaW5mby5kb25lKSB7XG4gICAgICAvLyBBc3NpZ24gdGhlIHJlc3VsdCBvZiB0aGUgZmluaXNoZWQgZGVsZWdhdGUgdG8gdGhlIHRlbXBvcmFyeVxuICAgICAgLy8gdmFyaWFibGUgc3BlY2lmaWVkIGJ5IGRlbGVnYXRlLnJlc3VsdE5hbWUgKHNlZSBkZWxlZ2F0ZVlpZWxkKS5cbiAgICAgIGNvbnRleHRbZGVsZWdhdGUucmVzdWx0TmFtZV0gPSBpbmZvLnZhbHVlO1xuXG4gICAgICAvLyBSZXN1bWUgZXhlY3V0aW9uIGF0IHRoZSBkZXNpcmVkIGxvY2F0aW9uIChzZWUgZGVsZWdhdGVZaWVsZCkuXG4gICAgICBjb250ZXh0Lm5leHQgPSBkZWxlZ2F0ZS5uZXh0TG9jO1xuXG4gICAgICAvLyBJZiBjb250ZXh0Lm1ldGhvZCB3YXMgXCJ0aHJvd1wiIGJ1dCB0aGUgZGVsZWdhdGUgaGFuZGxlZCB0aGVcbiAgICAgIC8vIGV4Y2VwdGlvbiwgbGV0IHRoZSBvdXRlciBnZW5lcmF0b3IgcHJvY2VlZCBub3JtYWxseS4gSWZcbiAgICAgIC8vIGNvbnRleHQubWV0aG9kIHdhcyBcIm5leHRcIiwgZm9yZ2V0IGNvbnRleHQuYXJnIHNpbmNlIGl0IGhhcyBiZWVuXG4gICAgICAvLyBcImNvbnN1bWVkXCIgYnkgdGhlIGRlbGVnYXRlIGl0ZXJhdG9yLiBJZiBjb250ZXh0Lm1ldGhvZCB3YXNcbiAgICAgIC8vIFwicmV0dXJuXCIsIGFsbG93IHRoZSBvcmlnaW5hbCAucmV0dXJuIGNhbGwgdG8gY29udGludWUgaW4gdGhlXG4gICAgICAvLyBvdXRlciBnZW5lcmF0b3IuXG4gICAgICBpZiAoY29udGV4dC5tZXRob2QgIT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgY29udGV4dC5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmUteWllbGQgdGhlIHJlc3VsdCByZXR1cm5lZCBieSB0aGUgZGVsZWdhdGUgbWV0aG9kLlxuICAgICAgcmV0dXJuIGluZm87XG4gICAgfVxuXG4gICAgLy8gVGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGlzIGZpbmlzaGVkLCBzbyBmb3JnZXQgaXQgYW5kIGNvbnRpbnVlIHdpdGhcbiAgICAvLyB0aGUgb3V0ZXIgZ2VuZXJhdG9yLlxuICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICB9XG5cbiAgLy8gRGVmaW5lIEdlbmVyYXRvci5wcm90b3R5cGUue25leHQsdGhyb3cscmV0dXJufSBpbiB0ZXJtcyBvZiB0aGVcbiAgLy8gdW5pZmllZCAuX2ludm9rZSBoZWxwZXIgbWV0aG9kLlxuICBkZWZpbmVJdGVyYXRvck1ldGhvZHMoR3ApO1xuXG4gIGRlZmluZShHcCwgdG9TdHJpbmdUYWdTeW1ib2wsIFwiR2VuZXJhdG9yXCIpO1xuXG4gIC8vIEEgR2VuZXJhdG9yIHNob3VsZCBhbHdheXMgcmV0dXJuIGl0c2VsZiBhcyB0aGUgaXRlcmF0b3Igb2JqZWN0IHdoZW4gdGhlXG4gIC8vIEBAaXRlcmF0b3IgZnVuY3Rpb24gaXMgY2FsbGVkIG9uIGl0LiBTb21lIGJyb3dzZXJzJyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlXG4gIC8vIGl0ZXJhdG9yIHByb3RvdHlwZSBjaGFpbiBpbmNvcnJlY3RseSBpbXBsZW1lbnQgdGhpcywgY2F1c2luZyB0aGUgR2VuZXJhdG9yXG4gIC8vIG9iamVjdCB0byBub3QgYmUgcmV0dXJuZWQgZnJvbSB0aGlzIGNhbGwuIFRoaXMgZW5zdXJlcyB0aGF0IGRvZXNuJ3QgaGFwcGVuLlxuICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlZ2VuZXJhdG9yL2lzc3Vlcy8yNzQgZm9yIG1vcmUgZGV0YWlscy5cbiAgZGVmaW5lKEdwLCBpdGVyYXRvclN5bWJvbCwgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0pO1xuXG4gIGRlZmluZShHcCwgXCJ0b1N0cmluZ1wiLCBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gXCJbb2JqZWN0IEdlbmVyYXRvcl1cIjtcbiAgfSk7XG5cbiAgZnVuY3Rpb24gcHVzaFRyeUVudHJ5KGxvY3MpIHtcbiAgICB2YXIgZW50cnkgPSB7IHRyeUxvYzogbG9jc1swXSB9O1xuXG4gICAgaWYgKDEgaW4gbG9jcykge1xuICAgICAgZW50cnkuY2F0Y2hMb2MgPSBsb2NzWzFdO1xuICAgIH1cblxuICAgIGlmICgyIGluIGxvY3MpIHtcbiAgICAgIGVudHJ5LmZpbmFsbHlMb2MgPSBsb2NzWzJdO1xuICAgICAgZW50cnkuYWZ0ZXJMb2MgPSBsb2NzWzNdO1xuICAgIH1cblxuICAgIHRoaXMudHJ5RW50cmllcy5wdXNoKGVudHJ5KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc2V0VHJ5RW50cnkoZW50cnkpIHtcbiAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbiB8fCB7fTtcbiAgICByZWNvcmQudHlwZSA9IFwibm9ybWFsXCI7XG4gICAgZGVsZXRlIHJlY29yZC5hcmc7XG4gICAgZW50cnkuY29tcGxldGlvbiA9IHJlY29yZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIENvbnRleHQodHJ5TG9jc0xpc3QpIHtcbiAgICAvLyBUaGUgcm9vdCBlbnRyeSBvYmplY3QgKGVmZmVjdGl2ZWx5IGEgdHJ5IHN0YXRlbWVudCB3aXRob3V0IGEgY2F0Y2hcbiAgICAvLyBvciBhIGZpbmFsbHkgYmxvY2spIGdpdmVzIHVzIGEgcGxhY2UgdG8gc3RvcmUgdmFsdWVzIHRocm93biBmcm9tXG4gICAgLy8gbG9jYXRpb25zIHdoZXJlIHRoZXJlIGlzIG5vIGVuY2xvc2luZyB0cnkgc3RhdGVtZW50LlxuICAgIHRoaXMudHJ5RW50cmllcyA9IFt7IHRyeUxvYzogXCJyb290XCIgfV07XG4gICAgdHJ5TG9jc0xpc3QuZm9yRWFjaChwdXNoVHJ5RW50cnksIHRoaXMpO1xuICAgIHRoaXMucmVzZXQodHJ1ZSk7XG4gIH1cblxuICBleHBvcnRzLmtleXMgPSBmdW5jdGlvbih2YWwpIHtcbiAgICB2YXIgb2JqZWN0ID0gT2JqZWN0KHZhbCk7XG4gICAgdmFyIGtleXMgPSBbXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSB7XG4gICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICB9XG4gICAga2V5cy5yZXZlcnNlKCk7XG5cbiAgICAvLyBSYXRoZXIgdGhhbiByZXR1cm5pbmcgYW4gb2JqZWN0IHdpdGggYSBuZXh0IG1ldGhvZCwgd2Uga2VlcFxuICAgIC8vIHRoaW5ncyBzaW1wbGUgYW5kIHJldHVybiB0aGUgbmV4dCBmdW5jdGlvbiBpdHNlbGYuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICB3aGlsZSAoa2V5cy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGtleSA9IGtleXMucG9wKCk7XG4gICAgICAgIGlmIChrZXkgaW4gb2JqZWN0KSB7XG4gICAgICAgICAgbmV4dC52YWx1ZSA9IGtleTtcbiAgICAgICAgICBuZXh0LmRvbmUgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUbyBhdm9pZCBjcmVhdGluZyBhbiBhZGRpdGlvbmFsIG9iamVjdCwgd2UganVzdCBoYW5nIHRoZSAudmFsdWVcbiAgICAgIC8vIGFuZCAuZG9uZSBwcm9wZXJ0aWVzIG9mZiB0aGUgbmV4dCBmdW5jdGlvbiBvYmplY3QgaXRzZWxmLiBUaGlzXG4gICAgICAvLyBhbHNvIGVuc3VyZXMgdGhhdCB0aGUgbWluaWZpZXIgd2lsbCBub3QgYW5vbnltaXplIHRoZSBmdW5jdGlvbi5cbiAgICAgIG5leHQuZG9uZSA9IHRydWU7XG4gICAgICByZXR1cm4gbmV4dDtcbiAgICB9O1xuICB9O1xuXG4gIGZ1bmN0aW9uIHZhbHVlcyhpdGVyYWJsZSkge1xuICAgIGlmIChpdGVyYWJsZSkge1xuICAgICAgdmFyIGl0ZXJhdG9yTWV0aG9kID0gaXRlcmFibGVbaXRlcmF0b3JTeW1ib2xdO1xuICAgICAgaWYgKGl0ZXJhdG9yTWV0aG9kKSB7XG4gICAgICAgIHJldHVybiBpdGVyYXRvck1ldGhvZC5jYWxsKGl0ZXJhYmxlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBpdGVyYWJsZS5uZXh0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhYmxlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWlzTmFOKGl0ZXJhYmxlLmxlbmd0aCkpIHtcbiAgICAgICAgdmFyIGkgPSAtMSwgbmV4dCA9IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgICAgd2hpbGUgKCsraSA8IGl0ZXJhYmxlLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGhhc093bi5jYWxsKGl0ZXJhYmxlLCBpKSkge1xuICAgICAgICAgICAgICBuZXh0LnZhbHVlID0gaXRlcmFibGVbaV07XG4gICAgICAgICAgICAgIG5leHQuZG9uZSA9IGZhbHNlO1xuICAgICAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBuZXh0LnZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICAgIG5leHQuZG9uZSA9IHRydWU7XG5cbiAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gbmV4dC5uZXh0ID0gbmV4dDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gYW4gaXRlcmF0b3Igd2l0aCBubyB2YWx1ZXMuXG4gICAgcmV0dXJuIHsgbmV4dDogZG9uZVJlc3VsdCB9O1xuICB9XG4gIGV4cG9ydHMudmFsdWVzID0gdmFsdWVzO1xuXG4gIGZ1bmN0aW9uIGRvbmVSZXN1bHQoKSB7XG4gICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICB9XG5cbiAgQ29udGV4dC5wcm90b3R5cGUgPSB7XG4gICAgY29uc3RydWN0b3I6IENvbnRleHQsXG5cbiAgICByZXNldDogZnVuY3Rpb24oc2tpcFRlbXBSZXNldCkge1xuICAgICAgdGhpcy5wcmV2ID0gMDtcbiAgICAgIHRoaXMubmV4dCA9IDA7XG4gICAgICAvLyBSZXNldHRpbmcgY29udGV4dC5fc2VudCBmb3IgbGVnYWN5IHN1cHBvcnQgb2YgQmFiZWwnc1xuICAgICAgLy8gZnVuY3Rpb24uc2VudCBpbXBsZW1lbnRhdGlvbi5cbiAgICAgIHRoaXMuc2VudCA9IHRoaXMuX3NlbnQgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmRvbmUgPSBmYWxzZTtcbiAgICAgIHRoaXMuZGVsZWdhdGUgPSBudWxsO1xuXG4gICAgICB0aGlzLm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgdGhpcy5hcmcgPSB1bmRlZmluZWQ7XG5cbiAgICAgIHRoaXMudHJ5RW50cmllcy5mb3JFYWNoKHJlc2V0VHJ5RW50cnkpO1xuXG4gICAgICBpZiAoIXNraXBUZW1wUmVzZXQpIHtcbiAgICAgICAgZm9yICh2YXIgbmFtZSBpbiB0aGlzKSB7XG4gICAgICAgICAgLy8gTm90IHN1cmUgYWJvdXQgdGhlIG9wdGltYWwgb3JkZXIgb2YgdGhlc2UgY29uZGl0aW9uczpcbiAgICAgICAgICBpZiAobmFtZS5jaGFyQXQoMCkgPT09IFwidFwiICYmXG4gICAgICAgICAgICAgIGhhc093bi5jYWxsKHRoaXMsIG5hbWUpICYmXG4gICAgICAgICAgICAgICFpc05hTigrbmFtZS5zbGljZSgxKSkpIHtcbiAgICAgICAgICAgIHRoaXNbbmFtZV0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIHN0b3A6IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5kb25lID0gdHJ1ZTtcblxuICAgICAgdmFyIHJvb3RFbnRyeSA9IHRoaXMudHJ5RW50cmllc1swXTtcbiAgICAgIHZhciByb290UmVjb3JkID0gcm9vdEVudHJ5LmNvbXBsZXRpb247XG4gICAgICBpZiAocm9vdFJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgdGhyb3cgcm9vdFJlY29yZC5hcmc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLnJ2YWw7XG4gICAgfSxcblxuICAgIGRpc3BhdGNoRXhjZXB0aW9uOiBmdW5jdGlvbihleGNlcHRpb24pIHtcbiAgICAgIGlmICh0aGlzLmRvbmUpIHtcbiAgICAgICAgdGhyb3cgZXhjZXB0aW9uO1xuICAgICAgfVxuXG4gICAgICB2YXIgY29udGV4dCA9IHRoaXM7XG4gICAgICBmdW5jdGlvbiBoYW5kbGUobG9jLCBjYXVnaHQpIHtcbiAgICAgICAgcmVjb3JkLnR5cGUgPSBcInRocm93XCI7XG4gICAgICAgIHJlY29yZC5hcmcgPSBleGNlcHRpb247XG4gICAgICAgIGNvbnRleHQubmV4dCA9IGxvYztcblxuICAgICAgICBpZiAoY2F1Z2h0KSB7XG4gICAgICAgICAgLy8gSWYgdGhlIGRpc3BhdGNoZWQgZXhjZXB0aW9uIHdhcyBjYXVnaHQgYnkgYSBjYXRjaCBibG9jayxcbiAgICAgICAgICAvLyB0aGVuIGxldCB0aGF0IGNhdGNoIGJsb2NrIGhhbmRsZSB0aGUgZXhjZXB0aW9uIG5vcm1hbGx5LlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gISEgY2F1Z2h0O1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb247XG5cbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA9PT0gXCJyb290XCIpIHtcbiAgICAgICAgICAvLyBFeGNlcHRpb24gdGhyb3duIG91dHNpZGUgb2YgYW55IHRyeSBibG9jayB0aGF0IGNvdWxkIGhhbmRsZVxuICAgICAgICAgIC8vIGl0LCBzbyBzZXQgdGhlIGNvbXBsZXRpb24gdmFsdWUgb2YgdGhlIGVudGlyZSBmdW5jdGlvbiB0b1xuICAgICAgICAgIC8vIHRocm93IHRoZSBleGNlcHRpb24uXG4gICAgICAgICAgcmV0dXJuIGhhbmRsZShcImVuZFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPD0gdGhpcy5wcmV2KSB7XG4gICAgICAgICAgdmFyIGhhc0NhdGNoID0gaGFzT3duLmNhbGwoZW50cnksIFwiY2F0Y2hMb2NcIik7XG4gICAgICAgICAgdmFyIGhhc0ZpbmFsbHkgPSBoYXNPd24uY2FsbChlbnRyeSwgXCJmaW5hbGx5TG9jXCIpO1xuXG4gICAgICAgICAgaWYgKGhhc0NhdGNoICYmIGhhc0ZpbmFsbHkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCB0cnVlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmZpbmFsbHlMb2MpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSBlbHNlIGlmIChoYXNDYXRjaCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsIHRydWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSBlbHNlIGlmIChoYXNGaW5hbGx5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmZpbmFsbHlMb2MpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInRyeSBzdGF0ZW1lbnQgd2l0aG91dCBjYXRjaCBvciBmaW5hbGx5XCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBhYnJ1cHQ6IGZ1bmN0aW9uKHR5cGUsIGFyZykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPD0gdGhpcy5wcmV2ICYmXG4gICAgICAgICAgICBoYXNPd24uY2FsbChlbnRyeSwgXCJmaW5hbGx5TG9jXCIpICYmXG4gICAgICAgICAgICB0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgdmFyIGZpbmFsbHlFbnRyeSA9IGVudHJ5O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChmaW5hbGx5RW50cnkgJiZcbiAgICAgICAgICAodHlwZSA9PT0gXCJicmVha1wiIHx8XG4gICAgICAgICAgIHR5cGUgPT09IFwiY29udGludWVcIikgJiZcbiAgICAgICAgICBmaW5hbGx5RW50cnkudHJ5TG9jIDw9IGFyZyAmJlxuICAgICAgICAgIGFyZyA8PSBmaW5hbGx5RW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAvLyBJZ25vcmUgdGhlIGZpbmFsbHkgZW50cnkgaWYgY29udHJvbCBpcyBub3QganVtcGluZyB0byBhXG4gICAgICAgIC8vIGxvY2F0aW9uIG91dHNpZGUgdGhlIHRyeS9jYXRjaCBibG9jay5cbiAgICAgICAgZmluYWxseUVudHJ5ID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgdmFyIHJlY29yZCA9IGZpbmFsbHlFbnRyeSA/IGZpbmFsbHlFbnRyeS5jb21wbGV0aW9uIDoge307XG4gICAgICByZWNvcmQudHlwZSA9IHR5cGU7XG4gICAgICByZWNvcmQuYXJnID0gYXJnO1xuXG4gICAgICBpZiAoZmluYWxseUVudHJ5KSB7XG4gICAgICAgIHRoaXMubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgIHRoaXMubmV4dCA9IGZpbmFsbHlFbnRyeS5maW5hbGx5TG9jO1xuICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuY29tcGxldGUocmVjb3JkKTtcbiAgICB9LFxuXG4gICAgY29tcGxldGU6IGZ1bmN0aW9uKHJlY29yZCwgYWZ0ZXJMb2MpIHtcbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHRocm93IHJlY29yZC5hcmc7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJicmVha1wiIHx8XG4gICAgICAgICAgcmVjb3JkLnR5cGUgPT09IFwiY29udGludWVcIikge1xuICAgICAgICB0aGlzLm5leHQgPSByZWNvcmQuYXJnO1xuICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJyZXR1cm5cIikge1xuICAgICAgICB0aGlzLnJ2YWwgPSB0aGlzLmFyZyA9IHJlY29yZC5hcmc7XG4gICAgICAgIHRoaXMubWV0aG9kID0gXCJyZXR1cm5cIjtcbiAgICAgICAgdGhpcy5uZXh0ID0gXCJlbmRcIjtcbiAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwibm9ybWFsXCIgJiYgYWZ0ZXJMb2MpIHtcbiAgICAgICAgdGhpcy5uZXh0ID0gYWZ0ZXJMb2M7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH0sXG5cbiAgICBmaW5pc2g6IGZ1bmN0aW9uKGZpbmFsbHlMb2MpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkuZmluYWxseUxvYyA9PT0gZmluYWxseUxvYykge1xuICAgICAgICAgIHRoaXMuY29tcGxldGUoZW50cnkuY29tcGxldGlvbiwgZW50cnkuYWZ0ZXJMb2MpO1xuICAgICAgICAgIHJlc2V0VHJ5RW50cnkoZW50cnkpO1xuICAgICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIFwiY2F0Y2hcIjogZnVuY3Rpb24odHJ5TG9jKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA9PT0gdHJ5TG9jKSB7XG4gICAgICAgICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb247XG4gICAgICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICAgIHZhciB0aHJvd24gPSByZWNvcmQuYXJnO1xuICAgICAgICAgICAgcmVzZXRUcnlFbnRyeShlbnRyeSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aHJvd247XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVGhlIGNvbnRleHQuY2F0Y2ggbWV0aG9kIG11c3Qgb25seSBiZSBjYWxsZWQgd2l0aCBhIGxvY2F0aW9uXG4gICAgICAvLyBhcmd1bWVudCB0aGF0IGNvcnJlc3BvbmRzIHRvIGEga25vd24gY2F0Y2ggYmxvY2suXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbGxlZ2FsIGNhdGNoIGF0dGVtcHRcIik7XG4gICAgfSxcblxuICAgIGRlbGVnYXRlWWllbGQ6IGZ1bmN0aW9uKGl0ZXJhYmxlLCByZXN1bHROYW1lLCBuZXh0TG9jKSB7XG4gICAgICB0aGlzLmRlbGVnYXRlID0ge1xuICAgICAgICBpdGVyYXRvcjogdmFsdWVzKGl0ZXJhYmxlKSxcbiAgICAgICAgcmVzdWx0TmFtZTogcmVzdWx0TmFtZSxcbiAgICAgICAgbmV4dExvYzogbmV4dExvY1xuICAgICAgfTtcblxuICAgICAgaWYgKHRoaXMubWV0aG9kID09PSBcIm5leHRcIikge1xuICAgICAgICAvLyBEZWxpYmVyYXRlbHkgZm9yZ2V0IHRoZSBsYXN0IHNlbnQgdmFsdWUgc28gdGhhdCB3ZSBkb24ndFxuICAgICAgICAvLyBhY2NpZGVudGFsbHkgcGFzcyBpdCBvbiB0byB0aGUgZGVsZWdhdGUuXG4gICAgICAgIHRoaXMuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG4gIH07XG5cbiAgLy8gUmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoaXMgc2NyaXB0IGlzIGV4ZWN1dGluZyBhcyBhIENvbW1vbkpTIG1vZHVsZVxuICAvLyBvciBub3QsIHJldHVybiB0aGUgcnVudGltZSBvYmplY3Qgc28gdGhhdCB3ZSBjYW4gZGVjbGFyZSB0aGUgdmFyaWFibGVcbiAgLy8gcmVnZW5lcmF0b3JSdW50aW1lIGluIHRoZSBvdXRlciBzY29wZSwgd2hpY2ggYWxsb3dzIHRoaXMgbW9kdWxlIHRvIGJlXG4gIC8vIGluamVjdGVkIGVhc2lseSBieSBgYmluL3JlZ2VuZXJhdG9yIC0taW5jbHVkZS1ydW50aW1lIHNjcmlwdC5qc2AuXG4gIHJldHVybiBleHBvcnRzO1xuXG59KFxuICAvLyBJZiB0aGlzIHNjcmlwdCBpcyBleGVjdXRpbmcgYXMgYSBDb21tb25KUyBtb2R1bGUsIHVzZSBtb2R1bGUuZXhwb3J0c1xuICAvLyBhcyB0aGUgcmVnZW5lcmF0b3JSdW50aW1lIG5hbWVzcGFjZS4gT3RoZXJ3aXNlIGNyZWF0ZSBhIG5ldyBlbXB0eVxuICAvLyBvYmplY3QuIEVpdGhlciB3YXksIHRoZSByZXN1bHRpbmcgb2JqZWN0IHdpbGwgYmUgdXNlZCB0byBpbml0aWFsaXplXG4gIC8vIHRoZSByZWdlbmVyYXRvclJ1bnRpbWUgdmFyaWFibGUgYXQgdGhlIHRvcCBvZiB0aGlzIGZpbGUuXG4gIHR5cGVvZiBtb2R1bGUgPT09IFwib2JqZWN0XCIgPyBtb2R1bGUuZXhwb3J0cyA6IHt9XG4pKTtcblxudHJ5IHtcbiAgcmVnZW5lcmF0b3JSdW50aW1lID0gcnVudGltZTtcbn0gY2F0Y2ggKGFjY2lkZW50YWxTdHJpY3RNb2RlKSB7XG4gIC8vIFRoaXMgbW9kdWxlIHNob3VsZCBub3QgYmUgcnVubmluZyBpbiBzdHJpY3QgbW9kZSwgc28gdGhlIGFib3ZlXG4gIC8vIGFzc2lnbm1lbnQgc2hvdWxkIGFsd2F5cyB3b3JrIHVubGVzcyBzb21ldGhpbmcgaXMgbWlzY29uZmlndXJlZC4gSnVzdFxuICAvLyBpbiBjYXNlIHJ1bnRpbWUuanMgYWNjaWRlbnRhbGx5IHJ1bnMgaW4gc3RyaWN0IG1vZGUsIGluIG1vZGVybiBlbmdpbmVzXG4gIC8vIHdlIGNhbiBleHBsaWNpdGx5IGFjY2VzcyBnbG9iYWxUaGlzLiBJbiBvbGRlciBlbmdpbmVzIHdlIGNhbiBlc2NhcGVcbiAgLy8gc3RyaWN0IG1vZGUgdXNpbmcgYSBnbG9iYWwgRnVuY3Rpb24gY2FsbC4gVGhpcyBjb3VsZCBjb25jZWl2YWJseSBmYWlsXG4gIC8vIGlmIGEgQ29udGVudCBTZWN1cml0eSBQb2xpY3kgZm9yYmlkcyB1c2luZyBGdW5jdGlvbiwgYnV0IGluIHRoYXQgY2FzZVxuICAvLyB0aGUgcHJvcGVyIHNvbHV0aW9uIGlzIHRvIGZpeCB0aGUgYWNjaWRlbnRhbCBzdHJpY3QgbW9kZSBwcm9ibGVtLiBJZlxuICAvLyB5b3UndmUgbWlzY29uZmlndXJlZCB5b3VyIGJ1bmRsZXIgdG8gZm9yY2Ugc3RyaWN0IG1vZGUgYW5kIGFwcGxpZWQgYVxuICAvLyBDU1AgdG8gZm9yYmlkIEZ1bmN0aW9uLCBhbmQgeW91J3JlIG5vdCB3aWxsaW5nIHRvIGZpeCBlaXRoZXIgb2YgdGhvc2VcbiAgLy8gcHJvYmxlbXMsIHBsZWFzZSBkZXRhaWwgeW91ciB1bmlxdWUgcHJlZGljYW1lbnQgaW4gYSBHaXRIdWIgaXNzdWUuXG4gIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gXCJvYmplY3RcIikge1xuICAgIGdsb2JhbFRoaXMucmVnZW5lcmF0b3JSdW50aW1lID0gcnVudGltZTtcbiAgfSBlbHNlIHtcbiAgICBGdW5jdGlvbihcInJcIiwgXCJyZWdlbmVyYXRvclJ1bnRpbWUgPSByXCIpKHJ1bnRpbWUpO1xuICB9XG59XG4iLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLy8gc3RhcnR1cFxuLy8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vLyBUaGlzIGVudHJ5IG1vZHVsZSBpcyByZWZlcmVuY2VkIGJ5IG90aGVyIG1vZHVsZXMgc28gaXQgY2FuJ3QgYmUgaW5saW5lZFxuX193ZWJwYWNrX3JlcXVpcmVfXyg2NjYpO1xudmFyIF9fd2VicGFja19leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU4Nik7XG4iXSwibmFtZXMiOlsiY2UiLCJwcm9wcyIsInRhZyIsImNoaWxkcmVuIiwibmFtZSIsImVsZW1lbnRzT2JqIiwiZWxtIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiT2JqZWN0IiwiZW50cmllcyIsImZvckVhY2giLCJrIiwidiIsImsyIiwidjIiLCJzdHlsZSIsIngiLCJjaGlsZCIsImFwcGVuZENoaWxkIiwiYXN5bmMiLCJjb250YWluZXIiLCJjbGFzc05hbWUiLCJpZCIsInNyYyIsImFsdCIsInJvb3QiLCJib2R5Iiwic2hhZG93Um9vdCIsImF0dGFjaFNoYWRvdyIsIm1vZGUiLCJxdWVyeVNlbGVjdG9yIiwiZG9jIiwibGluayIsImNsYXNzTiIsInBhdGgiLCJjaHJvbWUiLCJydW50aW1lIiwiZ2V0VVJMIiwic3R5bGVMaW5rIiwic2V0QXR0cmlidXRlIiwidGV4dENvbnRlbnQiLCJhZGRTdHlsZXNoZWV0IiwicG9zaXRpb24iLCJ6SW5kZXgiLCJpbm5lckhUTUwiLCJpbm5lckNvbnRhaW5lckJvZHkiLCJjb250ZW50IiwiYWRkRXZlbnRMaXN0ZW5lciIsInJlbW92ZUNoaWxkIiwic2VsZWN0aW9uIiwid2luZG93IiwiZ2V0U2VsZWN0aW9uIiwiY29weUJ1dHRvbiIsImlzQ29sbGFwc2VkIiwibmF2aWdhdG9yIiwiY2xpcGJvYXJkIiwid3JpdGVUZXh0IiwidGV4dCIsInRoZW4iLCJ0b1N0cmluZyIsInBvcnQiLCJjb25uZWN0Iiwib25NZXNzYWdlIiwiYWRkTGlzdGVuZXIiLCJtc2ciLCJhbnN3ZXIiLCJlcnJvciIsInBvc3RNZXNzYWdlIiwicnVuIiwiZXhwb3J0cyIsInVuZGVmaW5lZCIsIk9wIiwicHJvdG90eXBlIiwiaGFzT3duIiwiaGFzT3duUHJvcGVydHkiLCJkZWZpbmVQcm9wZXJ0eSIsIm9iaiIsImtleSIsImRlc2MiLCJ2YWx1ZSIsIiRTeW1ib2wiLCJTeW1ib2wiLCJpdGVyYXRvclN5bWJvbCIsIml0ZXJhdG9yIiwiYXN5bmNJdGVyYXRvclN5bWJvbCIsImFzeW5jSXRlcmF0b3IiLCJ0b1N0cmluZ1RhZ1N5bWJvbCIsInRvU3RyaW5nVGFnIiwiZGVmaW5lIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwiZXJyIiwid3JhcCIsImlubmVyRm4iLCJvdXRlckZuIiwic2VsZiIsInRyeUxvY3NMaXN0IiwicHJvdG9HZW5lcmF0b3IiLCJHZW5lcmF0b3IiLCJnZW5lcmF0b3IiLCJjcmVhdGUiLCJjb250ZXh0IiwiQ29udGV4dCIsIm1ha2VJbnZva2VNZXRob2QiLCJ0cnlDYXRjaCIsImZuIiwiYXJnIiwidHlwZSIsImNhbGwiLCJHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0IiwiR2VuU3RhdGVTdXNwZW5kZWRZaWVsZCIsIkdlblN0YXRlRXhlY3V0aW5nIiwiR2VuU3RhdGVDb21wbGV0ZWQiLCJDb250aW51ZVNlbnRpbmVsIiwiR2VuZXJhdG9yRnVuY3Rpb24iLCJHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSIsIkl0ZXJhdG9yUHJvdG90eXBlIiwidGhpcyIsImdldFByb3RvIiwiZ2V0UHJvdG90eXBlT2YiLCJOYXRpdmVJdGVyYXRvclByb3RvdHlwZSIsInZhbHVlcyIsIkdwIiwiZGVmaW5lSXRlcmF0b3JNZXRob2RzIiwibWV0aG9kIiwiX2ludm9rZSIsIkFzeW5jSXRlcmF0b3IiLCJQcm9taXNlSW1wbCIsImludm9rZSIsInJlc29sdmUiLCJyZWplY3QiLCJyZWNvcmQiLCJyZXN1bHQiLCJfX2F3YWl0IiwidW53cmFwcGVkIiwicHJldmlvdXNQcm9taXNlIiwiY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmciLCJzdGF0ZSIsIkVycm9yIiwiZG9uZVJlc3VsdCIsImRlbGVnYXRlIiwiZGVsZWdhdGVSZXN1bHQiLCJtYXliZUludm9rZURlbGVnYXRlIiwic2VudCIsIl9zZW50IiwiZGlzcGF0Y2hFeGNlcHRpb24iLCJhYnJ1cHQiLCJkb25lIiwibWV0aG9kTmFtZSIsIlR5cGVFcnJvciIsImluZm8iLCJyZXN1bHROYW1lIiwibmV4dCIsIm5leHRMb2MiLCJwdXNoVHJ5RW50cnkiLCJsb2NzIiwiZW50cnkiLCJ0cnlMb2MiLCJjYXRjaExvYyIsImZpbmFsbHlMb2MiLCJhZnRlckxvYyIsInRyeUVudHJpZXMiLCJwdXNoIiwicmVzZXRUcnlFbnRyeSIsImNvbXBsZXRpb24iLCJyZXNldCIsIml0ZXJhYmxlIiwiaXRlcmF0b3JNZXRob2QiLCJpc05hTiIsImxlbmd0aCIsImkiLCJkaXNwbGF5TmFtZSIsImlzR2VuZXJhdG9yRnVuY3Rpb24iLCJnZW5GdW4iLCJjdG9yIiwiY29uc3RydWN0b3IiLCJtYXJrIiwic2V0UHJvdG90eXBlT2YiLCJfX3Byb3RvX18iLCJhd3JhcCIsIlByb21pc2UiLCJpdGVyIiwia2V5cyIsInZhbCIsIm9iamVjdCIsInJldmVyc2UiLCJwb3AiLCJza2lwVGVtcFJlc2V0IiwicHJldiIsImNoYXJBdCIsInNsaWNlIiwic3RvcCIsInJvb3RSZWNvcmQiLCJydmFsIiwiZXhjZXB0aW9uIiwiaGFuZGxlIiwibG9jIiwiY2F1Z2h0IiwiaGFzQ2F0Y2giLCJoYXNGaW5hbGx5IiwiZmluYWxseUVudHJ5IiwiY29tcGxldGUiLCJmaW5pc2giLCJ0aHJvd24iLCJkZWxlZ2F0ZVlpZWxkIiwibW9kdWxlIiwicmVnZW5lcmF0b3JSdW50aW1lIiwiYWNjaWRlbnRhbFN0cmljdE1vZGUiLCJnbG9iYWxUaGlzIiwiRnVuY3Rpb24iLCJfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18iLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJjYWNoZWRNb2R1bGUiLCJfX3dlYnBhY2tfbW9kdWxlc19fIl0sInNvdXJjZVJvb3QiOiIifQ== -------------------------------------------------------------------------------- /background.bundle.js: -------------------------------------------------------------------------------- 1 | (()=>{var t={743:(t,e,r)=>{"use strict";var n=r(780),o=r.n(n);const i={randomUUID:"undefined"!=typeof crypto&&crypto.randomUUID&&crypto.randomUUID.bind(crypto)};let a;const c=new Uint8Array(16);function s(){if(!a&&(a="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto),!a))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return a(c)}const u=[];for(let t=0;t<256;++t)u.push((t+256).toString(16).slice(1));const l=function(t,e,r){if(i.randomUUID&&!e&&!t)return i.randomUUID();const n=(t=t||{}).random||(t.rng||s)();if(n[6]=15&n[6]|64,n[8]=63&n[8]|128,e){r=r||0;for(let t=0;t<16;++t)e[r+t]=n[t];return e}return function(t,e=0){return(u[t[e+0]]+u[t[e+1]]+u[t[e+2]]+u[t[e+3]]+"-"+u[t[e+4]]+u[t[e+5]]+"-"+u[t[e+6]]+u[t[e+7]]+"-"+u[t[e+8]]+u[t[e+9]]+"-"+u[t[e+10]]+u[t[e+11]]+u[t[e+12]]+u[t[e+13]]+u[t[e+14]]+u[t[e+15]]).toLowerCase()}(n)},f=[239,187,191];const h="accessToken";let d="Is the following statement true, false, or uncertain? answer in persian",p="";chrome.storage.sync.get(["prompt","apiKey"],(function(t){t&&t.prompt&&(d=t.prompt),t&&t.apiKey&&(p=t.apiKey)}));const y=new(o())(1e4);async function g(){if(y.get(h))return y.get(h);const t=await fetch("https://chat.openai.com/api/auth/session").then((t=>t.json())).catch((()=>({})));if(!t.accessToken)throw new Error("Error");return y.set(h,t.accessToken),t.accessToken}async function v(){const t=await g(),e=await fetch("https://chat.openai.com/backend-api/conversations?offset=0&limit=1",{method:"GET",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`}}).then((t=>t.json())).catch((()=>({})));return 1===e?.items?.length?e.items[0].id:""}async function m(t){const e=await g(),r=await fetch(`https://chat.openai.com/backend-api/conversation/${t}`,{method:"PATCH",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:JSON.stringify({is_visible:!1})}).then((t=>t.json())).catch((()=>({})));return!!r?.success}async function w(t,e){const r=await g(),n={action:"next",messages:[{id:l(),author:{role:"user"},role:"user",content:{content_type:"text",parts:[t]}}],model:"text-davinci-002-render",parent_message_id:l()};await async function(t,e){const{onMessage:r,onError:n,...o}=e,i=await fetch(t,o).catch((t=>n(t))),a=function(t){let e,r,n,o,i,a,c;return s(),{feed:function(t){r=r?r+t:t,e&&function(t){return f.every(((e,r)=>t.charCodeAt(r)===e))}(r)&&(r=r.slice(f.length)),e=!1;const i=r.length;let a=0,c=!1;for(;a0&&(r=r.slice(a))},reset:s};function s(){e=!0,r="",n=0,o=-1,i=void 0,a=void 0,c=""}function u(e,r,n,o){if(0===o)return c.length>0&&(t({type:"event",id:i,event:a||void 0,data:c.slice(0,-1)}),c="",i=void 0),void(a=void 0);const s=n<0,u=e.slice(r,r+(s?o:n));let l=0;l=s?o:" "===e[r+n+1]?n+2:n+1;const f=r+l,h=o-l,d=e.slice(f,f+h).toString();if("data"===u)c+=d?"".concat(d,"\n"):"\n";else if("event"===u)a=d;else if("id"!==u||d.includes("\0")){if("retry"===u){const e=parseInt(d,10);Number.isNaN(e)||t({type:"reconnect-interval",value:e})}}else i=d}}((t=>{"event"===t.type&&r(t.data)}));for await(const t of async function*(t){const e=t.getReader();try{for(;;){const{done:t,value:r}=await e.read();if(t)return;yield r}}finally{e.releaseLock()}}(i.body)){const e=(new TextDecoder).decode(t);a.feed(e)}}("https://chat.openai.com/backend-api/conversation",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${r}`},body:JSON.stringify(n),onMessage(t){if("[DONE]"!==t)try{const r=JSON.parse(t),n=r.message?.content?.parts?.[0];n&&e(n)}catch(e){console.log("sse message",t),console.log(`Error in onMessage: ${e}`)}},onError(t){console.log(`Error in fetchSSE: ${t}`)}})}let b={};function x(t){let e="";for(const r of t)e+=(e?" ":"")+r;return e}chrome.action.onClicked.addListener((function(t){const e=t.id;b[e]||(b[e]=!0,setTimeout((()=>delete b[e]),1e4),chrome.action.setBadgeBackgroundColor({color:[242,38,19,230]}),chrome.action.setBadgeText({text:"fact"}),chrome.scripting.executeScript({target:{tabId:e},files:["content.bundle.js"]}),setTimeout((function(){chrome.action.setBadgeText({text:""})}),1e3))})),chrome.runtime.onConnect.addListener((t=>{t.onMessage.addListener((async(e,r,n)=>{console.debug("received msg ",e.content);try{const r=3e3,n=function(t,e){const r=[],n=t.split(/\s+/);let o="";for(const t of n)o.length+t.length+1<=e?o+=(o?" ":"")+t:(r.push(o),o=t);return o&&r.push(o),r}(e.content,r);let o="";for(const e of n){const r=d+`\n\n${e}`;let n="";await w(r,(e=>{n=e,t.postMessage({answer:x([o,e])})})),await m(await v()),o=x([o,n])+"\n\n"}}catch(e){console.error(e),t.postMessage({error:e.message}),y.delete(h)}}))}))},780:(t,e,r)=>{"use strict";const n=r(918);class o{constructor(t,e){if(this.maxAge=t,this[Symbol.toStringTag]="Map",this.data=new Map,n(this.data),e)for(const[t,r]of e)this.set(t,r)}get size(){return this.data.size}clear(){this.data.clear()}delete(t){return this.data.delete(t)}has(t){return this.data.has(t)}get(t){const e=this.data.get(t);if(e)return e.data}set(t,e){return this.data.set(t,{maxAge:Date.now()+this.maxAge,data:e}),this}values(){return this.createIterator((t=>t[1].data))}keys(){return this.data.keys()}entries(){return this.createIterator((t=>[t[0],t[1].data]))}forEach(t,e){for(const[r,n]of this.entries())t.apply(e,[n,r,this])}[Symbol.iterator](){return this.entries()}*createIterator(t){for(const e of this.data.entries())yield t(e)}}t.exports=o},918:(t,e,r)=>{"use strict";const n=r(931);t.exports=function(t,e="maxAge"){let r,o,i;const a=async()=>{if(void 0!==r)return;const a=async a=>{i=n();const c=a[1][e]-Date.now();return c<=0?(t.delete(a[0]),void i.resolve()):(r=a[0],o=setTimeout((()=>{t.delete(a[0]),i&&i.resolve()}),c),"function"==typeof o.unref&&o.unref(),i.promise)};try{for(const e of t)await a(e)}catch(t){}r=void 0},c=t.set.bind(t);return t.set=(e,n)=>{t.has(e)&&t.delete(e);const s=c(e,n);return r&&r===e&&(r=void 0,void 0!==o&&(clearTimeout(o),o=void 0),void 0!==i&&(i.reject(void 0),i=void 0)),a(),s},a(),t}},931:t=>{"use strict";t.exports=()=>{const t={};return t.promise=new Promise(((e,r)=>{t.resolve=e,t.reject=r})),t}},666:t=>{var e=function(t){"use strict";var e,r=Object.prototype,n=r.hasOwnProperty,o=Object.defineProperty||function(t,e,r){t[e]=r.value},i="function"==typeof Symbol?Symbol:{},a=i.iterator||"@@iterator",c=i.asyncIterator||"@@asyncIterator",s=i.toStringTag||"@@toStringTag";function u(t,e,r){return Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}),t[e]}try{u({},"")}catch(t){u=function(t,e,r){return t[e]=r}}function l(t,e,r,n){var i=e&&e.prototype instanceof v?e:v,a=Object.create(i.prototype),c=new N(n||[]);return o(a,"_invoke",{value:O(t,r,c)}),a}function f(t,e,r){try{return{type:"normal",arg:t.call(e,r)}}catch(t){return{type:"throw",arg:t}}}t.wrap=l;var h="suspendedStart",d="suspendedYield",p="executing",y="completed",g={};function v(){}function m(){}function w(){}var b={};u(b,a,(function(){return this}));var x=Object.getPrototypeOf,E=x&&x(x(I([])));E&&E!==r&&n.call(E,a)&&(b=E);var L=w.prototype=v.prototype=Object.create(b);function j(t){["next","throw","return"].forEach((function(e){u(t,e,(function(t){return this._invoke(e,t)}))}))}function T(t,e){function r(o,i,a,c){var s=f(t[o],t,i);if("throw"!==s.type){var u=s.arg,l=u.value;return l&&"object"==typeof l&&n.call(l,"__await")?e.resolve(l.__await).then((function(t){r("next",t,a,c)}),(function(t){r("throw",t,a,c)})):e.resolve(l).then((function(t){u.value=t,a(u)}),(function(t){return r("throw",t,a,c)}))}c(s.arg)}var i;o(this,"_invoke",{value:function(t,n){function o(){return new e((function(e,o){r(t,n,e,o)}))}return i=i?i.then(o,o):o()}})}function O(t,e,r){var n=h;return function(o,i){if(n===p)throw new Error("Generator is already running");if(n===y){if("throw"===o)throw i;return A()}for(r.method=o,r.arg=i;;){var a=r.delegate;if(a){var c=k(a,r);if(c){if(c===g)continue;return c}}if("next"===r.method)r.sent=r._sent=r.arg;else if("throw"===r.method){if(n===h)throw n=y,r.arg;r.dispatchException(r.arg)}else"return"===r.method&&r.abrupt("return",r.arg);n=p;var s=f(t,e,r);if("normal"===s.type){if(n=r.done?y:d,s.arg===g)continue;return{value:s.arg,done:r.done}}"throw"===s.type&&(n=y,r.method="throw",r.arg=s.arg)}}}function k(t,r){var n=r.method,o=t.iterator[n];if(o===e)return r.delegate=null,"throw"===n&&t.iterator.return&&(r.method="return",r.arg=e,k(t,r),"throw"===r.method)||"return"!==n&&(r.method="throw",r.arg=new TypeError("The iterator does not provide a '"+n+"' method")),g;var i=f(o,t.iterator,r.arg);if("throw"===i.type)return r.method="throw",r.arg=i.arg,r.delegate=null,g;var a=i.arg;return a?a.done?(r[t.resultName]=a.value,r.next=t.nextLoc,"return"!==r.method&&(r.method="next",r.arg=e),r.delegate=null,g):a:(r.method="throw",r.arg=new TypeError("iterator result is not an object"),r.delegate=null,g)}function _(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function S(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function N(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(_,this),this.reset(!0)}function I(t){if(t){var r=t[a];if(r)return r.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var o=-1,i=function r(){for(;++o=0;--i){var a=this.tryEntries[i],c=a.completion;if("root"===a.tryLoc)return o("end");if(a.tryLoc<=this.prev){var s=n.call(a,"catchLoc"),u=n.call(a,"finallyLoc");if(s&&u){if(this.prev=0;--r){var o=this.tryEntries[r];if(o.tryLoc<=this.prev&&n.call(o,"finallyLoc")&&this.prev=0;--e){var r=this.tryEntries[e];if(r.finallyLoc===t)return this.complete(r.completion,r.afterLoc),S(r),g}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.tryLoc===t){var n=r.completion;if("throw"===n.type){var o=n.arg;S(r)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(t,r,n){return this.delegate={iterator:I(t),resultName:r,nextLoc:n},"next"===this.method&&(this.arg=e),g}},t}(t.exports);try{regeneratorRuntime=e}catch(t){"object"==typeof globalThis?globalThis.regeneratorRuntime=e:Function("r","regeneratorRuntime = r")(e)}}},e={};function r(n){var o=e[n];if(void 0!==o)return o.exports;var i=e[n]={exports:{}};return t[n](i,i.exports,r),i.exports}r.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return r.d(e,{a:e}),e},r.d=(t,e)=>{for(var n in e)r.o(e,n)&&!r.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},r.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r(666),r(743)})(); 2 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja2dyb3VuZC5idW5kbGUuanMiLCJtYXBwaW5ncyI6IjhEQUFBLE1BQ0EsR0FDRUEsV0FGbUMsb0JBQVhDLFFBQTBCQSxPQUFPRCxZQUFjQyxPQUFPRCxXQUFXRSxLQUFLRCxTQ0doRyxJQUFJRSxFQUNKLE1BQU1DLEVBQVEsSUFBSUMsV0FBVyxJQUNkLFNBQVNDLElBRXRCLElBQUtILElBRUhBLEVBQW9DLG9CQUFYRixRQUEwQkEsT0FBT0UsaUJBQW1CRixPQUFPRSxnQkFBZ0JELEtBQUtELFNBRXBHRSxHQUNILE1BQU0sSUFBSUksTUFBTSw0R0FJcEIsT0FBT0osRUFBZ0JDLEVBQ3pCLENDWEEsTUFBTUksRUFBWSxHQUVsQixJQUFLLElBQUlDLEVBQUksRUFBR0EsRUFBSSxNQUFPQSxFQUN6QkQsRUFBVUUsTUFBTUQsRUFBSSxLQUFPRSxTQUFTLElBQUlDLE1BQU0sSUNtQmhELFFBeEJBLFNBQVlDLEVBQVNDLEVBQUtDLEdBQ3hCLEdBQUksRUFBT2YsYUFBZWMsSUFBUUQsRUFDaEMsT0FBTyxFQUFPYixhQUloQixNQUFNZ0IsR0FETkgsRUFBVUEsR0FBVyxDQUFDLEdBQ0RJLFNBQVdKLEVBQVFQLEtBQU9BLEtBSy9DLEdBSEFVLEVBQUssR0FBZSxHQUFWQSxFQUFLLEdBQVksR0FDM0JBLEVBQUssR0FBZSxHQUFWQSxFQUFLLEdBQVksSUFFdkJGLEVBQUssQ0FDUEMsRUFBU0EsR0FBVSxFQUVuQixJQUFLLElBQUlOLEVBQUksRUFBR0EsRUFBSSxLQUFNQSxFQUN4QkssRUFBSUMsRUFBU04sR0FBS08sRUFBS1AsR0FHekIsT0FBT0ssQ0FDVCxDQUVBLE9EYkssU0FBeUJJLEVBQUtILEVBQVMsR0FHNUMsT0FBUVAsRUFBVVUsRUFBSUgsRUFBUyxJQUFNUCxFQUFVVSxFQUFJSCxFQUFTLElBQU1QLEVBQVVVLEVBQUlILEVBQVMsSUFBTVAsRUFBVVUsRUFBSUgsRUFBUyxJQUFNLElBQU1QLEVBQVVVLEVBQUlILEVBQVMsSUFBTVAsRUFBVVUsRUFBSUgsRUFBUyxJQUFNLElBQU1QLEVBQVVVLEVBQUlILEVBQVMsSUFBTVAsRUFBVVUsRUFBSUgsRUFBUyxJQUFNLElBQU1QLEVBQVVVLEVBQUlILEVBQVMsSUFBTVAsRUFBVVUsRUFBSUgsRUFBUyxJQUFNLElBQU1QLEVBQVVVLEVBQUlILEVBQVMsS0FBT1AsRUFBVVUsRUFBSUgsRUFBUyxLQUFPUCxFQUFVVSxFQUFJSCxFQUFTLEtBQU9QLEVBQVVVLEVBQUlILEVBQVMsS0FBT1AsRUFBVVUsRUFBSUgsRUFBUyxLQUFPUCxFQUFVVSxFQUFJSCxFQUFTLE1BQU1JLGFBQ3ZmLENDU1NDLENBQWdCSixFQUN6QixFQzRHTUssRUFBTSxDQUFDLElBQUssSUFBSyxLQ2xJdkIsTUFBTUMsRUFBbUIsY0FFekIsSUFBSUMsRUFDRiwwRUFDRUMsRUFBUyxHQUNiQyxPQUFPQyxRQUFRQyxLQUFLQyxJQUFJLENBQUMsU0FBVSxXQUFXLFNBQVVDLEdBQ2xEQSxHQUFTQSxFQUFNTixTQUNqQkEsRUFBU00sRUFBTU4sUUFFYk0sR0FBU0EsRUFBTUwsU0FDakJBLEVBQVNLLEVBQU1MLE9BRW5CLElBRUEsTUFBTU0sRUFBUSxJQUFJQyxJQUFKLENBQWMsS0FFNUJDLGVBQWVDLElBQ2IsR0FBSUgsRUFBTUYsSUFBSU4sR0FDWixPQUFPUSxFQUFNRixJQUFJTixHQUVuQixNQUFNWSxRQUFhQyxNQUFNLDRDQUN0QkMsTUFBTUMsR0FBTUEsRUFBRUMsU0FDZEMsT0FBTSxLQUFNLENBQUcsS0FDbEIsSUFBS0wsRUFBS00sWUFDUixNQUFNLElBQUlqQyxNQUFNLFNBR2xCLE9BREF1QixFQUFNVyxJQUFJbkIsRUFBa0JZLEVBQUtNLGFBQzFCTixFQUFLTSxXQUNkLENBRUFSLGVBQWVVLElBQ2IsTUFBTUYsUUFBb0JQLElBQ3BCQyxRQUFhQyxNQUNqQixxRUFDQSxDQUNFUSxPQUFRLE1BQ1JDLFFBQVMsQ0FDUCxlQUFnQixtQkFDaEJDLGNBQWdCLFVBQVNMLE9BSTVCSixNQUFNQyxHQUFNQSxFQUFFQyxTQUNkQyxPQUFNLEtBQU0sQ0FBRyxLQUNsQixPQUE0QixJQUF4QkwsR0FBTUwsT0FBT2lCLE9BQ1JaLEVBQUtMLE1BQU0sR0FBR2tCLEdBRWhCLEVBQ1QsQ0FFQWYsZUFBZWdCLEVBQW1CQyxHQUNoQyxNQUFNVCxRQUFvQlAsSUFDcEJDLFFBQWFDLE1BQ2hCLG9EQUFtRGMsSUFDcEQsQ0FDRU4sT0FBUSxRQUNSQyxRQUFTLENBQ1AsZUFBZ0IsbUJBQ2hCQyxjQUFnQixVQUFTTCxLQUUzQlUsS0FBTUMsS0FBS0MsVUFBVSxDQUFFQyxZQUFZLE1BR3BDakIsTUFBTUMsR0FBTUEsRUFBRUMsU0FDZEMsT0FBTSxLQUFNLENBQUcsS0FDbEIsUUFBSUwsR0FBTW9CLE9BSVosQ0FFQXRCLGVBQWV1QixFQUFXQyxFQUFVQyxHQUNsQyxNQUFNakIsUUFBb0JQLElBQ3BCeUIsRUFBYyxDQUNsQkMsT0FBUSxPQUNSQyxTQUFVLENBQ1IsQ0FDRWIsR0FBSWMsSUFDSkMsT0FBUSxDQUNOQyxLQUFNLFFBRVJBLEtBQU0sT0FDTkMsUUFBUyxDQUNQQyxhQUFjLE9BQ2RDLE1BQU8sQ0FBQ1YsTUFJZFcsTUFBTywwQkFDUEMsa0JBQW1CUCxXQzFGaEI3QixlQUF3QnFDLEVBQVV4RCxHQUN2QyxNQUFNLFVBQUV5RCxFQUFTLFFBQUVDLEtBQVlDLEdBQWlCM0QsRUFDMUNxQixRQUFhQyxNQUFNa0MsRUFBVUcsR0FBY2pDLE9BQU9rQyxHQUFRRixFQUFRRSxLQUNsRUMsRUZOUixTQUFzQkMsR0FDcEIsSUFBSUMsRUFDQUMsRUFDQUMsRUFDQUMsRUFDQUMsRUFDQUMsRUFDQUMsRUFFSixPQURBQyxJQUNPLENBQ0xDLEtBY0YsU0FBY0MsR0FDWlIsRUFBU0EsRUFBU0EsRUFBU1EsRUFBUUEsRUFFL0JULEdBNkdSLFNBQWdCQyxHQUNkLE9BQU94RCxFQUFJaUUsT0FBTSxDQUFDQyxFQUFVQyxJQUFVWCxFQUFPWSxXQUFXRCxLQUFXRCxHQUNyRSxDQS9Hd0JHLENBQU9iLEtBQ3pCQSxFQUFTQSxFQUFPakUsTUFBTVMsRUFBSXlCLFNBRzVCOEIsR0FBZSxFQUNmLE1BQU05QixFQUFTK0IsRUFBTy9CLE9BQ3RCLElBQUk2QyxFQUFXLEVBQ1hDLEdBQXlCLEVBRTdCLEtBQU9ELEVBQVc3QyxHQUFRLENBQ3BCOEMsSUFDdUIsT0FBckJmLEVBQU9jLE1BQ1BBLEVBR0pDLEdBQXlCLEdBRzNCLElBRUlDLEVBRkFDLEdBQWMsRUFDZEMsRUFBY2hCLEVBR2xCLElBQUssSUFBSVMsRUFBUVYsRUFBa0JnQixFQUFhLEdBQUtOLEVBQVExQyxJQUFVMEMsRUFDckVLLEVBQVloQixFQUFPVyxHQUVELE1BQWRLLEdBQXFCRSxFQUFjLEVBQ3JDQSxFQUFjUCxFQUFRRyxFQUNDLE9BQWRFLEdBQ1RELEdBQXlCLEVBQ3pCRSxFQUFhTixFQUFRRyxHQUNFLE9BQWRFLElBQ1RDLEVBQWFOLEVBQVFHLEdBSXpCLEdBQUlHLEVBQWEsRUFBRyxDQUNsQmhCLEVBQW1CaEMsRUFBUzZDLEVBQzVCWixFQUFzQmdCLEVBQ3RCLEtBQ0YsQ0FDRWpCLEVBQW1CLEVBQ25CQyxHQUF1QixFQUd6QmlCLEVBQXFCbkIsRUFBUWMsRUFBVUksRUFBYUQsR0FDcERILEdBQVlHLEVBQWEsQ0FDM0IsQ0FFSUgsSUFBYTdDLEVBQ2YrQixFQUFTLEdBQ0FjLEVBQVcsSUFDcEJkLEVBQVNBLEVBQU9qRSxNQUFNK0UsR0FFMUIsRUFyRUVSLFNBR0YsU0FBU0EsSUFDUFAsR0FBZSxFQUNmQyxFQUFTLEdBQ1RDLEVBQW1CLEVBQ25CQyxHQUF1QixFQUN2QkMsT0FBVSxFQUNWQyxPQUFZLEVBQ1pDLEVBQU8sRUFDVCxDQTREQSxTQUFTYyxFQUFxQkMsRUFBWVQsRUFBT08sRUFBYUQsR0FDNUQsR0FBbUIsSUFBZkEsRUFhRixPQVpJWixFQUFLcEMsT0FBUyxJQUNoQjZCLEVBQVEsQ0FDTnVCLEtBQU0sUUFDTm5ELEdBQUlpQyxFQUNKbUIsTUFBT2xCLFFBQWEsRUFDcEJDLEtBQU1BLEVBQUt0RSxNQUFNLEdBQUksS0FFdkJzRSxFQUFPLEdBQ1BGLE9BQVUsUUFHWkMsT0FBWSxHQUlkLE1BQU1tQixFQUFVTCxFQUFjLEVBQ3hCTSxFQUFRSixFQUFXckYsTUFBTTRFLEVBQU9BLEdBQVNZLEVBQVVOLEVBQWFDLElBQ3RFLElBQUlPLEVBQU8sRUFHVEEsRUFERUYsRUFDS04sRUFDMEMsTUFBeENHLEVBQVdULEVBQVFPLEVBQWMsR0FDbkNBLEVBQWMsRUFFZEEsRUFBYyxFQUd2QixNQUFNSixFQUFXSCxFQUFRYyxFQUNuQkMsRUFBY1QsRUFBYVEsRUFDM0JFLEVBQVFQLEVBQVdyRixNQUFNK0UsRUFBVUEsRUFBV1ksR0FBYTVGLFdBRWpFLEdBQWMsU0FBVjBGLEVBQ0ZuQixHQUFRc0IsRUFBUSxHQUFHQyxPQUFPRCxFQUFPLE1BQVEsVUFDcEMsR0FBYyxVQUFWSCxFQUNUcEIsRUFBWXVCLE9BQ1AsR0FBYyxPQUFWSCxHQUFtQkcsRUFBTUUsU0FBUyxPQUV0QyxHQUFjLFVBQVZMLEVBQW1CLENBQzVCLE1BQU1NLEVBQVFDLFNBQVNKLEVBQU8sSUFFekJLLE9BQU9DLE1BQU1ILElBQ2hCaEMsRUFBUSxDQUNOdUIsS0FBTSxxQkFDTk0sTUFBT0csR0FHYixPQVZFM0IsRUFBVXdCLENBV2QsQ0FDRixDRTlIaUJPLEVBQWNaLElBQ1IsVUFBZkEsRUFBTUQsTUFDUjVCLEVBQVU2QixFQUFNakIsS0FDbEIsSUFFRixVQUFXLE1BQU1HLEtDWFpyRCxnQkFBb0NnRixHQUN6QyxNQUFNQyxFQUFTRCxFQUFPRSxZQUN0QixJQUNFLE9BQWEsQ0FDWCxNQUFNLEtBQUVDLEVBQUksTUFBRVgsU0FBZ0JTLEVBQU9HLE9BQ3JDLEdBQUlELEVBQ0YsYUFFSVgsQ0FDUixDQUNGLENBQUUsUUFDQVMsRUFBT0ksYUFDVCxDQUNGLENERjRCQyxDQUFvQnBGLEVBQUtnQixNQUFPLENBQ3hELE1BQU1xRSxHQUFNLElBQUlDLGFBQWNDLE9BQU9wQyxHQUNyQ1gsRUFBT1UsS0FBS21DLEVBQ2QsQ0FDRixDRGdGUUcsQ0FBUyxtREFBb0QsQ0FDakUvRSxPQUFRLE9BQ1JDLFFBQVMsQ0FDUCxlQUFnQixtQkFDaEJDLGNBQWdCLFVBQVNMLEtBRTNCVSxLQUFNQyxLQUFLQyxVQUFVTSxHQUNyQlksU0FBQUEsQ0FBVXFELEdBQ1IsR0FBZ0IsV0FBWkEsRUFHSixJQUNFLE1BQU16QyxFQUFPL0IsS0FBS3lFLE1BQU1ELEdBQ2xCRSxFQUFPM0MsRUFBS3lDLFNBQVMzRCxTQUFTRSxRQUFRLEdBQ3hDMkQsR0FDRnBFLEVBQVNvRSxFQUViLENBQUUsTUFBT3BELEdBQ1BxRCxRQUFRQyxJQUFJLGNBQWVKLEdBQzNCRyxRQUFRQyxJQUFLLHVCQUFzQnRELElBQ3JDLENBQ0YsRUFDQUYsT0FBQUEsQ0FBUUUsR0FDTnFELFFBQVFDLElBQUssc0JBQXFCdEQsSUFDcEMsR0FFSixDQUVBLElBQUl1RCxFQUFrQixDQUFDLEVBMkV2QixTQUFTQyxFQUFpQkMsR0FDeEIsSUFBSUMsRUFBa0IsR0FDdEIsSUFBSyxNQUFNQyxLQUFXRixFQUNwQkMsSUFBb0JBLEVBQWtCLElBQU0sSUFBTUMsRUFHcEQsT0FBT0QsQ0FDVCxDQTVEQTFHLE9BQU9rQyxPQUFPMEUsVUFBVUMsYUFyQnhCLFNBQXdCQyxHQUN0QixNQUFNQyxFQUFRRCxFQUFJeEYsR0FFZGlGLEVBQWdCUSxLQUVwQlIsRUFBZ0JRLElBQVMsRUFDekJDLFlBQVcsV0FBYVQsRUFBZ0JRLElBQVEsS0FFaEQvRyxPQUFPa0MsT0FBTytFLHdCQUF3QixDQUFFQyxNQUFPLENBQUMsSUFBSyxHQUFJLEdBQUksT0FDN0RsSCxPQUFPa0MsT0FBT2lGLGFBQWEsQ0FBRWYsS0FBTSxTQUVuQ3BHLE9BQU9vSCxVQUFVQyxjQUFjLENBQzdCQyxPQUFRLENBQUVQLFNBQ1ZRLE1BQU8sQ0FBQyx1QkFHVlAsWUFBVyxXQUNUaEgsT0FBT2tDLE9BQU9pRixhQUFhLENBQUVmLEtBQU0sSUFDckMsR0FBRyxLQUNMLElBSUFwRyxPQUFPd0gsUUFBUUMsVUFBVVosYUFBYWEsSUFDcENBLEVBQUs3RSxVQUFVZ0UsYUFBWXRHLE1BQU9vSCxFQUFTQyxFQUFRQyxLQUNqRHhCLFFBQVF5QixNQUFNLGdCQUFpQkgsRUFBUXBGLFNBQ3ZDLElBQ0UsTUFBTXdGLEVBQVksSUFFWkMsRUF3QlosU0FBNkI1QixFQUFNMkIsR0FDakMsTUFBTUMsRUFBUyxHQUNUQyxFQUFRN0IsRUFBSzhCLE1BQU0sT0FDekIsSUFBSUMsRUFBZSxHQUVuQixJQUFLLE1BQU1DLEtBQVFILEVBQ2JFLEVBQWE5RyxPQUFTK0csRUFBSy9HLE9BQVMsR0FBSzBHLEVBQzNDSSxJQUFpQkEsRUFBZSxJQUFNLElBQU1DLEdBRTVDSixFQUFPL0ksS0FBS2tKLEdBQ1pBLEVBQWVDLEdBUW5CLE9BSklELEdBQ0ZILEVBQU8vSSxLQUFLa0osR0FHUEgsQ0FDVCxDQTNDcUJLLENBREZWLEVBQVFwRixRQUNvQndGLEdBRXpDLElBQUlPLEVBQWlCLEdBQ3JCLElBQUssTUFBTTFFLEtBQVNvRSxFQUFRLENBQzFCLE1BQU1PLEVBQWN6SSxFQUFVLE9BQU04RCxJQUNwQyxJQUFJNEUsRUFBZ0IsU0FDZDFHLEVBQVd5RyxHQUFjRSxJQUM3QkQsRUFBZ0JDLEVBQ2hCZixFQUFLZ0IsWUFBWSxDQUNmRCxPQUFRakMsRUFBaUIsQ0FBQzhCLEVBQWdCRyxLQUMxQyxVQUVFbEgsUUFBeUJOLEtBQy9CcUgsRUFDRTlCLEVBQWlCLENBQUM4QixFQUFnQkUsSUFBa0IsTUFDeEQsQ0FDRixDQUFFLE1BQU94RixHQUNQcUQsUUFBUXNDLE1BQU0zRixHQUNkMEUsRUFBS2dCLFlBQVksQ0FBRUMsTUFBTzNGLEVBQUlrRCxVQUM5QjdGLEVBQU11SSxPQUFPL0ksRUFDZixJQUNBLEcsNkJHN0tKLE1BQU1nSixFQUFnQixFQUFRLEtBQzlCLE1BQU12SSxFQUNGLFdBQUF3SSxDQUFZQyxFQUFRdEYsR0FNaEIsR0FMQXVGLEtBQUtELE9BQVNBLEVBQ2RDLEtBQUtDLE9BQU9DLGFBQWUsTUFDM0JGLEtBQUt2RixLQUFPLElBQUkwRixJQUVoQk4sRUFBY0csS0FBS3ZGLE1BQ2ZBLEVBQ0EsSUFBSyxNQUFPMkYsRUFBS3JFLEtBQVV0QixFQUN2QnVGLEtBQUtoSSxJQUFJb0ksRUFBS3JFLEVBRzFCLENBQ0EsUUFBSXNFLEdBQ0EsT0FBT0wsS0FBS3ZGLEtBQUs0RixJQUNyQixDQUNBLEtBQUFDLEdBQ0lOLEtBQUt2RixLQUFLNkYsT0FDZCxDQUNBLE9BQU9GLEdBQ0gsT0FBT0osS0FBS3ZGLEtBQUttRixPQUFPUSxFQUM1QixDQUNBLEdBQUFHLENBQUlILEdBQ0EsT0FBT0osS0FBS3ZGLEtBQUs4RixJQUFJSCxFQUN6QixDQUNBLEdBQUFqSixDQUFJaUosR0FDQSxNQUFNckUsRUFBUWlFLEtBQUt2RixLQUFLdEQsSUFBSWlKLEdBQzVCLEdBQUlyRSxFQUNBLE9BQU9BLEVBQU10QixJQUdyQixDQUNBLEdBQUF6QyxDQUFJb0ksRUFBS3JFLEdBS0wsT0FKQWlFLEtBQUt2RixLQUFLekMsSUFBSW9JLEVBQUssQ0FDZkwsT0FBUVMsS0FBS0MsTUFBUVQsS0FBS0QsT0FDMUJ0RixLQUFNc0IsSUFFSGlFLElBQ1gsQ0FDQSxNQUFBVSxHQUNJLE9BQU9WLEtBQUtXLGdCQUFlQyxHQUFRQSxFQUFLLEdBQUduRyxNQUMvQyxDQUNBLElBQUFvRyxHQUNJLE9BQU9iLEtBQUt2RixLQUFLb0csTUFDckIsQ0FDQSxPQUFBQyxHQUNJLE9BQU9kLEtBQUtXLGdCQUFlQyxHQUFRLENBQUNBLEVBQUssR0FBSUEsRUFBSyxHQUFHbkcsT0FDekQsQ0FDQSxPQUFBc0csQ0FBUUMsRUFBWUMsR0FDaEIsSUFBSyxNQUFPYixFQUFLckUsS0FBVWlFLEtBQUtjLFVBQzVCRSxFQUFXRSxNQUFNRCxFQUFTLENBQUNsRixFQUFPcUUsRUFBS0osTUFFL0MsQ0FDQSxDQUFDQyxPQUFPa0IsWUFDSixPQUFPbkIsS0FBS2MsU0FDaEIsQ0FDQSxlQUFDSCxDQUFlUyxHQUNaLElBQUssTUFBTVIsS0FBUVosS0FBS3ZGLEtBQUtxRyxnQkFDbkJNLEVBQVdSLEVBRXpCLEVBRUpTLEVBQU9DLFFBQVVoSyxDLDZCQy9EakIsTUFBTWlLLEVBQVMsRUFBUSxLQTJFdkJGLEVBQU9DLFFBMUVQLFNBQXVCRSxFQUFLQyxFQUFXLFVBQ25DLElBQUlDLEVBQ0FDLEVBQ0FDLEVBQ0osTUFBTUMsRUFBVXRLLFVBQ1osUUFBc0J1SyxJQUFsQkosRUFFQSxPQUVKLE1BQU1LLEVBQWF4SyxNQUFPcUosSUFDdEJnQixFQUFxQkwsSUFDckIsTUFBTVMsRUFBUXBCLEVBQUssR0FBR2EsR0FBWWpCLEtBQUtDLE1BQ3ZDLE9BQUl1QixHQUFTLEdBRVRSLEVBQUk1QixPQUFPZ0IsRUFBSyxTQUNoQmdCLEVBQW1CSyxZQUl2QlAsRUFBZ0JkLEVBQUssR0FDckJlLEVBQWtCM0QsWUFBVyxLQUV6QndELEVBQUk1QixPQUFPZ0IsRUFBSyxJQUNaZ0IsR0FDQUEsRUFBbUJLLFNBQ3ZCLEdBQ0RELEdBRWtDLG1CQUExQkwsRUFBZ0JPLE9BRXZCUCxFQUFnQk8sUUFFYk4sRUFBbUJPLFFBQU8sRUFFckMsSUFDSSxJQUFLLE1BQU1DLEtBQVNaLFFBQ1ZPLEVBQVdLLEVBRXpCLENBQ0EsTUFBT0MsR0FFUCxDQUNBWCxPQUFnQkksQ0FBUyxFQWF2QlEsRUFBY2QsRUFBSXhKLElBQUl2QyxLQUFLK0wsR0FpQmpDLE9BaEJBQSxFQUFJeEosSUFBTSxDQUFDb0ksRUFBS3JFLEtBQ1J5RixFQUFJakIsSUFBSUgsSUFFUm9CLEVBQUk1QixPQUFPUSxHQUdmLE1BQU1tQyxFQUFTRCxFQUFZbEMsRUFBS3JFLEdBT2hDLE9BTEkyRixHQUFpQkEsSUFBa0J0QixJQW5CdkNzQixPQUFnQkksT0FDUUEsSUFBcEJILElBQ0FhLGFBQWFiLEdBQ2JBLE9BQWtCRyxRQUVLQSxJQUF2QkYsSUFDQUEsRUFBbUJhLFlBQU9YLEdBQzFCRixPQUFxQkUsSUFnQnpCRCxJQUNPVSxDQUFNLEVBRWpCVixJQUNPTCxDQUNYLEMsdUJDMUVBSCxFQUFPQyxRQUFVLEtBQ2hCLE1BQU1vQixFQUFNLENBQUMsRUFPYixPQUxBQSxFQUFJUCxRQUFVLElBQUlRLFNBQVEsQ0FBQ1YsRUFBU1EsS0FDbkNDLEVBQUlULFFBQVVBLEVBQ2RTLEVBQUlELE9BQVNBLENBQU0sSUFHYkMsQ0FBRyxDLFVDRlgsSUFBSWxFLEVBQVcsU0FBVThDLEdBQ3ZCLGFBRUEsSUFHSVEsRUFIQWMsRUFBS0MsT0FBT0MsVUFDWkMsRUFBU0gsRUFBR0ksZUFDWkMsRUFBaUJKLE9BQU9JLGdCQUFrQixTQUFVQyxFQUFLOUMsRUFBSytDLEdBQVFELEVBQUk5QyxHQUFPK0MsRUFBS3BILEtBQU8sRUFFN0ZxSCxFQUE0QixtQkFBWG5ELE9BQXdCQSxPQUFTLENBQUMsRUFDbkRvRCxFQUFpQkQsRUFBUWpDLFVBQVksYUFDckNtQyxFQUFzQkYsRUFBUUcsZUFBaUIsa0JBQy9DQyxFQUFvQkosRUFBUWxELGFBQWUsZ0JBRS9DLFNBQVN1RCxFQUFPUCxFQUFLOUMsRUFBS3JFLEdBT3hCLE9BTkE4RyxPQUFPSSxlQUFlQyxFQUFLOUMsRUFBSyxDQUM5QnJFLE1BQU9BLEVBQ1AySCxZQUFZLEVBQ1pDLGNBQWMsRUFDZEMsVUFBVSxJQUVMVixFQUFJOUMsRUFDYixDQUNBLElBRUVxRCxFQUFPLENBQUMsRUFBRyxHQUNiLENBQUUsTUFBT3pKLEdBQ1B5SixFQUFTLFNBQVNQLEVBQUs5QyxFQUFLckUsR0FDMUIsT0FBT21ILEVBQUk5QyxHQUFPckUsQ0FDcEIsQ0FDRixDQUVBLFNBQVM4SCxFQUFLQyxFQUFTQyxFQUFTQyxFQUFNQyxHQUVwQyxJQUFJQyxFQUFpQkgsR0FBV0EsRUFBUWpCLHFCQUFxQnFCLEVBQVlKLEVBQVVJLEVBQy9FQyxFQUFZdkIsT0FBT3dCLE9BQU9ILEVBQWVwQixXQUN6Q3dCLEVBQVUsSUFBSUMsRUFBUU4sR0FBZSxJQU16QyxPQUZBaEIsRUFBZW1CLEVBQVcsVUFBVyxDQUFFckksTUFBT3lJLEVBQWlCVixFQUFTRSxFQUFNTSxLQUV2RUYsQ0FDVCxDQWFBLFNBQVNLLEVBQVNDLEVBQUl4QixFQUFLeUIsR0FDekIsSUFDRSxNQUFPLENBQUVsSixLQUFNLFNBQVVrSixJQUFLRCxFQUFHRSxLQUFLMUIsRUFBS3lCLEdBQzdDLENBQUUsTUFBTzNLLEdBQ1AsTUFBTyxDQUFFeUIsS0FBTSxRQUFTa0osSUFBSzNLLEVBQy9CLENBQ0YsQ0FsQkFzSCxFQUFRdUMsS0FBT0EsRUFvQmYsSUFBSWdCLEVBQXlCLGlCQUN6QkMsRUFBeUIsaUJBQ3pCQyxFQUFvQixZQUNwQkMsRUFBb0IsWUFJcEJDLEVBQW1CLENBQUMsRUFNeEIsU0FBU2QsSUFBYSxDQUN0QixTQUFTZSxJQUFxQixDQUM5QixTQUFTQyxJQUE4QixDQUl2QyxJQUFJQyxFQUFvQixDQUFDLEVBQ3pCM0IsRUFBTzJCLEVBQW1CL0IsR0FBZ0IsV0FDeEMsT0FBT3JELElBQ1QsSUFFQSxJQUFJcUYsRUFBV3hDLE9BQU95QyxlQUNsQkMsRUFBMEJGLEdBQVlBLEVBQVNBLEVBQVMzRSxFQUFPLE1BQy9ENkUsR0FDQUEsSUFBNEIzQyxHQUM1QkcsRUFBTzZCLEtBQUtXLEVBQXlCbEMsS0FHdkMrQixFQUFvQkcsR0FHdEIsSUFBSUMsRUFBS0wsRUFBMkJyQyxVQUNsQ3FCLEVBQVVyQixVQUFZRCxPQUFPd0IsT0FBT2UsR0FnQnRDLFNBQVNLLEVBQXNCM0MsR0FDN0IsQ0FBQyxPQUFRLFFBQVMsVUFBVS9CLFNBQVEsU0FBUzdJLEdBQzNDdUwsRUFBT1gsRUFBVzVLLEdBQVEsU0FBU3lNLEdBQ2pDLE9BQU8zRSxLQUFLMEYsUUFBUXhOLEVBQVF5TSxFQUM5QixHQUNGLEdBQ0YsQ0ErQkEsU0FBU2dCLEVBQWN2QixFQUFXd0IsR0FDaEMsU0FBU0MsRUFBTzNOLEVBQVF5TSxFQUFLMUMsRUFBU1EsR0FDcEMsSUFBSXFELEVBQVNyQixFQUFTTCxFQUFVbE0sR0FBU2tNLEVBQVdPLEdBQ3BELEdBQW9CLFVBQWhCbUIsRUFBT3JLLEtBRUosQ0FDTCxJQUFJOEcsRUFBU3VELEVBQU9uQixJQUNoQjVJLEVBQVF3RyxFQUFPeEcsTUFDbkIsT0FBSUEsR0FDaUIsaUJBQVZBLEdBQ1BnSCxFQUFPNkIsS0FBSzdJLEVBQU8sV0FDZDZKLEVBQVkzRCxRQUFRbEcsRUFBTWdLLFNBQVNwTyxNQUFLLFNBQVNvRSxHQUN0RDhKLEVBQU8sT0FBUTlKLEVBQU9rRyxFQUFTUSxFQUNqQyxJQUFHLFNBQVN6SSxHQUNWNkwsRUFBTyxRQUFTN0wsRUFBS2lJLEVBQVNRLEVBQ2hDLElBR0ttRCxFQUFZM0QsUUFBUWxHLEdBQU9wRSxNQUFLLFNBQVNxTyxHQUk5Q3pELEVBQU94RyxNQUFRaUssRUFDZi9ELEVBQVFNLEVBQ1YsSUFBRyxTQUFTNUMsR0FHVixPQUFPa0csRUFBTyxRQUFTbEcsRUFBT3NDLEVBQVNRLEVBQ3pDLEdBQ0YsQ0F6QkVBLEVBQU9xRCxFQUFPbkIsSUEwQmxCLENBRUEsSUFBSXNCLEVBZ0NKaEQsRUFBZWpELEtBQU0sVUFBVyxDQUFFakUsTUE5QmxDLFNBQWlCN0QsRUFBUXlNLEdBQ3ZCLFNBQVN1QixJQUNQLE9BQU8sSUFBSU4sR0FBWSxTQUFTM0QsRUFBU1EsR0FDdkNvRCxFQUFPM04sRUFBUXlNLEVBQUsxQyxFQUFTUSxFQUMvQixHQUNGLENBRUEsT0FBT3dELEVBYUxBLEVBQWtCQSxFQUFnQnRPLEtBQ2hDdU8sRUFHQUEsR0FDRUEsR0FDUixHQUtGLENBMEJBLFNBQVMxQixFQUFpQlYsRUFBU0UsRUFBTU0sR0FDdkMsSUFBSTZCLEVBQVF0QixFQUVaLE9BQU8sU0FBZ0IzTSxFQUFReU0sR0FDN0IsR0FBSXdCLElBQVVwQixFQUNaLE1BQU0sSUFBSWpQLE1BQU0sZ0NBR2xCLEdBQUlxUSxJQUFVbkIsRUFBbUIsQ0FDL0IsR0FBZSxVQUFYOU0sRUFDRixNQUFNeU0sRUFLUixPQUFPeUIsR0FDVCxDQUtBLElBSEE5QixFQUFRcE0sT0FBU0EsRUFDakJvTSxFQUFRSyxJQUFNQSxJQUVELENBQ1gsSUFBSTBCLEVBQVcvQixFQUFRK0IsU0FDdkIsR0FBSUEsRUFBVSxDQUNaLElBQUlDLEVBQWlCQyxFQUFvQkYsRUFBVS9CLEdBQ25ELEdBQUlnQyxFQUFnQixDQUNsQixHQUFJQSxJQUFtQnJCLEVBQWtCLFNBQ3pDLE9BQU9xQixDQUNULENBQ0YsQ0FFQSxHQUF1QixTQUFuQmhDLEVBQVFwTSxPQUdWb00sRUFBUWtDLEtBQU9sQyxFQUFRbUMsTUFBUW5DLEVBQVFLLFNBRWxDLEdBQXVCLFVBQW5CTCxFQUFRcE0sT0FBb0IsQ0FDckMsR0FBSWlPLElBQVV0QixFQUVaLE1BREFzQixFQUFRbkIsRUFDRlYsRUFBUUssSUFHaEJMLEVBQVFvQyxrQkFBa0JwQyxFQUFRSyxJQUVwQyxLQUE4QixXQUFuQkwsRUFBUXBNLFFBQ2pCb00sRUFBUXFDLE9BQU8sU0FBVXJDLEVBQVFLLEtBR25Dd0IsRUFBUXBCLEVBRVIsSUFBSWUsRUFBU3JCLEVBQVNYLEVBQVNFLEVBQU1NLEdBQ3JDLEdBQW9CLFdBQWhCd0IsRUFBT3JLLEtBQW1CLENBTzVCLEdBSkEwSyxFQUFRN0IsRUFBUTVILEtBQ1pzSSxFQUNBRixFQUVBZ0IsRUFBT25CLE1BQVFNLEVBQ2pCLFNBR0YsTUFBTyxDQUNMbEosTUFBTytKLEVBQU9uQixJQUNkakksS0FBTTRILEVBQVE1SCxLQUdsQixDQUEyQixVQUFoQm9KLEVBQU9ySyxPQUNoQjBLLEVBQVFuQixFQUdSVixFQUFRcE0sT0FBUyxRQUNqQm9NLEVBQVFLLElBQU1tQixFQUFPbkIsSUFFekIsQ0FDRixDQUNGLENBTUEsU0FBUzRCLEVBQW9CRixFQUFVL0IsR0FDckMsSUFBSXNDLEVBQWF0QyxFQUFRcE0sT0FDckJBLEVBQVNtTyxFQUFTbEYsU0FBU3lGLEdBQy9CLEdBQUkxTyxJQUFXNEosRUFPYixPQUhBd0MsRUFBUStCLFNBQVcsS0FHQSxVQUFmTyxHQUEwQlAsRUFBU2xGLFNBQWlCLFNBR3REbUQsRUFBUXBNLE9BQVMsU0FDakJvTSxFQUFRSyxJQUFNN0MsRUFDZHlFLEVBQW9CRixFQUFVL0IsR0FFUCxVQUFuQkEsRUFBUXBNLFNBTUssV0FBZjBPLElBQ0Z0QyxFQUFRcE0sT0FBUyxRQUNqQm9NLEVBQVFLLElBQU0sSUFBSWtDLFVBQ2hCLG9DQUFzQ0QsRUFBYSxhQU41QzNCLEVBWWIsSUFBSWEsRUFBU3JCLEVBQVN2TSxFQUFRbU8sRUFBU2xGLFNBQVVtRCxFQUFRSyxLQUV6RCxHQUFvQixVQUFoQm1CLEVBQU9ySyxLQUlULE9BSEE2SSxFQUFRcE0sT0FBUyxRQUNqQm9NLEVBQVFLLElBQU1tQixFQUFPbkIsSUFDckJMLEVBQVErQixTQUFXLEtBQ1pwQixFQUdULElBQUk2QixFQUFPaEIsRUFBT25CLElBRWxCLE9BQU1tQyxFQU9GQSxFQUFLcEssTUFHUDRILEVBQVErQixFQUFTVSxZQUFjRCxFQUFLL0ssTUFHcEN1SSxFQUFRMEMsS0FBT1gsRUFBU1ksUUFRRCxXQUFuQjNDLEVBQVFwTSxTQUNWb00sRUFBUXBNLE9BQVMsT0FDakJvTSxFQUFRSyxJQUFNN0MsR0FVbEJ3QyxFQUFRK0IsU0FBVyxLQUNacEIsR0FORTZCLEdBM0JQeEMsRUFBUXBNLE9BQVMsUUFDakJvTSxFQUFRSyxJQUFNLElBQUlrQyxVQUFVLG9DQUM1QnZDLEVBQVErQixTQUFXLEtBQ1pwQixFQStCWCxDQXFCQSxTQUFTaUMsRUFBYUMsR0FDcEIsSUFBSS9FLEVBQVEsQ0FBRWdGLE9BQVFELEVBQUssSUFFdkIsS0FBS0EsSUFDUC9FLEVBQU1pRixTQUFXRixFQUFLLElBR3BCLEtBQUtBLElBQ1AvRSxFQUFNa0YsV0FBYUgsRUFBSyxHQUN4Qi9FLEVBQU1tRixTQUFXSixFQUFLLElBR3hCbkgsS0FBS3dILFdBQVd2UixLQUFLbU0sRUFDdkIsQ0FFQSxTQUFTcUYsRUFBY3JGLEdBQ3JCLElBQUkwRCxFQUFTMUQsRUFBTXNGLFlBQWMsQ0FBQyxFQUNsQzVCLEVBQU9ySyxLQUFPLGdCQUNQcUssRUFBT25CLElBQ2R2QyxFQUFNc0YsV0FBYTVCLENBQ3JCLENBRUEsU0FBU3ZCLEVBQVFOLEdBSWZqRSxLQUFLd0gsV0FBYSxDQUFDLENBQUVKLE9BQVEsU0FDN0JuRCxFQUFZbEQsUUFBUW1HLEVBQWNsSCxNQUNsQ0EsS0FBS3RGLE9BQU0sRUFDYixDQThCQSxTQUFTZ0csRUFBT2lILEdBQ2QsR0FBSUEsRUFBVSxDQUNaLElBQUlDLEVBQWlCRCxFQUFTdEUsR0FDOUIsR0FBSXVFLEVBQ0YsT0FBT0EsRUFBZWhELEtBQUsrQyxHQUc3QixHQUE2QixtQkFBbEJBLEVBQVNYLEtBQ2xCLE9BQU9XLEVBR1QsSUFBS3RMLE1BQU1zTCxFQUFTdFAsUUFBUyxDQUMzQixJQUFJckMsR0FBSyxFQUFHZ1IsRUFBTyxTQUFTQSxJQUMxQixPQUFTaFIsRUFBSTJSLEVBQVN0UCxRQUNwQixHQUFJMEssRUFBTzZCLEtBQUsrQyxFQUFVM1IsR0FHeEIsT0FGQWdSLEVBQUtqTCxNQUFRNEwsRUFBUzNSLEdBQ3RCZ1IsRUFBS3RLLE1BQU8sRUFDTHNLLEVBT1gsT0FIQUEsRUFBS2pMLE1BQVErRixFQUNia0YsRUFBS3RLLE1BQU8sRUFFTHNLLENBQ1QsRUFFQSxPQUFPQSxFQUFLQSxLQUFPQSxDQUNyQixDQUNGLENBR0EsTUFBTyxDQUFFQSxLQUFNWixFQUNqQixDQUdBLFNBQVNBLElBQ1AsTUFBTyxDQUFFckssTUFBTytGLEVBQVdwRixNQUFNLEVBQ25DLENBOE1BLE9Bbm5CQXdJLEVBQWtCcEMsVUFBWXFDLEVBQzlCbEMsRUFBZXVDLEVBQUksY0FBZSxDQUFFekosTUFBT29KLEVBQTRCeEIsY0FBYyxJQUNyRlYsRUFDRWtDLEVBQ0EsY0FDQSxDQUFFcEosTUFBT21KLEVBQW1CdkIsY0FBYyxJQUU1Q3VCLEVBQWtCMkMsWUFBY3BFLEVBQzlCMEIsRUFDQTNCLEVBQ0EscUJBYUZsQyxFQUFRd0csb0JBQXNCLFNBQVNDLEdBQ3JDLElBQUlDLEVBQXlCLG1CQUFYRCxHQUF5QkEsRUFBT2pJLFlBQ2xELFFBQU9rSSxJQUNIQSxJQUFTOUMsR0FHMkIsdUJBQW5DOEMsRUFBS0gsYUFBZUcsRUFBS0MsTUFFaEMsRUFFQTNHLEVBQVE0RyxLQUFPLFNBQVNILEdBUXRCLE9BUElsRixPQUFPc0YsZUFDVHRGLE9BQU9zRixlQUFlSixFQUFRNUMsSUFFOUI0QyxFQUFPSyxVQUFZakQsRUFDbkIxQixFQUFPc0UsRUFBUXZFLEVBQW1CLHNCQUVwQ3VFLEVBQU9qRixVQUFZRCxPQUFPd0IsT0FBT21CLEdBQzFCdUMsQ0FDVCxFQU1BekcsRUFBUStHLE1BQVEsU0FBUzFELEdBQ3ZCLE1BQU8sQ0FBRW9CLFFBQVNwQixFQUNwQixFQXFFQWMsRUFBc0JFLEVBQWM3QyxXQUNwQ1csRUFBT2tDLEVBQWM3QyxVQUFXUSxHQUFxQixXQUNuRCxPQUFPdEQsSUFDVCxJQUNBc0IsRUFBUXFFLGNBQWdCQSxFQUt4QnJFLEVBQVEvSixNQUFRLFNBQVN1TSxFQUFTQyxFQUFTQyxFQUFNQyxFQUFhMkIsUUFDeEMsSUFBaEJBLElBQXdCQSxFQUFjakQsU0FFMUMsSUFBSTJGLEVBQU8sSUFBSTNDLEVBQ2I5QixFQUFLQyxFQUFTQyxFQUFTQyxFQUFNQyxHQUM3QjJCLEdBR0YsT0FBT3RFLEVBQVF3RyxvQkFBb0IvRCxHQUMvQnVFLEVBQ0FBLEVBQUt0QixPQUFPclAsTUFBSyxTQUFTNEssR0FDeEIsT0FBT0EsRUFBTzdGLEtBQU82RixFQUFPeEcsTUFBUXVNLEVBQUt0QixNQUMzQyxHQUNOLEVBc0tBdkIsRUFBc0JELEdBRXRCL0IsRUFBTytCLEVBQUloQyxFQUFtQixhQU85QkMsRUFBTytCLEVBQUluQyxHQUFnQixXQUN6QixPQUFPckQsSUFDVCxJQUVBeUQsRUFBTytCLEVBQUksWUFBWSxXQUNyQixNQUFPLG9CQUNULElBaUNBbEUsRUFBUVQsS0FBTyxTQUFTMEgsR0FDdEIsSUFBSUMsRUFBUzNGLE9BQU8wRixHQUNoQjFILEVBQU8sR0FDWCxJQUFLLElBQUlULEtBQU9vSSxFQUNkM0gsRUFBSzVLLEtBQUttSyxHQU1aLE9BSkFTLEVBQUs0SCxVQUlFLFNBQVN6QixJQUNkLEtBQU9uRyxFQUFLeEksUUFBUSxDQUNsQixJQUFJK0gsRUFBTVMsRUFBSzZILE1BQ2YsR0FBSXRJLEtBQU9vSSxFQUdULE9BRkF4QixFQUFLakwsTUFBUXFFLEVBQ2I0RyxFQUFLdEssTUFBTyxFQUNMc0ssQ0FFWCxDQU1BLE9BREFBLEVBQUt0SyxNQUFPLEVBQ0xzSyxDQUNULENBQ0YsRUFvQ0ExRixFQUFRWixPQUFTQSxFQU1qQjZELEVBQVF6QixVQUFZLENBQ2xCaEQsWUFBYXlFLEVBRWI3SixNQUFPLFNBQVNpTyxHQWNkLEdBYkEzSSxLQUFLNEksS0FBTyxFQUNaNUksS0FBS2dILEtBQU8sRUFHWmhILEtBQUt3RyxLQUFPeEcsS0FBS3lHLE1BQVEzRSxFQUN6QjlCLEtBQUt0RCxNQUFPLEVBQ1pzRCxLQUFLcUcsU0FBVyxLQUVoQnJHLEtBQUs5SCxPQUFTLE9BQ2Q4SCxLQUFLMkUsSUFBTTdDLEVBRVg5QixLQUFLd0gsV0FBV3pHLFFBQVEwRyxJQUVuQmtCLEVBQ0gsSUFBSyxJQUFJVixLQUFRakksS0FFUSxNQUFuQmlJLEVBQUtZLE9BQU8sSUFDWjlGLEVBQU82QixLQUFLNUUsS0FBTWlJLEtBQ2pCNUwsT0FBTzRMLEVBQUs5UixNQUFNLE1BQ3JCNkosS0FBS2lJLEdBQVFuRyxFQUlyQixFQUVBZ0gsS0FBTSxXQUNKOUksS0FBS3RELE1BQU8sRUFFWixJQUNJcU0sRUFEWS9JLEtBQUt3SCxXQUFXLEdBQ0xFLFdBQzNCLEdBQXdCLFVBQXBCcUIsRUFBV3ROLEtBQ2IsTUFBTXNOLEVBQVdwRSxJQUduQixPQUFPM0UsS0FBS2dKLElBQ2QsRUFFQXRDLGtCQUFtQixTQUFTdUMsR0FDMUIsR0FBSWpKLEtBQUt0RCxLQUNQLE1BQU11TSxFQUdSLElBQUkzRSxFQUFVdEUsS0FDZCxTQUFTa0osRUFBT0MsRUFBS0MsR0FZbkIsT0FYQXRELEVBQU9ySyxLQUFPLFFBQ2RxSyxFQUFPbkIsSUFBTXNFLEVBQ2IzRSxFQUFRMEMsS0FBT21DLEVBRVhDLElBR0Y5RSxFQUFRcE0sT0FBUyxPQUNqQm9NLEVBQVFLLElBQU03QyxLQUdOc0gsQ0FDWixDQUVBLElBQUssSUFBSXBULEVBQUlnSyxLQUFLd0gsV0FBV25QLE9BQVMsRUFBR3JDLEdBQUssSUFBS0EsRUFBRyxDQUNwRCxJQUFJb00sRUFBUXBDLEtBQUt3SCxXQUFXeFIsR0FDeEI4UCxFQUFTMUQsRUFBTXNGLFdBRW5CLEdBQXFCLFNBQWpCdEYsRUFBTWdGLE9BSVIsT0FBTzhCLEVBQU8sT0FHaEIsR0FBSTlHLEVBQU1nRixRQUFVcEgsS0FBSzRJLEtBQU0sQ0FDN0IsSUFBSVMsRUFBV3RHLEVBQU82QixLQUFLeEMsRUFBTyxZQUM5QmtILEVBQWF2RyxFQUFPNkIsS0FBS3hDLEVBQU8sY0FFcEMsR0FBSWlILEdBQVlDLEVBQVksQ0FDMUIsR0FBSXRKLEtBQUs0SSxLQUFPeEcsRUFBTWlGLFNBQ3BCLE9BQU82QixFQUFPOUcsRUFBTWlGLFVBQVUsR0FDekIsR0FBSXJILEtBQUs0SSxLQUFPeEcsRUFBTWtGLFdBQzNCLE9BQU80QixFQUFPOUcsRUFBTWtGLFdBR3hCLE1BQU8sR0FBSStCLEdBQ1QsR0FBSXJKLEtBQUs0SSxLQUFPeEcsRUFBTWlGLFNBQ3BCLE9BQU82QixFQUFPOUcsRUFBTWlGLFVBQVUsT0FHM0IsS0FBSWlDLEVBTVQsTUFBTSxJQUFJeFQsTUFBTSwwQ0FMaEIsR0FBSWtLLEtBQUs0SSxLQUFPeEcsRUFBTWtGLFdBQ3BCLE9BQU80QixFQUFPOUcsRUFBTWtGLFdBS3hCLENBQ0YsQ0FDRixDQUNGLEVBRUFYLE9BQVEsU0FBU2xMLEVBQU1rSixHQUNyQixJQUFLLElBQUkzTyxFQUFJZ0ssS0FBS3dILFdBQVduUCxPQUFTLEVBQUdyQyxHQUFLLElBQUtBLEVBQUcsQ0FDcEQsSUFBSW9NLEVBQVFwQyxLQUFLd0gsV0FBV3hSLEdBQzVCLEdBQUlvTSxFQUFNZ0YsUUFBVXBILEtBQUs0SSxNQUNyQjdGLEVBQU82QixLQUFLeEMsRUFBTyxlQUNuQnBDLEtBQUs0SSxLQUFPeEcsRUFBTWtGLFdBQVksQ0FDaEMsSUFBSWlDLEVBQWVuSCxFQUNuQixLQUNGLENBQ0YsQ0FFSW1ILElBQ1UsVUFBVDlOLEdBQ1MsYUFBVEEsSUFDRDhOLEVBQWFuQyxRQUFVekMsR0FDdkJBLEdBQU80RSxFQUFhakMsYUFHdEJpQyxFQUFlLE1BR2pCLElBQUl6RCxFQUFTeUQsRUFBZUEsRUFBYTdCLFdBQWEsQ0FBQyxFQUl2RCxPQUhBNUIsRUFBT3JLLEtBQU9BLEVBQ2RxSyxFQUFPbkIsSUFBTUEsRUFFVDRFLEdBQ0Z2SixLQUFLOUgsT0FBUyxPQUNkOEgsS0FBS2dILEtBQU91QyxFQUFhakMsV0FDbEJyQyxHQUdGakYsS0FBS3dKLFNBQVMxRCxFQUN2QixFQUVBMEQsU0FBVSxTQUFTMUQsRUFBUXlCLEdBQ3pCLEdBQW9CLFVBQWhCekIsRUFBT3JLLEtBQ1QsTUFBTXFLLEVBQU9uQixJQWNmLE1BWG9CLFVBQWhCbUIsRUFBT3JLLE1BQ1MsYUFBaEJxSyxFQUFPckssS0FDVHVFLEtBQUtnSCxLQUFPbEIsRUFBT25CLElBQ00sV0FBaEJtQixFQUFPckssTUFDaEJ1RSxLQUFLZ0osS0FBT2hKLEtBQUsyRSxJQUFNbUIsRUFBT25CLElBQzlCM0UsS0FBSzlILE9BQVMsU0FDZDhILEtBQUtnSCxLQUFPLE9BQ2EsV0FBaEJsQixFQUFPckssTUFBcUI4TCxJQUNyQ3ZILEtBQUtnSCxLQUFPTyxHQUdQdEMsQ0FDVCxFQUVBd0UsT0FBUSxTQUFTbkMsR0FDZixJQUFLLElBQUl0UixFQUFJZ0ssS0FBS3dILFdBQVduUCxPQUFTLEVBQUdyQyxHQUFLLElBQUtBLEVBQUcsQ0FDcEQsSUFBSW9NLEVBQVFwQyxLQUFLd0gsV0FBV3hSLEdBQzVCLEdBQUlvTSxFQUFNa0YsYUFBZUEsRUFHdkIsT0FGQXRILEtBQUt3SixTQUFTcEgsRUFBTXNGLFdBQVl0RixFQUFNbUYsVUFDdENFLEVBQWNyRixHQUNQNkMsQ0FFWCxDQUNGLEVBRUEsTUFBUyxTQUFTbUMsR0FDaEIsSUFBSyxJQUFJcFIsRUFBSWdLLEtBQUt3SCxXQUFXblAsT0FBUyxFQUFHckMsR0FBSyxJQUFLQSxFQUFHLENBQ3BELElBQUlvTSxFQUFRcEMsS0FBS3dILFdBQVd4UixHQUM1QixHQUFJb00sRUFBTWdGLFNBQVdBLEVBQVEsQ0FDM0IsSUFBSXRCLEVBQVMxRCxFQUFNc0YsV0FDbkIsR0FBb0IsVUFBaEI1QixFQUFPckssS0FBa0IsQ0FDM0IsSUFBSWlPLEVBQVM1RCxFQUFPbkIsSUFDcEI4QyxFQUFjckYsRUFDaEIsQ0FDQSxPQUFPc0gsQ0FDVCxDQUNGLENBSUEsTUFBTSxJQUFJNVQsTUFBTSx3QkFDbEIsRUFFQTZULGNBQWUsU0FBU2hDLEVBQVVaLEVBQVlFLEdBYTVDLE9BWkFqSCxLQUFLcUcsU0FBVyxDQUNkbEYsU0FBVVQsRUFBT2lILEdBQ2pCWixXQUFZQSxFQUNaRSxRQUFTQSxHQUdTLFNBQWhCakgsS0FBSzlILFNBR1A4SCxLQUFLMkUsSUFBTTdDLEdBR05tRCxDQUNULEdBT0szRCxDQUVULENBdnRCYyxDQTR0QmlCRCxFQUFPQyxTQUd0QyxJQUNFc0ksbUJBQXFCcEwsQ0FDdkIsQ0FBRSxNQUFPcUwsR0FXbUIsaUJBQWZDLFdBQ1RBLFdBQVdGLG1CQUFxQnBMLEVBRWhDdUwsU0FBUyxJQUFLLHlCQUFkQSxDQUF3Q3ZMLEVBRTVDLEMsR0N2dkJJd0wsRUFBMkIsQ0FBQyxFQUdoQyxTQUFTQyxFQUFvQkMsR0FFNUIsSUFBSUMsRUFBZUgsRUFBeUJFLEdBQzVDLFFBQXFCcEksSUFBakJxSSxFQUNILE9BQU9BLEVBQWE3SSxRQUdyQixJQUFJRCxFQUFTMkksRUFBeUJFLEdBQVksQ0FHakQ1SSxRQUFTLENBQUMsR0FPWCxPQUhBOEksRUFBb0JGLEdBQVU3SSxFQUFRQSxFQUFPQyxRQUFTMkksR0FHL0M1SSxFQUFPQyxPQUNmLENDckJBMkksRUFBb0JJLEVBQUtoSixJQUN4QixJQUFJaUosRUFBU2pKLEdBQVVBLEVBQU9rSixXQUM3QixJQUFPbEosRUFBaUIsUUFDeEIsSUFBTSxFQUVQLE9BREE0SSxFQUFvQk8sRUFBRUYsRUFBUSxDQUFFRyxFQUFHSCxJQUM1QkEsQ0FBTSxFQ0xkTCxFQUFvQk8sRUFBSSxDQUFDbEosRUFBU29KLEtBQ2pDLElBQUksSUFBSXRLLEtBQU9zSyxFQUNYVCxFQUFvQlUsRUFBRUQsRUFBWXRLLEtBQVM2SixFQUFvQlUsRUFBRXJKLEVBQVNsQixJQUM1RXlDLE9BQU9JLGVBQWUzQixFQUFTbEIsRUFBSyxDQUFFc0QsWUFBWSxFQUFNdk0sSUFBS3VULEVBQVd0SyxJQUUxRSxFQ05ENkosRUFBb0JVLEVBQUksQ0FBQ3pILEVBQUswSCxJQUFVL0gsT0FBT0MsVUFBVUUsZUFBZTRCLEtBQUsxQixFQUFLMEgsR0NHbEZYLEVBQW9CLEtBQ01BLEVBQW9CLEkiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncHQvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL25hdGl2ZS5qcyIsIndlYnBhY2s6Ly9ncHQvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3JuZy5qcyIsIndlYnBhY2s6Ly9ncHQvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3N0cmluZ2lmeS5qcyIsIndlYnBhY2s6Ly9ncHQvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3Y0LmpzIiwid2VicGFjazovL2dwdC8uL25vZGVfbW9kdWxlcy9ldmVudHNvdXJjZS1wYXJzZXIvZGlzdC9pbmRleC5tanMiLCJ3ZWJwYWNrOi8vZ3B0Ly4vY2hyb21lL3NyYy9iYWNrZ3JvdW5kL2luZGV4LmpzIiwid2VicGFjazovL2dwdC8uL2Nocm9tZS9zcmMvYmFja2dyb3VuZC9mZXRjaC1zc2UuanMiLCJ3ZWJwYWNrOi8vZ3B0Ly4vY2hyb21lL3NyYy9iYWNrZ3JvdW5kL3N0cmVhbS1hc3luYy1pdGVyYWJsZS5qcyIsIndlYnBhY2s6Ly9ncHQvLi9ub2RlX21vZHVsZXMvZXhwaXJ5LW1hcC9kaXN0L2luZGV4LmpzIiwid2VicGFjazovL2dwdC8uL25vZGVfbW9kdWxlcy9tYXAtYWdlLWNsZWFuZXIvZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly9ncHQvLi9ub2RlX21vZHVsZXMvcC1kZWZlci9pbmRleC5qcyIsIndlYnBhY2s6Ly9ncHQvLi9ub2RlX21vZHVsZXMvcmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lLmpzIiwid2VicGFjazovL2dwdC93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9ncHQvd2VicGFjay9ydW50aW1lL2NvbXBhdCBnZXQgZGVmYXVsdCBleHBvcnQiLCJ3ZWJwYWNrOi8vZ3B0L3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly9ncHQvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9ncHQvd2VicGFjay9zdGFydHVwIl0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IHJhbmRvbVVVSUQgPSB0eXBlb2YgY3J5cHRvICE9PSAndW5kZWZpbmVkJyAmJiBjcnlwdG8ucmFuZG9tVVVJRCAmJiBjcnlwdG8ucmFuZG9tVVVJRC5iaW5kKGNyeXB0byk7XG5leHBvcnQgZGVmYXVsdCB7XG4gIHJhbmRvbVVVSURcbn07IiwiLy8gVW5pcXVlIElEIGNyZWF0aW9uIHJlcXVpcmVzIGEgaGlnaCBxdWFsaXR5IHJhbmRvbSAjIGdlbmVyYXRvci4gSW4gdGhlIGJyb3dzZXIgd2UgdGhlcmVmb3JlXG4vLyByZXF1aXJlIHRoZSBjcnlwdG8gQVBJIGFuZCBkbyBub3Qgc3VwcG9ydCBidWlsdC1pbiBmYWxsYmFjayB0byBsb3dlciBxdWFsaXR5IHJhbmRvbSBudW1iZXJcbi8vIGdlbmVyYXRvcnMgKGxpa2UgTWF0aC5yYW5kb20oKSkuXG5sZXQgZ2V0UmFuZG9tVmFsdWVzO1xuY29uc3Qgcm5kczggPSBuZXcgVWludDhBcnJheSgxNik7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBybmcoKSB7XG4gIC8vIGxhenkgbG9hZCBzbyB0aGF0IGVudmlyb25tZW50cyB0aGF0IG5lZWQgdG8gcG9seWZpbGwgaGF2ZSBhIGNoYW5jZSB0byBkbyBzb1xuICBpZiAoIWdldFJhbmRvbVZhbHVlcykge1xuICAgIC8vIGdldFJhbmRvbVZhbHVlcyBuZWVkcyB0byBiZSBpbnZva2VkIGluIGEgY29udGV4dCB3aGVyZSBcInRoaXNcIiBpcyBhIENyeXB0byBpbXBsZW1lbnRhdGlvbi5cbiAgICBnZXRSYW5kb21WYWx1ZXMgPSB0eXBlb2YgY3J5cHRvICE9PSAndW5kZWZpbmVkJyAmJiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzICYmIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChjcnlwdG8pO1xuXG4gICAgaWYgKCFnZXRSYW5kb21WYWx1ZXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY3J5cHRvLmdldFJhbmRvbVZhbHVlcygpIG5vdCBzdXBwb3J0ZWQuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdXVpZGpzL3V1aWQjZ2V0cmFuZG9tdmFsdWVzLW5vdC1zdXBwb3J0ZWQnKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZ2V0UmFuZG9tVmFsdWVzKHJuZHM4KTtcbn0iLCJpbXBvcnQgdmFsaWRhdGUgZnJvbSAnLi92YWxpZGF0ZS5qcyc7XG4vKipcbiAqIENvbnZlcnQgYXJyYXkgb2YgMTYgYnl0ZSB2YWx1ZXMgdG8gVVVJRCBzdHJpbmcgZm9ybWF0IG9mIHRoZSBmb3JtOlxuICogWFhYWFhYWFgtWFhYWC1YWFhYLVhYWFgtWFhYWFhYWFhYWFhYXG4gKi9cblxuY29uc3QgYnl0ZVRvSGV4ID0gW107XG5cbmZvciAobGV0IGkgPSAwOyBpIDwgMjU2OyArK2kpIHtcbiAgYnl0ZVRvSGV4LnB1c2goKGkgKyAweDEwMCkudG9TdHJpbmcoMTYpLnNsaWNlKDEpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVuc2FmZVN0cmluZ2lmeShhcnIsIG9mZnNldCA9IDApIHtcbiAgLy8gTm90ZTogQmUgY2FyZWZ1bCBlZGl0aW5nIHRoaXMgY29kZSEgIEl0J3MgYmVlbiB0dW5lZCBmb3IgcGVyZm9ybWFuY2VcbiAgLy8gYW5kIHdvcmtzIGluIHdheXMgeW91IG1heSBub3QgZXhwZWN0LiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkL3B1bGwvNDM0XG4gIHJldHVybiAoYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAwXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDFdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMl1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAzXV0gKyAnLScgKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDRdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgNV1dICsgJy0nICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA2XV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDddXSArICctJyArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgOF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA5XV0gKyAnLScgKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDEwXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDExXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDEyXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDEzXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDE0XV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDE1XV0pLnRvTG93ZXJDYXNlKCk7XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeShhcnIsIG9mZnNldCA9IDApIHtcbiAgY29uc3QgdXVpZCA9IHVuc2FmZVN0cmluZ2lmeShhcnIsIG9mZnNldCk7IC8vIENvbnNpc3RlbmN5IGNoZWNrIGZvciB2YWxpZCBVVUlELiAgSWYgdGhpcyB0aHJvd3MsIGl0J3MgbGlrZWx5IGR1ZSB0byBvbmVcbiAgLy8gb2YgdGhlIGZvbGxvd2luZzpcbiAgLy8gLSBPbmUgb3IgbW9yZSBpbnB1dCBhcnJheSB2YWx1ZXMgZG9uJ3QgbWFwIHRvIGEgaGV4IG9jdGV0IChsZWFkaW5nIHRvXG4gIC8vIFwidW5kZWZpbmVkXCIgaW4gdGhlIHV1aWQpXG4gIC8vIC0gSW52YWxpZCBpbnB1dCB2YWx1ZXMgZm9yIHRoZSBSRkMgYHZlcnNpb25gIG9yIGB2YXJpYW50YCBmaWVsZHNcblxuICBpZiAoIXZhbGlkYXRlKHV1aWQpKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKCdTdHJpbmdpZmllZCBVVUlEIGlzIGludmFsaWQnKTtcbiAgfVxuXG4gIHJldHVybiB1dWlkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBzdHJpbmdpZnk7IiwiaW1wb3J0IG5hdGl2ZSBmcm9tICcuL25hdGl2ZS5qcyc7XG5pbXBvcnQgcm5nIGZyb20gJy4vcm5nLmpzJztcbmltcG9ydCB7IHVuc2FmZVN0cmluZ2lmeSB9IGZyb20gJy4vc3RyaW5naWZ5LmpzJztcblxuZnVuY3Rpb24gdjQob3B0aW9ucywgYnVmLCBvZmZzZXQpIHtcbiAgaWYgKG5hdGl2ZS5yYW5kb21VVUlEICYmICFidWYgJiYgIW9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmF0aXZlLnJhbmRvbVVVSUQoKTtcbiAgfVxuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBjb25zdCBybmRzID0gb3B0aW9ucy5yYW5kb20gfHwgKG9wdGlvbnMucm5nIHx8IHJuZykoKTsgLy8gUGVyIDQuNCwgc2V0IGJpdHMgZm9yIHZlcnNpb24gYW5kIGBjbG9ja19zZXFfaGlfYW5kX3Jlc2VydmVkYFxuXG4gIHJuZHNbNl0gPSBybmRzWzZdICYgMHgwZiB8IDB4NDA7XG4gIHJuZHNbOF0gPSBybmRzWzhdICYgMHgzZiB8IDB4ODA7IC8vIENvcHkgYnl0ZXMgdG8gYnVmZmVyLCBpZiBwcm92aWRlZFxuXG4gIGlmIChidWYpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgfHwgMDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTY7ICsraSkge1xuICAgICAgYnVmW29mZnNldCArIGldID0gcm5kc1tpXTtcbiAgICB9XG5cbiAgICByZXR1cm4gYnVmO1xuICB9XG5cbiAgcmV0dXJuIHVuc2FmZVN0cmluZ2lmeShybmRzKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdjQ7IiwiZnVuY3Rpb24gY3JlYXRlUGFyc2VyKG9uUGFyc2UpIHtcbiAgbGV0IGlzRmlyc3RDaHVuaztcbiAgbGV0IGJ1ZmZlcjtcbiAgbGV0IHN0YXJ0aW5nUG9zaXRpb247XG4gIGxldCBzdGFydGluZ0ZpZWxkTGVuZ3RoO1xuICBsZXQgZXZlbnRJZDtcbiAgbGV0IGV2ZW50TmFtZTtcbiAgbGV0IGRhdGE7XG4gIHJlc2V0KCk7XG4gIHJldHVybiB7XG4gICAgZmVlZCxcbiAgICByZXNldFxuICB9O1xuXG4gIGZ1bmN0aW9uIHJlc2V0KCkge1xuICAgIGlzRmlyc3RDaHVuayA9IHRydWU7XG4gICAgYnVmZmVyID0gXCJcIjtcbiAgICBzdGFydGluZ1Bvc2l0aW9uID0gMDtcbiAgICBzdGFydGluZ0ZpZWxkTGVuZ3RoID0gLTE7XG4gICAgZXZlbnRJZCA9IHZvaWQgMDtcbiAgICBldmVudE5hbWUgPSB2b2lkIDA7XG4gICAgZGF0YSA9IFwiXCI7XG4gIH1cblxuICBmdW5jdGlvbiBmZWVkKGNodW5rKSB7XG4gICAgYnVmZmVyID0gYnVmZmVyID8gYnVmZmVyICsgY2h1bmsgOiBjaHVuaztcblxuICAgIGlmIChpc0ZpcnN0Q2h1bmsgJiYgaGFzQm9tKGJ1ZmZlcikpIHtcbiAgICAgIGJ1ZmZlciA9IGJ1ZmZlci5zbGljZShCT00ubGVuZ3RoKTtcbiAgICB9XG5cbiAgICBpc0ZpcnN0Q2h1bmsgPSBmYWxzZTtcbiAgICBjb25zdCBsZW5ndGggPSBidWZmZXIubGVuZ3RoO1xuICAgIGxldCBwb3NpdGlvbiA9IDA7XG4gICAgbGV0IGRpc2NhcmRUcmFpbGluZ05ld2xpbmUgPSBmYWxzZTtcblxuICAgIHdoaWxlIChwb3NpdGlvbiA8IGxlbmd0aCkge1xuICAgICAgaWYgKGRpc2NhcmRUcmFpbGluZ05ld2xpbmUpIHtcbiAgICAgICAgaWYgKGJ1ZmZlcltwb3NpdGlvbl0gPT09IFwiXFxuXCIpIHtcbiAgICAgICAgICArK3Bvc2l0aW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgZGlzY2FyZFRyYWlsaW5nTmV3bGluZSA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBsZXQgbGluZUxlbmd0aCA9IC0xO1xuICAgICAgbGV0IGZpZWxkTGVuZ3RoID0gc3RhcnRpbmdGaWVsZExlbmd0aDtcbiAgICAgIGxldCBjaGFyYWN0ZXI7XG5cbiAgICAgIGZvciAobGV0IGluZGV4ID0gc3RhcnRpbmdQb3NpdGlvbjsgbGluZUxlbmd0aCA8IDAgJiYgaW5kZXggPCBsZW5ndGg7ICsraW5kZXgpIHtcbiAgICAgICAgY2hhcmFjdGVyID0gYnVmZmVyW2luZGV4XTtcblxuICAgICAgICBpZiAoY2hhcmFjdGVyID09PSBcIjpcIiAmJiBmaWVsZExlbmd0aCA8IDApIHtcbiAgICAgICAgICBmaWVsZExlbmd0aCA9IGluZGV4IC0gcG9zaXRpb247XG4gICAgICAgIH0gZWxzZSBpZiAoY2hhcmFjdGVyID09PSBcIlxcclwiKSB7XG4gICAgICAgICAgZGlzY2FyZFRyYWlsaW5nTmV3bGluZSA9IHRydWU7XG4gICAgICAgICAgbGluZUxlbmd0aCA9IGluZGV4IC0gcG9zaXRpb247XG4gICAgICAgIH0gZWxzZSBpZiAoY2hhcmFjdGVyID09PSBcIlxcblwiKSB7XG4gICAgICAgICAgbGluZUxlbmd0aCA9IGluZGV4IC0gcG9zaXRpb247XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGxpbmVMZW5ndGggPCAwKSB7XG4gICAgICAgIHN0YXJ0aW5nUG9zaXRpb24gPSBsZW5ndGggLSBwb3NpdGlvbjtcbiAgICAgICAgc3RhcnRpbmdGaWVsZExlbmd0aCA9IGZpZWxkTGVuZ3RoO1xuICAgICAgICBicmVhaztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXJ0aW5nUG9zaXRpb24gPSAwO1xuICAgICAgICBzdGFydGluZ0ZpZWxkTGVuZ3RoID0gLTE7XG4gICAgICB9XG5cbiAgICAgIHBhcnNlRXZlbnRTdHJlYW1MaW5lKGJ1ZmZlciwgcG9zaXRpb24sIGZpZWxkTGVuZ3RoLCBsaW5lTGVuZ3RoKTtcbiAgICAgIHBvc2l0aW9uICs9IGxpbmVMZW5ndGggKyAxO1xuICAgIH1cblxuICAgIGlmIChwb3NpdGlvbiA9PT0gbGVuZ3RoKSB7XG4gICAgICBidWZmZXIgPSBcIlwiO1xuICAgIH0gZWxzZSBpZiAocG9zaXRpb24gPiAwKSB7XG4gICAgICBidWZmZXIgPSBidWZmZXIuc2xpY2UocG9zaXRpb24pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHBhcnNlRXZlbnRTdHJlYW1MaW5lKGxpbmVCdWZmZXIsIGluZGV4LCBmaWVsZExlbmd0aCwgbGluZUxlbmd0aCkge1xuICAgIGlmIChsaW5lTGVuZ3RoID09PSAwKSB7XG4gICAgICBpZiAoZGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgIG9uUGFyc2Uoe1xuICAgICAgICAgIHR5cGU6IFwiZXZlbnRcIixcbiAgICAgICAgICBpZDogZXZlbnRJZCxcbiAgICAgICAgICBldmVudDogZXZlbnROYW1lIHx8IHZvaWQgMCxcbiAgICAgICAgICBkYXRhOiBkYXRhLnNsaWNlKDAsIC0xKVxuICAgICAgICB9KTtcbiAgICAgICAgZGF0YSA9IFwiXCI7XG4gICAgICAgIGV2ZW50SWQgPSB2b2lkIDA7XG4gICAgICB9XG5cbiAgICAgIGV2ZW50TmFtZSA9IHZvaWQgMDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBub1ZhbHVlID0gZmllbGRMZW5ndGggPCAwO1xuICAgIGNvbnN0IGZpZWxkID0gbGluZUJ1ZmZlci5zbGljZShpbmRleCwgaW5kZXggKyAobm9WYWx1ZSA/IGxpbmVMZW5ndGggOiBmaWVsZExlbmd0aCkpO1xuICAgIGxldCBzdGVwID0gMDtcblxuICAgIGlmIChub1ZhbHVlKSB7XG4gICAgICBzdGVwID0gbGluZUxlbmd0aDtcbiAgICB9IGVsc2UgaWYgKGxpbmVCdWZmZXJbaW5kZXggKyBmaWVsZExlbmd0aCArIDFdID09PSBcIiBcIikge1xuICAgICAgc3RlcCA9IGZpZWxkTGVuZ3RoICsgMjtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RlcCA9IGZpZWxkTGVuZ3RoICsgMTtcbiAgICB9XG5cbiAgICBjb25zdCBwb3NpdGlvbiA9IGluZGV4ICsgc3RlcDtcbiAgICBjb25zdCB2YWx1ZUxlbmd0aCA9IGxpbmVMZW5ndGggLSBzdGVwO1xuICAgIGNvbnN0IHZhbHVlID0gbGluZUJ1ZmZlci5zbGljZShwb3NpdGlvbiwgcG9zaXRpb24gKyB2YWx1ZUxlbmd0aCkudG9TdHJpbmcoKTtcblxuICAgIGlmIChmaWVsZCA9PT0gXCJkYXRhXCIpIHtcbiAgICAgIGRhdGEgKz0gdmFsdWUgPyBcIlwiLmNvbmNhdCh2YWx1ZSwgXCJcXG5cIikgOiBcIlxcblwiO1xuICAgIH0gZWxzZSBpZiAoZmllbGQgPT09IFwiZXZlbnRcIikge1xuICAgICAgZXZlbnROYW1lID0gdmFsdWU7XG4gICAgfSBlbHNlIGlmIChmaWVsZCA9PT0gXCJpZFwiICYmICF2YWx1ZS5pbmNsdWRlcyhcIlxcMFwiKSkge1xuICAgICAgZXZlbnRJZCA9IHZhbHVlO1xuICAgIH0gZWxzZSBpZiAoZmllbGQgPT09IFwicmV0cnlcIikge1xuICAgICAgY29uc3QgcmV0cnkgPSBwYXJzZUludCh2YWx1ZSwgMTApO1xuXG4gICAgICBpZiAoIU51bWJlci5pc05hTihyZXRyeSkpIHtcbiAgICAgICAgb25QYXJzZSh7XG4gICAgICAgICAgdHlwZTogXCJyZWNvbm5lY3QtaW50ZXJ2YWxcIixcbiAgICAgICAgICB2YWx1ZTogcmV0cnlcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmNvbnN0IEJPTSA9IFsyMzksIDE4NywgMTkxXTtcblxuZnVuY3Rpb24gaGFzQm9tKGJ1ZmZlcikge1xuICByZXR1cm4gQk9NLmV2ZXJ5KChjaGFyQ29kZSwgaW5kZXgpID0+IGJ1ZmZlci5jaGFyQ29kZUF0KGluZGV4KSA9PT0gY2hhckNvZGUpO1xufVxuXG5leHBvcnQgeyBjcmVhdGVQYXJzZXIgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4Lm1qcy5tYXBcbiIsImltcG9ydCBFeHBpcnlNYXAgZnJvbSBcImV4cGlyeS1tYXBcIjtcclxuaW1wb3J0IHsgdjQgYXMgdXVpZHY0IH0gZnJvbSBcInV1aWRcIjtcclxuaW1wb3J0IHsgZmV0Y2hTU0UgfSBmcm9tIFwiLi9mZXRjaC1zc2UuanNcIjtcclxuXHJcbmNvbnN0IEtFWV9BQ0NFU1NfVE9LRU4gPSBcImFjY2Vzc1Rva2VuXCI7XHJcblxyXG5sZXQgcHJvbXB0ID1cclxuICBcIklzIHRoZSBmb2xsb3dpbmcgc3RhdGVtZW50IHRydWUsIGZhbHNlLCBvciB1bmNlcnRhaW4/IGFuc3dlciBpbiBwZXJzaWFuXCI7XHJcbmxldCBhcGlLZXkgPSBcIlwiO1xyXG5jaHJvbWUuc3RvcmFnZS5zeW5jLmdldChbXCJwcm9tcHRcIiwgXCJhcGlLZXlcIl0sIGZ1bmN0aW9uIChpdGVtcykge1xyXG4gIGlmIChpdGVtcyAmJiBpdGVtcy5wcm9tcHQpIHtcclxuICAgIHByb21wdCA9IGl0ZW1zLnByb21wdDtcclxuICB9XHJcbiAgaWYgKGl0ZW1zICYmIGl0ZW1zLmFwaUtleSkge1xyXG4gICAgYXBpS2V5ID0gaXRlbXMuYXBpS2V5O1xyXG4gIH1cclxufSk7XHJcblxyXG5jb25zdCBjYWNoZSA9IG5ldyBFeHBpcnlNYXAoMTAgKiAxMDAwKTtcclxuXHJcbmFzeW5jIGZ1bmN0aW9uIGdldEFjY2Vzc1Rva2VuKCkge1xyXG4gIGlmIChjYWNoZS5nZXQoS0VZX0FDQ0VTU19UT0tFTikpIHtcclxuICAgIHJldHVybiBjYWNoZS5nZXQoS0VZX0FDQ0VTU19UT0tFTik7XHJcbiAgfVxyXG4gIGNvbnN0IHJlc3AgPSBhd2FpdCBmZXRjaChcImh0dHBzOi8vY2hhdC5vcGVuYWkuY29tL2FwaS9hdXRoL3Nlc3Npb25cIilcclxuICAgIC50aGVuKChyKSA9PiByLmpzb24oKSlcclxuICAgIC5jYXRjaCgoKSA9PiAoe30pKTtcclxuICBpZiAoIXJlc3AuYWNjZXNzVG9rZW4pIHtcclxuICAgIHRocm93IG5ldyBFcnJvcihcIkVycm9yXCIpO1xyXG4gIH1cclxuICBjYWNoZS5zZXQoS0VZX0FDQ0VTU19UT0tFTiwgcmVzcC5hY2Nlc3NUb2tlbik7XHJcbiAgcmV0dXJuIHJlc3AuYWNjZXNzVG9rZW47XHJcbn1cclxuXHJcbmFzeW5jIGZ1bmN0aW9uIGdldENvbnZlcnNhdGlvbklkKCkge1xyXG4gIGNvbnN0IGFjY2Vzc1Rva2VuID0gYXdhaXQgZ2V0QWNjZXNzVG9rZW4oKTtcclxuICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2goXHJcbiAgICBcImh0dHBzOi8vY2hhdC5vcGVuYWkuY29tL2JhY2tlbmQtYXBpL2NvbnZlcnNhdGlvbnM/b2Zmc2V0PTAmbGltaXQ9MVwiLFxyXG4gICAge1xyXG4gICAgICBtZXRob2Q6IFwiR0VUXCIsXHJcbiAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7YWNjZXNzVG9rZW59YCxcclxuICAgICAgfSxcclxuICAgIH1cclxuICApXHJcbiAgICAudGhlbigocikgPT4gci5qc29uKCkpXHJcbiAgICAuY2F0Y2goKCkgPT4gKHt9KSk7XHJcbiAgaWYgKHJlc3A/Lml0ZW1zPy5sZW5ndGggPT09IDEpIHtcclxuICAgIHJldHVybiByZXNwLml0ZW1zWzBdLmlkO1xyXG4gIH1cclxuICByZXR1cm4gXCJcIjtcclxufVxyXG5cclxuYXN5bmMgZnVuY3Rpb24gZGVsZXRlQ29udmVyc2F0aW9uKGNvbnZlcnNhdGlvbklkKSB7XHJcbiAgY29uc3QgYWNjZXNzVG9rZW4gPSBhd2FpdCBnZXRBY2Nlc3NUb2tlbigpO1xyXG4gIGNvbnN0IHJlc3AgPSBhd2FpdCBmZXRjaChcclxuICAgIGBodHRwczovL2NoYXQub3BlbmFpLmNvbS9iYWNrZW5kLWFwaS9jb252ZXJzYXRpb24vJHtjb252ZXJzYXRpb25JZH1gLFxyXG4gICAge1xyXG4gICAgICBtZXRob2Q6IFwiUEFUQ0hcIixcclxuICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxyXG4gICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHthY2Nlc3NUb2tlbn1gLFxyXG4gICAgICB9LFxyXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGlzX3Zpc2libGU6IGZhbHNlIH0pLFxyXG4gICAgfVxyXG4gIClcclxuICAgIC50aGVuKChyKSA9PiByLmpzb24oKSlcclxuICAgIC5jYXRjaCgoKSA9PiAoe30pKTtcclxuICBpZiAocmVzcD8uc3VjY2Vzcykge1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG4gIHJldHVybiBmYWxzZTtcclxufVxyXG5cclxuYXN5bmMgZnVuY3Rpb24gZ2V0U3VtbWFyeShxdWVzdGlvbiwgY2FsbGJhY2spIHtcclxuICBjb25zdCBhY2Nlc3NUb2tlbiA9IGF3YWl0IGdldEFjY2Vzc1Rva2VuKCk7XHJcbiAgY29uc3QgbWVzc2FnZUpzb24gPSB7XHJcbiAgICBhY3Rpb246IFwibmV4dFwiLFxyXG4gICAgbWVzc2FnZXM6IFtcclxuICAgICAge1xyXG4gICAgICAgIGlkOiB1dWlkdjQoKSxcclxuICAgICAgICBhdXRob3I6IHtcclxuICAgICAgICAgIHJvbGU6IFwidXNlclwiLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgcm9sZTogXCJ1c2VyXCIsXHJcbiAgICAgICAgY29udGVudDoge1xyXG4gICAgICAgICAgY29udGVudF90eXBlOiBcInRleHRcIixcclxuICAgICAgICAgIHBhcnRzOiBbcXVlc3Rpb25dLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICBdLFxyXG4gICAgbW9kZWw6IFwidGV4dC1kYXZpbmNpLTAwMi1yZW5kZXJcIixcclxuICAgIHBhcmVudF9tZXNzYWdlX2lkOiB1dWlkdjQoKSxcclxuICB9O1xyXG4gIGF3YWl0IGZldGNoU1NFKFwiaHR0cHM6Ly9jaGF0Lm9wZW5haS5jb20vYmFja2VuZC1hcGkvY29udmVyc2F0aW9uXCIsIHtcclxuICAgIG1ldGhvZDogXCJQT1NUXCIsXHJcbiAgICBoZWFkZXJzOiB7XHJcbiAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxyXG4gICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7YWNjZXNzVG9rZW59YCxcclxuICAgIH0sXHJcbiAgICBib2R5OiBKU09OLnN0cmluZ2lmeShtZXNzYWdlSnNvbiksXHJcbiAgICBvbk1lc3NhZ2UobWVzc2FnZSkge1xyXG4gICAgICBpZiAobWVzc2FnZSA9PT0gXCJbRE9ORV1cIikge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKG1lc3NhZ2UpO1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSBkYXRhLm1lc3NhZ2U/LmNvbnRlbnQ/LnBhcnRzPy5bMF07XHJcbiAgICAgICAgaWYgKHRleHQpIHtcclxuICAgICAgICAgIGNhbGxiYWNrKHRleHQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJzc2UgbWVzc2FnZVwiLCBtZXNzYWdlKTtcclxuICAgICAgICBjb25zb2xlLmxvZyhgRXJyb3IgaW4gb25NZXNzYWdlOiAke2Vycn1gKTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIG9uRXJyb3IoZXJyKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKGBFcnJvciBpbiBmZXRjaFNTRTogJHtlcnJ9YCk7XHJcbiAgICB9LFxyXG4gIH0pO1xyXG59XHJcblxyXG5sZXQgcHJldmVudEluc3RhbmNlID0ge307XHJcbmZ1bmN0aW9uIGV4ZWN1dGVTY3JpcHRzKHRhYikge1xyXG4gIGNvbnN0IHRhYklkID0gdGFiLmlkO1xyXG4gIC8vIHJldHVybiBpZiB3ZSd2ZSBhbHJlYWR5IGNyZWF0ZWQgdGhlIHN1bW1hcnkgZm9yIHRoaXMgd2Vic2l0ZVxyXG4gIGlmIChwcmV2ZW50SW5zdGFuY2VbdGFiSWRdKSByZXR1cm47XHJcblxyXG4gIHByZXZlbnRJbnN0YW5jZVt0YWJJZF0gPSB0cnVlO1xyXG4gIHNldFRpbWVvdXQoKCkgPT4gZGVsZXRlIHByZXZlbnRJbnN0YW5jZVt0YWJJZF0sIDEwMDAwKTtcclxuXHJcbiAgY2hyb21lLmFjdGlvbi5zZXRCYWRnZUJhY2tncm91bmRDb2xvcih7IGNvbG9yOiBbMjQyLCAzOCwgMTksIDIzMF0gfSk7XHJcbiAgY2hyb21lLmFjdGlvbi5zZXRCYWRnZVRleHQoeyB0ZXh0OiBcImZhY3RcIiB9KTtcclxuXHJcbiAgY2hyb21lLnNjcmlwdGluZy5leGVjdXRlU2NyaXB0KHtcclxuICAgIHRhcmdldDogeyB0YWJJZCB9LFxyXG4gICAgZmlsZXM6IFtcImNvbnRlbnQuYnVuZGxlLmpzXCJdLFxyXG4gIH0pO1xyXG5cclxuICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgIGNocm9tZS5hY3Rpb24uc2V0QmFkZ2VUZXh0KHsgdGV4dDogXCJcIiB9KTtcclxuICB9LCAxMDAwKTtcclxufVxyXG5cclxuY2hyb21lLmFjdGlvbi5vbkNsaWNrZWQuYWRkTGlzdGVuZXIoZXhlY3V0ZVNjcmlwdHMpO1xyXG5cclxuY2hyb21lLnJ1bnRpbWUub25Db25uZWN0LmFkZExpc3RlbmVyKChwb3J0KSA9PiB7XHJcbiAgcG9ydC5vbk1lc3NhZ2UuYWRkTGlzdGVuZXIoYXN5bmMgKHJlcXVlc3QsIHNlbmRlciwgc2VuZFJlc3BvbnNlKSA9PiB7XHJcbiAgICBjb25zb2xlLmRlYnVnKFwicmVjZWl2ZWQgbXNnIFwiLCByZXF1ZXN0LmNvbnRlbnQpO1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgbWF4TGVuZ3RoID0gMzAwMDtcclxuICAgICAgY29uc3QgdGV4dCA9IHJlcXVlc3QuY29udGVudDtcclxuICAgICAgY29uc3QgY2h1bmtzID0gc3BsaXRUZXh0SW50b0NodW5rcyh0ZXh0LCBtYXhMZW5ndGgpO1xyXG5cclxuICAgICAgbGV0IGN1cnJlbnRTdW1tYXJ5ID0gXCJcIjtcclxuICAgICAgZm9yIChjb25zdCBjaHVuayBvZiBjaHVua3MpIHtcclxuICAgICAgICBjb25zdCBncHRRdWVzdGlvbiA9IHByb21wdCArIGBcXG5cXG4ke2NodW5rfWA7XHJcbiAgICAgICAgbGV0IGN1cnJlbnRBbnN3ZXIgPSBcIlwiO1xyXG4gICAgICAgIGF3YWl0IGdldFN1bW1hcnkoZ3B0UXVlc3Rpb24sIChhbnN3ZXIpID0+IHtcclxuICAgICAgICAgIGN1cnJlbnRBbnN3ZXIgPSBhbnN3ZXI7XHJcbiAgICAgICAgICBwb3J0LnBvc3RNZXNzYWdlKHtcclxuICAgICAgICAgICAgYW5zd2VyOiBjb21iaW5lU3VtbWFyaWVzKFtjdXJyZW50U3VtbWFyeSwgYW5zd2VyXSksXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBhd2FpdCBkZWxldGVDb252ZXJzYXRpb24oYXdhaXQgZ2V0Q29udmVyc2F0aW9uSWQoKSk7XHJcbiAgICAgICAgY3VycmVudFN1bW1hcnkgPVxyXG4gICAgICAgICAgY29tYmluZVN1bW1hcmllcyhbY3VycmVudFN1bW1hcnksIGN1cnJlbnRBbnN3ZXJdKSArIFwiXFxuXFxuXCI7XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICBjb25zb2xlLmVycm9yKGVycik7XHJcbiAgICAgIHBvcnQucG9zdE1lc3NhZ2UoeyBlcnJvcjogZXJyLm1lc3NhZ2UgfSk7XHJcbiAgICAgIGNhY2hlLmRlbGV0ZShLRVlfQUNDRVNTX1RPS0VOKTtcclxuICAgIH1cclxuICB9KTtcclxufSk7XHJcblxyXG5mdW5jdGlvbiBzcGxpdFRleHRJbnRvQ2h1bmtzKHRleHQsIG1heExlbmd0aCkge1xyXG4gIGNvbnN0IGNodW5rcyA9IFtdO1xyXG4gIGNvbnN0IHdvcmRzID0gdGV4dC5zcGxpdCgvXFxzKy8pO1xyXG4gIGxldCBjdXJyZW50Q2h1bmsgPSBcIlwiO1xyXG5cclxuICBmb3IgKGNvbnN0IHdvcmQgb2Ygd29yZHMpIHtcclxuICAgIGlmIChjdXJyZW50Q2h1bmsubGVuZ3RoICsgd29yZC5sZW5ndGggKyAxIDw9IG1heExlbmd0aCkge1xyXG4gICAgICBjdXJyZW50Q2h1bmsgKz0gKGN1cnJlbnRDaHVuayA/IFwiIFwiIDogXCJcIikgKyB3b3JkO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY2h1bmtzLnB1c2goY3VycmVudENodW5rKTtcclxuICAgICAgY3VycmVudENodW5rID0gd29yZDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlmIChjdXJyZW50Q2h1bmspIHtcclxuICAgIGNodW5rcy5wdXNoKGN1cnJlbnRDaHVuayk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gY2h1bmtzO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjb21iaW5lU3VtbWFyaWVzKHN1bW1hcmllcykge1xyXG4gIGxldCBjb21iaW5lZFN1bW1hcnkgPSBcIlwiO1xyXG4gIGZvciAoY29uc3Qgc3VtbWFyeSBvZiBzdW1tYXJpZXMpIHtcclxuICAgIGNvbWJpbmVkU3VtbWFyeSArPSAoY29tYmluZWRTdW1tYXJ5ID8gXCIgXCIgOiBcIlwiKSArIHN1bW1hcnk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gY29tYmluZWRTdW1tYXJ5O1xyXG59XHJcbiIsImltcG9ydCB7IGNyZWF0ZVBhcnNlciB9IGZyb20gXCJldmVudHNvdXJjZS1wYXJzZXJcIjtcclxuaW1wb3J0IHsgc3RyZWFtQXN5bmNJdGVyYWJsZSB9IGZyb20gXCIuL3N0cmVhbS1hc3luYy1pdGVyYWJsZS5qc1wiO1xyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZldGNoU1NFKHJlc291cmNlLCBvcHRpb25zKSB7XHJcbiAgY29uc3QgeyBvbk1lc3NhZ2UsIG9uRXJyb3IsIC4uLmZldGNoT3B0aW9ucyB9ID0gb3B0aW9ucztcclxuICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2gocmVzb3VyY2UsIGZldGNoT3B0aW9ucykuY2F0Y2goKGVycikgPT4gb25FcnJvcihlcnIpKTtcclxuICBjb25zdCBwYXJzZXIgPSBjcmVhdGVQYXJzZXIoKGV2ZW50KSA9PiB7XHJcbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gXCJldmVudFwiKSB7XHJcbiAgICAgIG9uTWVzc2FnZShldmVudC5kYXRhKTtcclxuICAgIH1cclxuICB9KTtcclxuICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIHN0cmVhbUFzeW5jSXRlcmFibGUocmVzcC5ib2R5KSkge1xyXG4gICAgY29uc3Qgc3RyID0gbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKGNodW5rKTtcclxuICAgIHBhcnNlci5mZWVkKHN0cik7XHJcbiAgfVxyXG59XHJcbiIsImV4cG9ydCBhc3luYyBmdW5jdGlvbiogc3RyZWFtQXN5bmNJdGVyYWJsZShzdHJlYW0pIHtcclxuICBjb25zdCByZWFkZXIgPSBzdHJlYW0uZ2V0UmVhZGVyKCk7XHJcbiAgdHJ5IHtcclxuICAgIHdoaWxlICh0cnVlKSB7XHJcbiAgICAgIGNvbnN0IHsgZG9uZSwgdmFsdWUgfSA9IGF3YWl0IHJlYWRlci5yZWFkKCk7XHJcbiAgICAgIGlmIChkb25lKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIHlpZWxkIHZhbHVlO1xyXG4gICAgfVxyXG4gIH0gZmluYWxseSB7XHJcbiAgICByZWFkZXIucmVsZWFzZUxvY2soKTtcclxuICB9XHJcbn1cclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBtYXBBZ2VDbGVhbmVyID0gcmVxdWlyZShcIm1hcC1hZ2UtY2xlYW5lclwiKTtcbmNsYXNzIEV4cGlyeU1hcCB7XG4gICAgY29uc3RydWN0b3IobWF4QWdlLCBkYXRhKSB7XG4gICAgICAgIHRoaXMubWF4QWdlID0gbWF4QWdlO1xuICAgICAgICB0aGlzW1N5bWJvbC50b1N0cmluZ1RhZ10gPSAnTWFwJztcbiAgICAgICAgdGhpcy5kYXRhID0gbmV3IE1hcCgpO1xuICAgICAgICAvLyBCb290c3RyYXAgdGhlIGNsZWFudXAgcHJvY2VzcyB3aGljaCBmcmVlcyB1cCBtZW1vcnkgd2hlbiBhbiBpdGVtIGV4cGlyZXNcbiAgICAgICAgbWFwQWdlQ2xlYW5lcih0aGlzLmRhdGEpO1xuICAgICAgICBpZiAoZGF0YSkgeyAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lOmVhcmx5LWV4aXRcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGRhdGEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5zaXplO1xuICAgIH1cbiAgICBjbGVhcigpIHtcbiAgICAgICAgdGhpcy5kYXRhLmNsZWFyKCk7XG4gICAgfVxuICAgIGRlbGV0ZShrZXkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5kZWxldGUoa2V5KTtcbiAgICB9XG4gICAgaGFzKGtleSkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmhhcyhrZXkpO1xuICAgIH1cbiAgICBnZXQoa2V5KSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kYXRhLmdldChrZXkpO1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5kYXRhO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5kYXRhLnNldChrZXksIHtcbiAgICAgICAgICAgIG1heEFnZTogRGF0ZS5ub3coKSArIHRoaXMubWF4QWdlLFxuICAgICAgICAgICAgZGF0YTogdmFsdWVcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB2YWx1ZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUl0ZXJhdG9yKGl0ZW0gPT4gaXRlbVsxXS5kYXRhKTtcbiAgICB9XG4gICAga2V5cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5rZXlzKCk7XG4gICAgfVxuICAgIGVudHJpZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUl0ZXJhdG9yKGl0ZW0gPT4gW2l0ZW1bMF0sIGl0ZW1bMV0uZGF0YV0pO1xuICAgIH1cbiAgICBmb3JFYWNoKGNhbGxiYWNrZm4sIHRoaXNBcmcpIHtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrZm4uYXBwbHkodGhpc0FyZywgW3ZhbHVlLCBrZXksIHRoaXNdKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW50cmllcygpO1xuICAgIH1cbiAgICAqY3JlYXRlSXRlcmF0b3IocHJvamVjdGlvbikge1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5kYXRhLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgeWllbGQgcHJvamVjdGlvbihpdGVtKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gRXhwaXJ5TWFwO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBwRGVmZXIgPSByZXF1aXJlKFwicC1kZWZlclwiKTtcbmZ1bmN0aW9uIG1hcEFnZUNsZWFuZXIobWFwLCBwcm9wZXJ0eSA9ICdtYXhBZ2UnKSB7XG4gICAgbGV0IHByb2Nlc3NpbmdLZXk7XG4gICAgbGV0IHByb2Nlc3NpbmdUaW1lcjtcbiAgICBsZXQgcHJvY2Vzc2luZ0RlZmVycmVkO1xuICAgIGNvbnN0IGNsZWFudXAgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmIChwcm9jZXNzaW5nS2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIElmIHdlIGFyZSBhbHJlYWR5IHByb2Nlc3NpbmcgYW4gaXRlbSwgd2UgY2FuIHNhZmVseSBleGl0XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2V0dXBUaW1lciA9IGFzeW5jIChpdGVtKSA9PiB7XG4gICAgICAgICAgICBwcm9jZXNzaW5nRGVmZXJyZWQgPSBwRGVmZXIoKTtcbiAgICAgICAgICAgIGNvbnN0IGRlbGF5ID0gaXRlbVsxXVtwcm9wZXJ0eV0gLSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgaWYgKGRlbGF5IDw9IDApIHtcbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIGl0ZW0gaW1tZWRpYXRlbHkgaWYgdGhlIGRlbGF5IGlzIGVxdWFsIHRvIG9yIGJlbG93IDBcbiAgICAgICAgICAgICAgICBtYXAuZGVsZXRlKGl0ZW1bMF0pO1xuICAgICAgICAgICAgICAgIHByb2Nlc3NpbmdEZWZlcnJlZC5yZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gS2VlcCB0cmFjayBvZiB0aGUgY3VycmVudCBwcm9jZXNzZWQga2V5XG4gICAgICAgICAgICBwcm9jZXNzaW5nS2V5ID0gaXRlbVswXTtcbiAgICAgICAgICAgIHByb2Nlc3NpbmdUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgaXRlbSB3aGVuIHRoZSB0aW1lb3V0IGZpcmVzXG4gICAgICAgICAgICAgICAgbWFwLmRlbGV0ZShpdGVtWzBdKTtcbiAgICAgICAgICAgICAgICBpZiAocHJvY2Vzc2luZ0RlZmVycmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NpbmdEZWZlcnJlZC5yZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgZGVsYXkpO1xuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnN0cmljdC10eXBlLXByZWRpY2F0ZXNcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcHJvY2Vzc2luZ1RpbWVyLnVucmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgLy8gRG9uJ3QgaG9sZCB1cCB0aGUgcHJvY2VzcyBmcm9tIGV4aXRpbmdcbiAgICAgICAgICAgICAgICBwcm9jZXNzaW5nVGltZXIudW5yZWYoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwcm9jZXNzaW5nRGVmZXJyZWQucHJvbWlzZTtcbiAgICAgICAgfTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgbWFwKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgc2V0dXBUaW1lcihlbnRyeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKF9hKSB7XG4gICAgICAgICAgICAvLyBEbyBub3RoaW5nIGlmIGFuIGVycm9yIG9jY3VycywgdGhpcyBtZWFucyB0aGUgdGltZXIgd2FzIGNsZWFuZWQgdXAgYW5kIHdlIHNob3VsZCBzdG9wIHByb2Nlc3NpbmdcbiAgICAgICAgfVxuICAgICAgICBwcm9jZXNzaW5nS2V5ID0gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgY29uc3QgcmVzZXQgPSAoKSA9PiB7XG4gICAgICAgIHByb2Nlc3NpbmdLZXkgPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChwcm9jZXNzaW5nVGltZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHByb2Nlc3NpbmdUaW1lcik7XG4gICAgICAgICAgICBwcm9jZXNzaW5nVGltZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2Nlc3NpbmdEZWZlcnJlZCAhPT0gdW5kZWZpbmVkKSB7IC8vIHRzbGludDpkaXNhYmxlLWxpbmU6ZWFybHktZXhpdFxuICAgICAgICAgICAgcHJvY2Vzc2luZ0RlZmVycmVkLnJlamVjdCh1bmRlZmluZWQpO1xuICAgICAgICAgICAgcHJvY2Vzc2luZ0RlZmVycmVkID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25zdCBvcmlnaW5hbFNldCA9IG1hcC5zZXQuYmluZChtYXApO1xuICAgIG1hcC5zZXQgPSAoa2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgICBpZiAobWFwLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUga2V5IGFscmVhZHkgZXhpc3QsIHJlbW92ZSBpdCBzbyB3ZSBjYW4gYWRkIGl0IGJhY2sgYXQgdGhlIGVuZCBvZiB0aGUgbWFwLlxuICAgICAgICAgICAgbWFwLmRlbGV0ZShrZXkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIENhbGwgdGhlIG9yaWdpbmFsIGBtYXAuc2V0YFxuICAgICAgICBjb25zdCByZXN1bHQgPSBvcmlnaW5hbFNldChrZXksIHZhbHVlKTtcbiAgICAgICAgLy8gSWYgd2UgYXJlIGFscmVhZHkgcHJvY2Vzc2luZyBhIGtleSBhbmQgdGhlIGtleSBhZGRlZCBpcyB0aGUgY3VycmVudCBwcm9jZXNzZWQga2V5LCBzdG9wIHByb2Nlc3NpbmcgaXRcbiAgICAgICAgaWYgKHByb2Nlc3NpbmdLZXkgJiYgcHJvY2Vzc2luZ0tleSA9PT0ga2V5KSB7XG4gICAgICAgICAgICByZXNldCgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEFsd2F5cyBydW4gdGhlIGNsZWFudXAgbWV0aG9kIGluIGNhc2UgaXQgd2Fzbid0IHN0YXJ0ZWQgeWV0XG4gICAgICAgIGNsZWFudXAoKTsgLy8gdHNsaW50OmRpc2FibGUtbGluZTpuby1mbG9hdGluZy1wcm9taXNlc1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgY2xlYW51cCgpOyAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lOm5vLWZsb2F0aW5nLXByb21pc2VzXG4gICAgcmV0dXJuIG1hcDtcbn1cbm1vZHVsZS5leHBvcnRzID0gbWFwQWdlQ2xlYW5lcjtcbiIsIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gKCkgPT4ge1xuXHRjb25zdCByZXQgPSB7fTtcblxuXHRyZXQucHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRyZXQucmVzb2x2ZSA9IHJlc29sdmU7XG5cdFx0cmV0LnJlamVjdCA9IHJlamVjdDtcblx0fSk7XG5cblx0cmV0dXJuIHJldDtcbn07XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbnZhciBydW50aW1lID0gKGZ1bmN0aW9uIChleHBvcnRzKSB7XG4gIFwidXNlIHN0cmljdFwiO1xuXG4gIHZhciBPcCA9IE9iamVjdC5wcm90b3R5cGU7XG4gIHZhciBoYXNPd24gPSBPcC5oYXNPd25Qcm9wZXJ0eTtcbiAgdmFyIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5IHx8IGZ1bmN0aW9uIChvYmosIGtleSwgZGVzYykgeyBvYmpba2V5XSA9IGRlc2MudmFsdWU7IH07XG4gIHZhciB1bmRlZmluZWQ7IC8vIE1vcmUgY29tcHJlc3NpYmxlIHRoYW4gdm9pZCAwLlxuICB2YXIgJFN5bWJvbCA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiA/IFN5bWJvbCA6IHt9O1xuICB2YXIgaXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLml0ZXJhdG9yIHx8IFwiQEBpdGVyYXRvclwiO1xuICB2YXIgYXN5bmNJdGVyYXRvclN5bWJvbCA9ICRTeW1ib2wuYXN5bmNJdGVyYXRvciB8fCBcIkBAYXN5bmNJdGVyYXRvclwiO1xuICB2YXIgdG9TdHJpbmdUYWdTeW1ib2wgPSAkU3ltYm9sLnRvU3RyaW5nVGFnIHx8IFwiQEB0b1N0cmluZ1RhZ1wiO1xuXG4gIGZ1bmN0aW9uIGRlZmluZShvYmosIGtleSwgdmFsdWUpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIHJldHVybiBvYmpba2V5XTtcbiAgfVxuICB0cnkge1xuICAgIC8vIElFIDggaGFzIGEgYnJva2VuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSB0aGF0IG9ubHkgd29ya3Mgb24gRE9NIG9iamVjdHMuXG4gICAgZGVmaW5lKHt9LCBcIlwiKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZGVmaW5lID0gZnVuY3Rpb24ob2JqLCBrZXksIHZhbHVlKSB7XG4gICAgICByZXR1cm4gb2JqW2tleV0gPSB2YWx1ZTtcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gd3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCkge1xuICAgIC8vIElmIG91dGVyRm4gcHJvdmlkZWQgYW5kIG91dGVyRm4ucHJvdG90eXBlIGlzIGEgR2VuZXJhdG9yLCB0aGVuIG91dGVyRm4ucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuZXJhdG9yLlxuICAgIHZhciBwcm90b0dlbmVyYXRvciA9IG91dGVyRm4gJiYgb3V0ZXJGbi5wcm90b3R5cGUgaW5zdGFuY2VvZiBHZW5lcmF0b3IgPyBvdXRlckZuIDogR2VuZXJhdG9yO1xuICAgIHZhciBnZW5lcmF0b3IgPSBPYmplY3QuY3JlYXRlKHByb3RvR2VuZXJhdG9yLnByb3RvdHlwZSk7XG4gICAgdmFyIGNvbnRleHQgPSBuZXcgQ29udGV4dCh0cnlMb2NzTGlzdCB8fCBbXSk7XG5cbiAgICAvLyBUaGUgLl9pbnZva2UgbWV0aG9kIHVuaWZpZXMgdGhlIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgLm5leHQsXG4gICAgLy8gLnRocm93LCBhbmQgLnJldHVybiBtZXRob2RzLlxuICAgIGRlZmluZVByb3BlcnR5KGdlbmVyYXRvciwgXCJfaW52b2tlXCIsIHsgdmFsdWU6IG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCkgfSk7XG5cbiAgICByZXR1cm4gZ2VuZXJhdG9yO1xuICB9XG4gIGV4cG9ydHMud3JhcCA9IHdyYXA7XG5cbiAgLy8gVHJ5L2NhdGNoIGhlbHBlciB0byBtaW5pbWl6ZSBkZW9wdGltaXphdGlvbnMuIFJldHVybnMgYSBjb21wbGV0aW9uXG4gIC8vIHJlY29yZCBsaWtlIGNvbnRleHQudHJ5RW50cmllc1tpXS5jb21wbGV0aW9uLiBUaGlzIGludGVyZmFjZSBjb3VsZFxuICAvLyBoYXZlIGJlZW4gKGFuZCB3YXMgcHJldmlvdXNseSkgZGVzaWduZWQgdG8gdGFrZSBhIGNsb3N1cmUgdG8gYmVcbiAgLy8gaW52b2tlZCB3aXRob3V0IGFyZ3VtZW50cywgYnV0IGluIGFsbCB0aGUgY2FzZXMgd2UgY2FyZSBhYm91dCB3ZVxuICAvLyBhbHJlYWR5IGhhdmUgYW4gZXhpc3RpbmcgbWV0aG9kIHdlIHdhbnQgdG8gY2FsbCwgc28gdGhlcmUncyBubyBuZWVkXG4gIC8vIHRvIGNyZWF0ZSBhIG5ldyBmdW5jdGlvbiBvYmplY3QuIFdlIGNhbiBldmVuIGdldCBhd2F5IHdpdGggYXNzdW1pbmdcbiAgLy8gdGhlIG1ldGhvZCB0YWtlcyBleGFjdGx5IG9uZSBhcmd1bWVudCwgc2luY2UgdGhhdCBoYXBwZW5zIHRvIGJlIHRydWVcbiAgLy8gaW4gZXZlcnkgY2FzZSwgc28gd2UgZG9uJ3QgaGF2ZSB0byB0b3VjaCB0aGUgYXJndW1lbnRzIG9iamVjdC4gVGhlXG4gIC8vIG9ubHkgYWRkaXRpb25hbCBhbGxvY2F0aW9uIHJlcXVpcmVkIGlzIHRoZSBjb21wbGV0aW9uIHJlY29yZCwgd2hpY2hcbiAgLy8gaGFzIGEgc3RhYmxlIHNoYXBlIGFuZCBzbyBob3BlZnVsbHkgc2hvdWxkIGJlIGNoZWFwIHRvIGFsbG9jYXRlLlxuICBmdW5jdGlvbiB0cnlDYXRjaChmbiwgb2JqLCBhcmcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJub3JtYWxcIiwgYXJnOiBmbi5jYWxsKG9iaiwgYXJnKSB9O1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJ0aHJvd1wiLCBhcmc6IGVyciB9O1xuICAgIH1cbiAgfVxuXG4gIHZhciBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0ID0gXCJzdXNwZW5kZWRTdGFydFwiO1xuICB2YXIgR2VuU3RhdGVTdXNwZW5kZWRZaWVsZCA9IFwic3VzcGVuZGVkWWllbGRcIjtcbiAgdmFyIEdlblN0YXRlRXhlY3V0aW5nID0gXCJleGVjdXRpbmdcIjtcbiAgdmFyIEdlblN0YXRlQ29tcGxldGVkID0gXCJjb21wbGV0ZWRcIjtcblxuICAvLyBSZXR1cm5pbmcgdGhpcyBvYmplY3QgZnJvbSB0aGUgaW5uZXJGbiBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzXG4gIC8vIGJyZWFraW5nIG91dCBvZiB0aGUgZGlzcGF0Y2ggc3dpdGNoIHN0YXRlbWVudC5cbiAgdmFyIENvbnRpbnVlU2VudGluZWwgPSB7fTtcblxuICAvLyBEdW1teSBjb25zdHJ1Y3RvciBmdW5jdGlvbnMgdGhhdCB3ZSB1c2UgYXMgdGhlIC5jb25zdHJ1Y3RvciBhbmRcbiAgLy8gLmNvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzIGZvciBmdW5jdGlvbnMgdGhhdCByZXR1cm4gR2VuZXJhdG9yXG4gIC8vIG9iamVjdHMuIEZvciBmdWxsIHNwZWMgY29tcGxpYW5jZSwgeW91IG1heSB3aXNoIHRvIGNvbmZpZ3VyZSB5b3VyXG4gIC8vIG1pbmlmaWVyIG5vdCB0byBtYW5nbGUgdGhlIG5hbWVzIG9mIHRoZXNlIHR3byBmdW5jdGlvbnMuXG4gIGZ1bmN0aW9uIEdlbmVyYXRvcigpIHt9XG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uKCkge31cbiAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUoKSB7fVxuXG4gIC8vIFRoaXMgaXMgYSBwb2x5ZmlsbCBmb3IgJUl0ZXJhdG9yUHJvdG90eXBlJSBmb3IgZW52aXJvbm1lbnRzIHRoYXRcbiAgLy8gZG9uJ3QgbmF0aXZlbHkgc3VwcG9ydCBpdC5cbiAgdmFyIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG4gIGRlZmluZShJdGVyYXRvclByb3RvdHlwZSwgaXRlcmF0b3JTeW1ib2wsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSk7XG5cbiAgdmFyIGdldFByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mO1xuICB2YXIgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90byAmJiBnZXRQcm90byhnZXRQcm90byh2YWx1ZXMoW10pKSk7XG4gIGlmIChOYXRpdmVJdGVyYXRvclByb3RvdHlwZSAmJlxuICAgICAgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgIT09IE9wICYmXG4gICAgICBoYXNPd24uY2FsbChOYXRpdmVJdGVyYXRvclByb3RvdHlwZSwgaXRlcmF0b3JTeW1ib2wpKSB7XG4gICAgLy8gVGhpcyBlbnZpcm9ubWVudCBoYXMgYSBuYXRpdmUgJUl0ZXJhdG9yUHJvdG90eXBlJTsgdXNlIGl0IGluc3RlYWRcbiAgICAvLyBvZiB0aGUgcG9seWZpbGwuXG4gICAgSXRlcmF0b3JQcm90b3R5cGUgPSBOYXRpdmVJdGVyYXRvclByb3RvdHlwZTtcbiAgfVxuXG4gIHZhciBHcCA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLnByb3RvdHlwZSA9XG4gICAgR2VuZXJhdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUpO1xuICBHZW5lcmF0b3JGdW5jdGlvbi5wcm90b3R5cGUgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZTtcbiAgZGVmaW5lUHJvcGVydHkoR3AsIFwiY29uc3RydWN0b3JcIiwgeyB2YWx1ZTogR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9KTtcbiAgZGVmaW5lUHJvcGVydHkoXG4gICAgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsXG4gICAgXCJjb25zdHJ1Y3RvclwiLFxuICAgIHsgdmFsdWU6IEdlbmVyYXRvckZ1bmN0aW9uLCBjb25maWd1cmFibGU6IHRydWUgfVxuICApO1xuICBHZW5lcmF0b3JGdW5jdGlvbi5kaXNwbGF5TmFtZSA9IGRlZmluZShcbiAgICBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSxcbiAgICB0b1N0cmluZ1RhZ1N5bWJvbCxcbiAgICBcIkdlbmVyYXRvckZ1bmN0aW9uXCJcbiAgKTtcblxuICAvLyBIZWxwZXIgZm9yIGRlZmluaW5nIHRoZSAubmV4dCwgLnRocm93LCBhbmQgLnJldHVybiBtZXRob2RzIG9mIHRoZVxuICAvLyBJdGVyYXRvciBpbnRlcmZhY2UgaW4gdGVybXMgb2YgYSBzaW5nbGUgLl9pbnZva2UgbWV0aG9kLlxuICBmdW5jdGlvbiBkZWZpbmVJdGVyYXRvck1ldGhvZHMocHJvdG90eXBlKSB7XG4gICAgW1wibmV4dFwiLCBcInRocm93XCIsIFwicmV0dXJuXCJdLmZvckVhY2goZnVuY3Rpb24obWV0aG9kKSB7XG4gICAgICBkZWZpbmUocHJvdG90eXBlLCBtZXRob2QsIGZ1bmN0aW9uKGFyZykge1xuICAgICAgICByZXR1cm4gdGhpcy5faW52b2tlKG1ldGhvZCwgYXJnKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZXhwb3J0cy5pc0dlbmVyYXRvckZ1bmN0aW9uID0gZnVuY3Rpb24oZ2VuRnVuKSB7XG4gICAgdmFyIGN0b3IgPSB0eXBlb2YgZ2VuRnVuID09PSBcImZ1bmN0aW9uXCIgJiYgZ2VuRnVuLmNvbnN0cnVjdG9yO1xuICAgIHJldHVybiBjdG9yXG4gICAgICA/IGN0b3IgPT09IEdlbmVyYXRvckZ1bmN0aW9uIHx8XG4gICAgICAgIC8vIEZvciB0aGUgbmF0aXZlIEdlbmVyYXRvckZ1bmN0aW9uIGNvbnN0cnVjdG9yLCB0aGUgYmVzdCB3ZSBjYW5cbiAgICAgICAgLy8gZG8gaXMgdG8gY2hlY2sgaXRzIC5uYW1lIHByb3BlcnR5LlxuICAgICAgICAoY3Rvci5kaXNwbGF5TmFtZSB8fCBjdG9yLm5hbWUpID09PSBcIkdlbmVyYXRvckZ1bmN0aW9uXCJcbiAgICAgIDogZmFsc2U7XG4gIH07XG5cbiAgZXhwb3J0cy5tYXJrID0gZnVuY3Rpb24oZ2VuRnVuKSB7XG4gICAgaWYgKE9iamVjdC5zZXRQcm90b3R5cGVPZikge1xuICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGdlbkZ1biwgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnZW5GdW4uX19wcm90b19fID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7XG4gICAgICBkZWZpbmUoZ2VuRnVuLCB0b1N0cmluZ1RhZ1N5bWJvbCwgXCJHZW5lcmF0b3JGdW5jdGlvblwiKTtcbiAgICB9XG4gICAgZ2VuRnVuLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoR3ApO1xuICAgIHJldHVybiBnZW5GdW47XG4gIH07XG5cbiAgLy8gV2l0aGluIHRoZSBib2R5IG9mIGFueSBhc3luYyBmdW5jdGlvbiwgYGF3YWl0IHhgIGlzIHRyYW5zZm9ybWVkIHRvXG4gIC8vIGB5aWVsZCByZWdlbmVyYXRvclJ1bnRpbWUuYXdyYXAoeClgLCBzbyB0aGF0IHRoZSBydW50aW1lIGNhbiB0ZXN0XG4gIC8vIGBoYXNPd24uY2FsbCh2YWx1ZSwgXCJfX2F3YWl0XCIpYCB0byBkZXRlcm1pbmUgaWYgdGhlIHlpZWxkZWQgdmFsdWUgaXNcbiAgLy8gbWVhbnQgdG8gYmUgYXdhaXRlZC5cbiAgZXhwb3J0cy5hd3JhcCA9IGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiB7IF9fYXdhaXQ6IGFyZyB9O1xuICB9O1xuXG4gIGZ1bmN0aW9uIEFzeW5jSXRlcmF0b3IoZ2VuZXJhdG9yLCBQcm9taXNlSW1wbCkge1xuICAgIGZ1bmN0aW9uIGludm9rZShtZXRob2QsIGFyZywgcmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2goZ2VuZXJhdG9yW21ldGhvZF0sIGdlbmVyYXRvciwgYXJnKTtcbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHJlamVjdChyZWNvcmQuYXJnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciByZXN1bHQgPSByZWNvcmQuYXJnO1xuICAgICAgICB2YXIgdmFsdWUgPSByZXN1bHQudmFsdWU7XG4gICAgICAgIGlmICh2YWx1ZSAmJlxuICAgICAgICAgICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICBoYXNPd24uY2FsbCh2YWx1ZSwgXCJfX2F3YWl0XCIpKSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2VJbXBsLnJlc29sdmUodmFsdWUuX19hd2FpdCkudGhlbihmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgaW52b2tlKFwibmV4dFwiLCB2YWx1ZSwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAgIGludm9rZShcInRocm93XCIsIGVyciwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBQcm9taXNlSW1wbC5yZXNvbHZlKHZhbHVlKS50aGVuKGZ1bmN0aW9uKHVud3JhcHBlZCkge1xuICAgICAgICAgIC8vIFdoZW4gYSB5aWVsZGVkIFByb21pc2UgaXMgcmVzb2x2ZWQsIGl0cyBmaW5hbCB2YWx1ZSBiZWNvbWVzXG4gICAgICAgICAgLy8gdGhlIC52YWx1ZSBvZiB0aGUgUHJvbWlzZTx7dmFsdWUsZG9uZX0+IHJlc3VsdCBmb3IgdGhlXG4gICAgICAgICAgLy8gY3VycmVudCBpdGVyYXRpb24uXG4gICAgICAgICAgcmVzdWx0LnZhbHVlID0gdW53cmFwcGVkO1xuICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgfSwgZnVuY3Rpb24oZXJyb3IpIHtcbiAgICAgICAgICAvLyBJZiBhIHJlamVjdGVkIFByb21pc2Ugd2FzIHlpZWxkZWQsIHRocm93IHRoZSByZWplY3Rpb24gYmFja1xuICAgICAgICAgIC8vIGludG8gdGhlIGFzeW5jIGdlbmVyYXRvciBmdW5jdGlvbiBzbyBpdCBjYW4gYmUgaGFuZGxlZCB0aGVyZS5cbiAgICAgICAgICByZXR1cm4gaW52b2tlKFwidGhyb3dcIiwgZXJyb3IsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBwcmV2aW91c1Byb21pc2U7XG5cbiAgICBmdW5jdGlvbiBlbnF1ZXVlKG1ldGhvZCwgYXJnKSB7XG4gICAgICBmdW5jdGlvbiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlSW1wbChmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcHJldmlvdXNQcm9taXNlID1cbiAgICAgICAgLy8gSWYgZW5xdWV1ZSBoYXMgYmVlbiBjYWxsZWQgYmVmb3JlLCB0aGVuIHdlIHdhbnQgdG8gd2FpdCB1bnRpbFxuICAgICAgICAvLyBhbGwgcHJldmlvdXMgUHJvbWlzZXMgaGF2ZSBiZWVuIHJlc29sdmVkIGJlZm9yZSBjYWxsaW5nIGludm9rZSxcbiAgICAgICAgLy8gc28gdGhhdCByZXN1bHRzIGFyZSBhbHdheXMgZGVsaXZlcmVkIGluIHRoZSBjb3JyZWN0IG9yZGVyLiBJZlxuICAgICAgICAvLyBlbnF1ZXVlIGhhcyBub3QgYmVlbiBjYWxsZWQgYmVmb3JlLCB0aGVuIGl0IGlzIGltcG9ydGFudCB0b1xuICAgICAgICAvLyBjYWxsIGludm9rZSBpbW1lZGlhdGVseSwgd2l0aG91dCB3YWl0aW5nIG9uIGEgY2FsbGJhY2sgdG8gZmlyZSxcbiAgICAgICAgLy8gc28gdGhhdCB0aGUgYXN5bmMgZ2VuZXJhdG9yIGZ1bmN0aW9uIGhhcyB0aGUgb3Bwb3J0dW5pdHkgdG8gZG9cbiAgICAgICAgLy8gYW55IG5lY2Vzc2FyeSBzZXR1cCBpbiBhIHByZWRpY3RhYmxlIHdheS4gVGhpcyBwcmVkaWN0YWJpbGl0eVxuICAgICAgICAvLyBpcyB3aHkgdGhlIFByb21pc2UgY29uc3RydWN0b3Igc3luY2hyb25vdXNseSBpbnZva2VzIGl0c1xuICAgICAgICAvLyBleGVjdXRvciBjYWxsYmFjaywgYW5kIHdoeSBhc3luYyBmdW5jdGlvbnMgc3luY2hyb25vdXNseVxuICAgICAgICAvLyBleGVjdXRlIGNvZGUgYmVmb3JlIHRoZSBmaXJzdCBhd2FpdC4gU2luY2Ugd2UgaW1wbGVtZW50IHNpbXBsZVxuICAgICAgICAvLyBhc3luYyBmdW5jdGlvbnMgaW4gdGVybXMgb2YgYXN5bmMgZ2VuZXJhdG9ycywgaXQgaXMgZXNwZWNpYWxseVxuICAgICAgICAvLyBpbXBvcnRhbnQgdG8gZ2V0IHRoaXMgcmlnaHQsIGV2ZW4gdGhvdWdoIGl0IHJlcXVpcmVzIGNhcmUuXG4gICAgICAgIHByZXZpb3VzUHJvbWlzZSA/IHByZXZpb3VzUHJvbWlzZS50aGVuKFxuICAgICAgICAgIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnLFxuICAgICAgICAgIC8vIEF2b2lkIHByb3BhZ2F0aW5nIGZhaWx1cmVzIHRvIFByb21pc2VzIHJldHVybmVkIGJ5IGxhdGVyXG4gICAgICAgICAgLy8gaW52b2NhdGlvbnMgb2YgdGhlIGl0ZXJhdG9yLlxuICAgICAgICAgIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnXG4gICAgICAgICkgOiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpO1xuICAgIH1cblxuICAgIC8vIERlZmluZSB0aGUgdW5pZmllZCBoZWxwZXIgbWV0aG9kIHRoYXQgaXMgdXNlZCB0byBpbXBsZW1lbnQgLm5leHQsXG4gICAgLy8gLnRocm93LCBhbmQgLnJldHVybiAoc2VlIGRlZmluZUl0ZXJhdG9yTWV0aG9kcykuXG4gICAgZGVmaW5lUHJvcGVydHkodGhpcywgXCJfaW52b2tlXCIsIHsgdmFsdWU6IGVucXVldWUgfSk7XG4gIH1cblxuICBkZWZpbmVJdGVyYXRvck1ldGhvZHMoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUpO1xuICBkZWZpbmUoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUsIGFzeW5jSXRlcmF0b3JTeW1ib2wsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSk7XG4gIGV4cG9ydHMuQXN5bmNJdGVyYXRvciA9IEFzeW5jSXRlcmF0b3I7XG5cbiAgLy8gTm90ZSB0aGF0IHNpbXBsZSBhc3luYyBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIG9uIHRvcCBvZlxuICAvLyBBc3luY0l0ZXJhdG9yIG9iamVjdHM7IHRoZXkganVzdCByZXR1cm4gYSBQcm9taXNlIGZvciB0aGUgdmFsdWUgb2ZcbiAgLy8gdGhlIGZpbmFsIHJlc3VsdCBwcm9kdWNlZCBieSB0aGUgaXRlcmF0b3IuXG4gIGV4cG9ydHMuYXN5bmMgPSBmdW5jdGlvbihpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCwgUHJvbWlzZUltcGwpIHtcbiAgICBpZiAoUHJvbWlzZUltcGwgPT09IHZvaWQgMCkgUHJvbWlzZUltcGwgPSBQcm9taXNlO1xuXG4gICAgdmFyIGl0ZXIgPSBuZXcgQXN5bmNJdGVyYXRvcihcbiAgICAgIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpLFxuICAgICAgUHJvbWlzZUltcGxcbiAgICApO1xuXG4gICAgcmV0dXJuIGV4cG9ydHMuaXNHZW5lcmF0b3JGdW5jdGlvbihvdXRlckZuKVxuICAgICAgPyBpdGVyIC8vIElmIG91dGVyRm4gaXMgYSBnZW5lcmF0b3IsIHJldHVybiB0aGUgZnVsbCBpdGVyYXRvci5cbiAgICAgIDogaXRlci5uZXh0KCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0LmRvbmUgPyByZXN1bHQudmFsdWUgOiBpdGVyLm5leHQoKTtcbiAgICAgICAgfSk7XG4gIH07XG5cbiAgZnVuY3Rpb24gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KSB7XG4gICAgdmFyIHN0YXRlID0gR2VuU3RhdGVTdXNwZW5kZWRTdGFydDtcblxuICAgIHJldHVybiBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcpIHtcbiAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVFeGVjdXRpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgcnVubmluZ1wiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZUNvbXBsZXRlZCkge1xuICAgICAgICBpZiAobWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICB0aHJvdyBhcmc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCZSBmb3JnaXZpbmcsIHBlciAyNS4zLjMuMy4zIG9mIHRoZSBzcGVjOlxuICAgICAgICAvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtZ2VuZXJhdG9ycmVzdW1lXG4gICAgICAgIHJldHVybiBkb25lUmVzdWx0KCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnRleHQubWV0aG9kID0gbWV0aG9kO1xuICAgICAgY29udGV4dC5hcmcgPSBhcmc7XG5cbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIHZhciBkZWxlZ2F0ZSA9IGNvbnRleHQuZGVsZWdhdGU7XG4gICAgICAgIGlmIChkZWxlZ2F0ZSkge1xuICAgICAgICAgIHZhciBkZWxlZ2F0ZVJlc3VsdCA9IG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpO1xuICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKGRlbGVnYXRlUmVzdWx0ID09PSBDb250aW51ZVNlbnRpbmVsKSBjb250aW51ZTtcbiAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZVJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwibmV4dFwiKSB7XG4gICAgICAgICAgLy8gU2V0dGluZyBjb250ZXh0Ll9zZW50IGZvciBsZWdhY3kgc3VwcG9ydCBvZiBCYWJlbCdzXG4gICAgICAgICAgLy8gZnVuY3Rpb24uc2VudCBpbXBsZW1lbnRhdGlvbi5cbiAgICAgICAgICBjb250ZXh0LnNlbnQgPSBjb250ZXh0Ll9zZW50ID0gY29udGV4dC5hcmc7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0KSB7XG4gICAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkO1xuICAgICAgICAgICAgdGhyb3cgY29udGV4dC5hcmc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZyk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJyZXR1cm5cIikge1xuICAgICAgICAgIGNvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIGNvbnRleHQuYXJnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRlID0gR2VuU3RhdGVFeGVjdXRpbmc7XG5cbiAgICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpO1xuICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwibm9ybWFsXCIpIHtcbiAgICAgICAgICAvLyBJZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGZyb20gaW5uZXJGbiwgd2UgbGVhdmUgc3RhdGUgPT09XG4gICAgICAgICAgLy8gR2VuU3RhdGVFeGVjdXRpbmcgYW5kIGxvb3AgYmFjayBmb3IgYW5vdGhlciBpbnZvY2F0aW9uLlxuICAgICAgICAgIHN0YXRlID0gY29udGV4dC5kb25lXG4gICAgICAgICAgICA/IEdlblN0YXRlQ29tcGxldGVkXG4gICAgICAgICAgICA6IEdlblN0YXRlU3VzcGVuZGVkWWllbGQ7XG5cbiAgICAgICAgICBpZiAocmVjb3JkLmFyZyA9PT0gQ29udGludWVTZW50aW5lbCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiByZWNvcmQuYXJnLFxuICAgICAgICAgICAgZG9uZTogY29udGV4dC5kb25lXG4gICAgICAgICAgfTtcblxuICAgICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkO1xuICAgICAgICAgIC8vIERpc3BhdGNoIHRoZSBleGNlcHRpb24gYnkgbG9vcGluZyBiYWNrIGFyb3VuZCB0byB0aGVcbiAgICAgICAgICAvLyBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGNvbnRleHQuYXJnKSBjYWxsIGFib3ZlLlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvLyBDYWxsIGRlbGVnYXRlLml0ZXJhdG9yW2NvbnRleHQubWV0aG9kXShjb250ZXh0LmFyZykgYW5kIGhhbmRsZSB0aGVcbiAgLy8gcmVzdWx0LCBlaXRoZXIgYnkgcmV0dXJuaW5nIGEgeyB2YWx1ZSwgZG9uZSB9IHJlc3VsdCBmcm9tIHRoZVxuICAvLyBkZWxlZ2F0ZSBpdGVyYXRvciwgb3IgYnkgbW9kaWZ5aW5nIGNvbnRleHQubWV0aG9kIGFuZCBjb250ZXh0LmFyZyxcbiAgLy8gc2V0dGluZyBjb250ZXh0LmRlbGVnYXRlIHRvIG51bGwsIGFuZCByZXR1cm5pbmcgdGhlIENvbnRpbnVlU2VudGluZWwuXG4gIGZ1bmN0aW9uIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpIHtcbiAgICB2YXIgbWV0aG9kTmFtZSA9IGNvbnRleHQubWV0aG9kO1xuICAgIHZhciBtZXRob2QgPSBkZWxlZ2F0ZS5pdGVyYXRvclttZXRob2ROYW1lXTtcbiAgICBpZiAobWV0aG9kID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIEEgLnRocm93IG9yIC5yZXR1cm4gd2hlbiB0aGUgZGVsZWdhdGUgaXRlcmF0b3IgaGFzIG5vIC50aHJvd1xuICAgICAgLy8gbWV0aG9kLCBvciBhIG1pc3NpbmcgLm5leHQgbWVodG9kLCBhbHdheXMgdGVybWluYXRlIHRoZVxuICAgICAgLy8geWllbGQqIGxvb3AuXG4gICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcblxuICAgICAgLy8gTm90ZTogW1wicmV0dXJuXCJdIG11c3QgYmUgdXNlZCBmb3IgRVMzIHBhcnNpbmcgY29tcGF0aWJpbGl0eS5cbiAgICAgIGlmIChtZXRob2ROYW1lID09PSBcInRocm93XCIgJiYgZGVsZWdhdGUuaXRlcmF0b3JbXCJyZXR1cm5cIl0pIHtcbiAgICAgICAgLy8gSWYgdGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGhhcyBhIHJldHVybiBtZXRob2QsIGdpdmUgaXQgYVxuICAgICAgICAvLyBjaGFuY2UgdG8gY2xlYW4gdXAuXG4gICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJyZXR1cm5cIjtcbiAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICAgIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpO1xuXG4gICAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgLy8gSWYgbWF5YmVJbnZva2VEZWxlZ2F0ZShjb250ZXh0KSBjaGFuZ2VkIGNvbnRleHQubWV0aG9kIGZyb21cbiAgICAgICAgICAvLyBcInJldHVyblwiIHRvIFwidGhyb3dcIiwgbGV0IHRoYXQgb3ZlcnJpZGUgdGhlIFR5cGVFcnJvciBiZWxvdy5cbiAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG1ldGhvZE5hbWUgIT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICAgIGNvbnRleHQuYXJnID0gbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICBcIlRoZSBpdGVyYXRvciBkb2VzIG5vdCBwcm92aWRlIGEgJ1wiICsgbWV0aG9kTmFtZSArIFwiJyBtZXRob2RcIik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cblxuICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChtZXRob2QsIGRlbGVnYXRlLml0ZXJhdG9yLCBjb250ZXh0LmFyZyk7XG5cbiAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICBjb250ZXh0LmFyZyA9IHJlY29yZC5hcmc7XG4gICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cblxuICAgIHZhciBpbmZvID0gcmVjb3JkLmFyZztcblxuICAgIGlmICghIGluZm8pIHtcbiAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKFwiaXRlcmF0b3IgcmVzdWx0IGlzIG5vdCBhbiBvYmplY3RcIik7XG4gICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cblxuICAgIGlmIChpbmZvLmRvbmUpIHtcbiAgICAgIC8vIEFzc2lnbiB0aGUgcmVzdWx0IG9mIHRoZSBmaW5pc2hlZCBkZWxlZ2F0ZSB0byB0aGUgdGVtcG9yYXJ5XG4gICAgICAvLyB2YXJpYWJsZSBzcGVjaWZpZWQgYnkgZGVsZWdhdGUucmVzdWx0TmFtZSAoc2VlIGRlbGVnYXRlWWllbGQpLlxuICAgICAgY29udGV4dFtkZWxlZ2F0ZS5yZXN1bHROYW1lXSA9IGluZm8udmFsdWU7XG5cbiAgICAgIC8vIFJlc3VtZSBleGVjdXRpb24gYXQgdGhlIGRlc2lyZWQgbG9jYXRpb24gKHNlZSBkZWxlZ2F0ZVlpZWxkKS5cbiAgICAgIGNvbnRleHQubmV4dCA9IGRlbGVnYXRlLm5leHRMb2M7XG5cbiAgICAgIC8vIElmIGNvbnRleHQubWV0aG9kIHdhcyBcInRocm93XCIgYnV0IHRoZSBkZWxlZ2F0ZSBoYW5kbGVkIHRoZVxuICAgICAgLy8gZXhjZXB0aW9uLCBsZXQgdGhlIG91dGVyIGdlbmVyYXRvciBwcm9jZWVkIG5vcm1hbGx5LiBJZlxuICAgICAgLy8gY29udGV4dC5tZXRob2Qgd2FzIFwibmV4dFwiLCBmb3JnZXQgY29udGV4dC5hcmcgc2luY2UgaXQgaGFzIGJlZW5cbiAgICAgIC8vIFwiY29uc3VtZWRcIiBieSB0aGUgZGVsZWdhdGUgaXRlcmF0b3IuIElmIGNvbnRleHQubWV0aG9kIHdhc1xuICAgICAgLy8gXCJyZXR1cm5cIiwgYWxsb3cgdGhlIG9yaWdpbmFsIC5yZXR1cm4gY2FsbCB0byBjb250aW51ZSBpbiB0aGVcbiAgICAgIC8vIG91dGVyIGdlbmVyYXRvci5cbiAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCAhPT0gXCJyZXR1cm5cIikge1xuICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZS15aWVsZCB0aGUgcmVzdWx0IHJldHVybmVkIGJ5IHRoZSBkZWxlZ2F0ZSBtZXRob2QuXG4gICAgICByZXR1cm4gaW5mbztcbiAgICB9XG5cbiAgICAvLyBUaGUgZGVsZWdhdGUgaXRlcmF0b3IgaXMgZmluaXNoZWQsIHNvIGZvcmdldCBpdCBhbmQgY29udGludWUgd2l0aFxuICAgIC8vIHRoZSBvdXRlciBnZW5lcmF0b3IuXG4gICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gIH1cblxuICAvLyBEZWZpbmUgR2VuZXJhdG9yLnByb3RvdHlwZS57bmV4dCx0aHJvdyxyZXR1cm59IGluIHRlcm1zIG9mIHRoZVxuICAvLyB1bmlmaWVkIC5faW52b2tlIGhlbHBlciBtZXRob2QuXG4gIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhHcCk7XG5cbiAgZGVmaW5lKEdwLCB0b1N0cmluZ1RhZ1N5bWJvbCwgXCJHZW5lcmF0b3JcIik7XG5cbiAgLy8gQSBHZW5lcmF0b3Igc2hvdWxkIGFsd2F5cyByZXR1cm4gaXRzZWxmIGFzIHRoZSBpdGVyYXRvciBvYmplY3Qgd2hlbiB0aGVcbiAgLy8gQEBpdGVyYXRvciBmdW5jdGlvbiBpcyBjYWxsZWQgb24gaXQuIFNvbWUgYnJvd3NlcnMnIGltcGxlbWVudGF0aW9ucyBvZiB0aGVcbiAgLy8gaXRlcmF0b3IgcHJvdG90eXBlIGNoYWluIGluY29ycmVjdGx5IGltcGxlbWVudCB0aGlzLCBjYXVzaW5nIHRoZSBHZW5lcmF0b3JcbiAgLy8gb2JqZWN0IHRvIG5vdCBiZSByZXR1cm5lZCBmcm9tIHRoaXMgY2FsbC4gVGhpcyBlbnN1cmVzIHRoYXQgZG9lc24ndCBoYXBwZW4uXG4gIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVnZW5lcmF0b3IvaXNzdWVzLzI3NCBmb3IgbW9yZSBkZXRhaWxzLlxuICBkZWZpbmUoR3AsIGl0ZXJhdG9yU3ltYm9sLCBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSk7XG5cbiAgZGVmaW5lKEdwLCBcInRvU3RyaW5nXCIsIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBcIltvYmplY3QgR2VuZXJhdG9yXVwiO1xuICB9KTtcblxuICBmdW5jdGlvbiBwdXNoVHJ5RW50cnkobG9jcykge1xuICAgIHZhciBlbnRyeSA9IHsgdHJ5TG9jOiBsb2NzWzBdIH07XG5cbiAgICBpZiAoMSBpbiBsb2NzKSB7XG4gICAgICBlbnRyeS5jYXRjaExvYyA9IGxvY3NbMV07XG4gICAgfVxuXG4gICAgaWYgKDIgaW4gbG9jcykge1xuICAgICAgZW50cnkuZmluYWxseUxvYyA9IGxvY3NbMl07XG4gICAgICBlbnRyeS5hZnRlckxvYyA9IGxvY3NbM107XG4gICAgfVxuXG4gICAgdGhpcy50cnlFbnRyaWVzLnB1c2goZW50cnkpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVzZXRUcnlFbnRyeShlbnRyeSkge1xuICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uIHx8IHt9O1xuICAgIHJlY29yZC50eXBlID0gXCJub3JtYWxcIjtcbiAgICBkZWxldGUgcmVjb3JkLmFyZztcbiAgICBlbnRyeS5jb21wbGV0aW9uID0gcmVjb3JkO1xuICB9XG5cbiAgZnVuY3Rpb24gQ29udGV4dCh0cnlMb2NzTGlzdCkge1xuICAgIC8vIFRoZSByb290IGVudHJ5IG9iamVjdCAoZWZmZWN0aXZlbHkgYSB0cnkgc3RhdGVtZW50IHdpdGhvdXQgYSBjYXRjaFxuICAgIC8vIG9yIGEgZmluYWxseSBibG9jaykgZ2l2ZXMgdXMgYSBwbGFjZSB0byBzdG9yZSB2YWx1ZXMgdGhyb3duIGZyb21cbiAgICAvLyBsb2NhdGlvbnMgd2hlcmUgdGhlcmUgaXMgbm8gZW5jbG9zaW5nIHRyeSBzdGF0ZW1lbnQuXG4gICAgdGhpcy50cnlFbnRyaWVzID0gW3sgdHJ5TG9jOiBcInJvb3RcIiB9XTtcbiAgICB0cnlMb2NzTGlzdC5mb3JFYWNoKHB1c2hUcnlFbnRyeSwgdGhpcyk7XG4gICAgdGhpcy5yZXNldCh0cnVlKTtcbiAgfVxuXG4gIGV4cG9ydHMua2V5cyA9IGZ1bmN0aW9uKHZhbCkge1xuICAgIHZhciBvYmplY3QgPSBPYmplY3QodmFsKTtcbiAgICB2YXIga2V5cyA9IFtdO1xuICAgIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHtcbiAgICAgIGtleXMucHVzaChrZXkpO1xuICAgIH1cbiAgICBrZXlzLnJldmVyc2UoKTtcblxuICAgIC8vIFJhdGhlciB0aGFuIHJldHVybmluZyBhbiBvYmplY3Qgd2l0aCBhIG5leHQgbWV0aG9kLCB3ZSBrZWVwXG4gICAgLy8gdGhpbmdzIHNpbXBsZSBhbmQgcmV0dXJuIHRoZSBuZXh0IGZ1bmN0aW9uIGl0c2VsZi5cbiAgICByZXR1cm4gZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgIHdoaWxlIChrZXlzLmxlbmd0aCkge1xuICAgICAgICB2YXIga2V5ID0ga2V5cy5wb3AoKTtcbiAgICAgICAgaWYgKGtleSBpbiBvYmplY3QpIHtcbiAgICAgICAgICBuZXh0LnZhbHVlID0ga2V5O1xuICAgICAgICAgIG5leHQuZG9uZSA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRvIGF2b2lkIGNyZWF0aW5nIGFuIGFkZGl0aW9uYWwgb2JqZWN0LCB3ZSBqdXN0IGhhbmcgdGhlIC52YWx1ZVxuICAgICAgLy8gYW5kIC5kb25lIHByb3BlcnRpZXMgb2ZmIHRoZSBuZXh0IGZ1bmN0aW9uIG9iamVjdCBpdHNlbGYuIFRoaXNcbiAgICAgIC8vIGFsc28gZW5zdXJlcyB0aGF0IHRoZSBtaW5pZmllciB3aWxsIG5vdCBhbm9ueW1pemUgdGhlIGZ1bmN0aW9uLlxuICAgICAgbmV4dC5kb25lID0gdHJ1ZTtcbiAgICAgIHJldHVybiBuZXh0O1xuICAgIH07XG4gIH07XG5cbiAgZnVuY3Rpb24gdmFsdWVzKGl0ZXJhYmxlKSB7XG4gICAgaWYgKGl0ZXJhYmxlKSB7XG4gICAgICB2YXIgaXRlcmF0b3JNZXRob2QgPSBpdGVyYWJsZVtpdGVyYXRvclN5bWJvbF07XG4gICAgICBpZiAoaXRlcmF0b3JNZXRob2QpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yTWV0aG9kLmNhbGwoaXRlcmFibGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGl0ZXJhYmxlLm5leHQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gaXRlcmFibGU7XG4gICAgICB9XG5cbiAgICAgIGlmICghaXNOYU4oaXRlcmFibGUubGVuZ3RoKSkge1xuICAgICAgICB2YXIgaSA9IC0xLCBuZXh0ID0gZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgICB3aGlsZSAoKytpIDwgaXRlcmFibGUubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duLmNhbGwoaXRlcmFibGUsIGkpKSB7XG4gICAgICAgICAgICAgIG5leHQudmFsdWUgPSBpdGVyYWJsZVtpXTtcbiAgICAgICAgICAgICAgbmV4dC5kb25lID0gZmFsc2U7XG4gICAgICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIG5leHQudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgbmV4dC5kb25lID0gdHJ1ZTtcblxuICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBuZXh0Lm5leHQgPSBuZXh0O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybiBhbiBpdGVyYXRvciB3aXRoIG5vIHZhbHVlcy5cbiAgICByZXR1cm4geyBuZXh0OiBkb25lUmVzdWx0IH07XG4gIH1cbiAgZXhwb3J0cy52YWx1ZXMgPSB2YWx1ZXM7XG5cbiAgZnVuY3Rpb24gZG9uZVJlc3VsdCgpIHtcbiAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gIH1cblxuICBDb250ZXh0LnByb3RvdHlwZSA9IHtcbiAgICBjb25zdHJ1Y3RvcjogQ29udGV4dCxcblxuICAgIHJlc2V0OiBmdW5jdGlvbihza2lwVGVtcFJlc2V0KSB7XG4gICAgICB0aGlzLnByZXYgPSAwO1xuICAgICAgdGhpcy5uZXh0ID0gMDtcbiAgICAgIC8vIFJlc2V0dGluZyBjb250ZXh0Ll9zZW50IGZvciBsZWdhY3kgc3VwcG9ydCBvZiBCYWJlbCdzXG4gICAgICAvLyBmdW5jdGlvbi5zZW50IGltcGxlbWVudGF0aW9uLlxuICAgICAgdGhpcy5zZW50ID0gdGhpcy5fc2VudCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuZG9uZSA9IGZhbHNlO1xuICAgICAgdGhpcy5kZWxlZ2F0ZSA9IG51bGw7XG5cbiAgICAgIHRoaXMubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICB0aGlzLmFyZyA9IHVuZGVmaW5lZDtcblxuICAgICAgdGhpcy50cnlFbnRyaWVzLmZvckVhY2gocmVzZXRUcnlFbnRyeSk7XG5cbiAgICAgIGlmICghc2tpcFRlbXBSZXNldCkge1xuICAgICAgICBmb3IgKHZhciBuYW1lIGluIHRoaXMpIHtcbiAgICAgICAgICAvLyBOb3Qgc3VyZSBhYm91dCB0aGUgb3B0aW1hbCBvcmRlciBvZiB0aGVzZSBjb25kaXRpb25zOlxuICAgICAgICAgIGlmIChuYW1lLmNoYXJBdCgwKSA9PT0gXCJ0XCIgJiZcbiAgICAgICAgICAgICAgaGFzT3duLmNhbGwodGhpcywgbmFtZSkgJiZcbiAgICAgICAgICAgICAgIWlzTmFOKCtuYW1lLnNsaWNlKDEpKSkge1xuICAgICAgICAgICAgdGhpc1tuYW1lXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc3RvcDogZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLmRvbmUgPSB0cnVlO1xuXG4gICAgICB2YXIgcm9vdEVudHJ5ID0gdGhpcy50cnlFbnRyaWVzWzBdO1xuICAgICAgdmFyIHJvb3RSZWNvcmQgPSByb290RW50cnkuY29tcGxldGlvbjtcbiAgICAgIGlmIChyb290UmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICB0aHJvdyByb290UmVjb3JkLmFyZztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMucnZhbDtcbiAgICB9LFxuXG4gICAgZGlzcGF0Y2hFeGNlcHRpb246IGZ1bmN0aW9uKGV4Y2VwdGlvbikge1xuICAgICAgaWYgKHRoaXMuZG9uZSkge1xuICAgICAgICB0aHJvdyBleGNlcHRpb247XG4gICAgICB9XG5cbiAgICAgIHZhciBjb250ZXh0ID0gdGhpcztcbiAgICAgIGZ1bmN0aW9uIGhhbmRsZShsb2MsIGNhdWdodCkge1xuICAgICAgICByZWNvcmQudHlwZSA9IFwidGhyb3dcIjtcbiAgICAgICAgcmVjb3JkLmFyZyA9IGV4Y2VwdGlvbjtcbiAgICAgICAgY29udGV4dC5uZXh0ID0gbG9jO1xuXG4gICAgICAgIGlmIChjYXVnaHQpIHtcbiAgICAgICAgICAvLyBJZiB0aGUgZGlzcGF0Y2hlZCBleGNlcHRpb24gd2FzIGNhdWdodCBieSBhIGNhdGNoIGJsb2NrLFxuICAgICAgICAgIC8vIHRoZW4gbGV0IHRoYXQgY2F0Y2ggYmxvY2sgaGFuZGxlIHRoZSBleGNlcHRpb24gbm9ybWFsbHkuXG4gICAgICAgICAgY29udGV4dC5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhISBjYXVnaHQ7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjtcblxuICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSBcInJvb3RcIikge1xuICAgICAgICAgIC8vIEV4Y2VwdGlvbiB0aHJvd24gb3V0c2lkZSBvZiBhbnkgdHJ5IGJsb2NrIHRoYXQgY291bGQgaGFuZGxlXG4gICAgICAgICAgLy8gaXQsIHNvIHNldCB0aGUgY29tcGxldGlvbiB2YWx1ZSBvZiB0aGUgZW50aXJlIGZ1bmN0aW9uIHRvXG4gICAgICAgICAgLy8gdGhyb3cgdGhlIGV4Y2VwdGlvbi5cbiAgICAgICAgICByZXR1cm4gaGFuZGxlKFwiZW5kXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYpIHtcbiAgICAgICAgICB2YXIgaGFzQ2F0Y2ggPSBoYXNPd24uY2FsbChlbnRyeSwgXCJjYXRjaExvY1wiKTtcbiAgICAgICAgICB2YXIgaGFzRmluYWxseSA9IGhhc093bi5jYWxsKGVudHJ5LCBcImZpbmFsbHlMb2NcIik7XG5cbiAgICAgICAgICBpZiAoaGFzQ2F0Y2ggJiYgaGFzRmluYWxseSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsIHRydWUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuZmluYWxseUxvYyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2UgaWYgKGhhc0NhdGNoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgdHJ1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2UgaWYgKGhhc0ZpbmFsbHkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuZmluYWxseUxvYyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidHJ5IHN0YXRlbWVudCB3aXRob3V0IGNhdGNoIG9yIGZpbmFsbHlcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFicnVwdDogZnVuY3Rpb24odHlwZSwgYXJnKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYgJiZcbiAgICAgICAgICAgIGhhc093bi5jYWxsKGVudHJ5LCBcImZpbmFsbHlMb2NcIikgJiZcbiAgICAgICAgICAgIHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICB2YXIgZmluYWxseUVudHJ5ID0gZW50cnk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGZpbmFsbHlFbnRyeSAmJlxuICAgICAgICAgICh0eXBlID09PSBcImJyZWFrXCIgfHxcbiAgICAgICAgICAgdHlwZSA9PT0gXCJjb250aW51ZVwiKSAmJlxuICAgICAgICAgIGZpbmFsbHlFbnRyeS50cnlMb2MgPD0gYXJnICYmXG4gICAgICAgICAgYXJnIDw9IGZpbmFsbHlFbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgIC8vIElnbm9yZSB0aGUgZmluYWxseSBlbnRyeSBpZiBjb250cm9sIGlzIG5vdCBqdW1waW5nIHRvIGFcbiAgICAgICAgLy8gbG9jYXRpb24gb3V0c2lkZSB0aGUgdHJ5L2NhdGNoIGJsb2NrLlxuICAgICAgICBmaW5hbGx5RW50cnkgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVjb3JkID0gZmluYWxseUVudHJ5ID8gZmluYWxseUVudHJ5LmNvbXBsZXRpb24gOiB7fTtcbiAgICAgIHJlY29yZC50eXBlID0gdHlwZTtcbiAgICAgIHJlY29yZC5hcmcgPSBhcmc7XG5cbiAgICAgIGlmIChmaW5hbGx5RW50cnkpIHtcbiAgICAgICAgdGhpcy5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgdGhpcy5uZXh0ID0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2M7XG4gICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5jb21wbGV0ZShyZWNvcmQpO1xuICAgIH0sXG5cbiAgICBjb21wbGV0ZTogZnVuY3Rpb24ocmVjb3JkLCBhZnRlckxvYykge1xuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgdGhyb3cgcmVjb3JkLmFyZztcbiAgICAgIH1cblxuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcImJyZWFrXCIgfHxcbiAgICAgICAgICByZWNvcmQudHlwZSA9PT0gXCJjb250aW51ZVwiKSB7XG4gICAgICAgIHRoaXMubmV4dCA9IHJlY29yZC5hcmc7XG4gICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcInJldHVyblwiKSB7XG4gICAgICAgIHRoaXMucnZhbCA9IHRoaXMuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgICAgdGhpcy5tZXRob2QgPSBcInJldHVyblwiO1xuICAgICAgICB0aGlzLm5leHQgPSBcImVuZFwiO1xuICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJub3JtYWxcIiAmJiBhZnRlckxvYykge1xuICAgICAgICB0aGlzLm5leHQgPSBhZnRlckxvYztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfSxcblxuICAgIGZpbmlzaDogZnVuY3Rpb24oZmluYWxseUxvYykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS5maW5hbGx5TG9jID09PSBmaW5hbGx5TG9jKSB7XG4gICAgICAgICAgdGhpcy5jb21wbGV0ZShlbnRyeS5jb21wbGV0aW9uLCBlbnRyeS5hZnRlckxvYyk7XG4gICAgICAgICAgcmVzZXRUcnlFbnRyeShlbnRyeSk7XG4gICAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgXCJjYXRjaFwiOiBmdW5jdGlvbih0cnlMb2MpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSB0cnlMb2MpIHtcbiAgICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjtcbiAgICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgICAgdmFyIHRocm93biA9IHJlY29yZC5hcmc7XG4gICAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRocm93bjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUaGUgY29udGV4dC5jYXRjaCBtZXRob2QgbXVzdCBvbmx5IGJlIGNhbGxlZCB3aXRoIGEgbG9jYXRpb25cbiAgICAgIC8vIGFyZ3VtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gYSBrbm93biBjYXRjaCBibG9jay5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdFwiKTtcbiAgICB9LFxuXG4gICAgZGVsZWdhdGVZaWVsZDogZnVuY3Rpb24oaXRlcmFibGUsIHJlc3VsdE5hbWUsIG5leHRMb2MpIHtcbiAgICAgIHRoaXMuZGVsZWdhdGUgPSB7XG4gICAgICAgIGl0ZXJhdG9yOiB2YWx1ZXMoaXRlcmFibGUpLFxuICAgICAgICByZXN1bHROYW1lOiByZXN1bHROYW1lLFxuICAgICAgICBuZXh0TG9jOiBuZXh0TG9jXG4gICAgICB9O1xuXG4gICAgICBpZiAodGhpcy5tZXRob2QgPT09IFwibmV4dFwiKSB7XG4gICAgICAgIC8vIERlbGliZXJhdGVseSBmb3JnZXQgdGhlIGxhc3Qgc2VudCB2YWx1ZSBzbyB0aGF0IHdlIGRvbid0XG4gICAgICAgIC8vIGFjY2lkZW50YWxseSBwYXNzIGl0IG9uIHRvIHRoZSBkZWxlZ2F0ZS5cbiAgICAgICAgdGhpcy5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cbiAgfTtcblxuICAvLyBSZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhpcyBzY3JpcHQgaXMgZXhlY3V0aW5nIGFzIGEgQ29tbW9uSlMgbW9kdWxlXG4gIC8vIG9yIG5vdCwgcmV0dXJuIHRoZSBydW50aW1lIG9iamVjdCBzbyB0aGF0IHdlIGNhbiBkZWNsYXJlIHRoZSB2YXJpYWJsZVxuICAvLyByZWdlbmVyYXRvclJ1bnRpbWUgaW4gdGhlIG91dGVyIHNjb3BlLCB3aGljaCBhbGxvd3MgdGhpcyBtb2R1bGUgdG8gYmVcbiAgLy8gaW5qZWN0ZWQgZWFzaWx5IGJ5IGBiaW4vcmVnZW5lcmF0b3IgLS1pbmNsdWRlLXJ1bnRpbWUgc2NyaXB0LmpzYC5cbiAgcmV0dXJuIGV4cG9ydHM7XG5cbn0oXG4gIC8vIElmIHRoaXMgc2NyaXB0IGlzIGV4ZWN1dGluZyBhcyBhIENvbW1vbkpTIG1vZHVsZSwgdXNlIG1vZHVsZS5leHBvcnRzXG4gIC8vIGFzIHRoZSByZWdlbmVyYXRvclJ1bnRpbWUgbmFtZXNwYWNlLiBPdGhlcndpc2UgY3JlYXRlIGEgbmV3IGVtcHR5XG4gIC8vIG9iamVjdC4gRWl0aGVyIHdheSwgdGhlIHJlc3VsdGluZyBvYmplY3Qgd2lsbCBiZSB1c2VkIHRvIGluaXRpYWxpemVcbiAgLy8gdGhlIHJlZ2VuZXJhdG9yUnVudGltZSB2YXJpYWJsZSBhdCB0aGUgdG9wIG9mIHRoaXMgZmlsZS5cbiAgdHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIiA/IG1vZHVsZS5leHBvcnRzIDoge31cbikpO1xuXG50cnkge1xuICByZWdlbmVyYXRvclJ1bnRpbWUgPSBydW50aW1lO1xufSBjYXRjaCAoYWNjaWRlbnRhbFN0cmljdE1vZGUpIHtcbiAgLy8gVGhpcyBtb2R1bGUgc2hvdWxkIG5vdCBiZSBydW5uaW5nIGluIHN0cmljdCBtb2RlLCBzbyB0aGUgYWJvdmVcbiAgLy8gYXNzaWdubWVudCBzaG91bGQgYWx3YXlzIHdvcmsgdW5sZXNzIHNvbWV0aGluZyBpcyBtaXNjb25maWd1cmVkLiBKdXN0XG4gIC8vIGluIGNhc2UgcnVudGltZS5qcyBhY2NpZGVudGFsbHkgcnVucyBpbiBzdHJpY3QgbW9kZSwgaW4gbW9kZXJuIGVuZ2luZXNcbiAgLy8gd2UgY2FuIGV4cGxpY2l0bHkgYWNjZXNzIGdsb2JhbFRoaXMuIEluIG9sZGVyIGVuZ2luZXMgd2UgY2FuIGVzY2FwZVxuICAvLyBzdHJpY3QgbW9kZSB1c2luZyBhIGdsb2JhbCBGdW5jdGlvbiBjYWxsLiBUaGlzIGNvdWxkIGNvbmNlaXZhYmx5IGZhaWxcbiAgLy8gaWYgYSBDb250ZW50IFNlY3VyaXR5IFBvbGljeSBmb3JiaWRzIHVzaW5nIEZ1bmN0aW9uLCBidXQgaW4gdGhhdCBjYXNlXG4gIC8vIHRoZSBwcm9wZXIgc29sdXRpb24gaXMgdG8gZml4IHRoZSBhY2NpZGVudGFsIHN0cmljdCBtb2RlIHByb2JsZW0uIElmXG4gIC8vIHlvdSd2ZSBtaXNjb25maWd1cmVkIHlvdXIgYnVuZGxlciB0byBmb3JjZSBzdHJpY3QgbW9kZSBhbmQgYXBwbGllZCBhXG4gIC8vIENTUCB0byBmb3JiaWQgRnVuY3Rpb24sIGFuZCB5b3UncmUgbm90IHdpbGxpbmcgdG8gZml4IGVpdGhlciBvZiB0aG9zZVxuICAvLyBwcm9ibGVtcywgcGxlYXNlIGRldGFpbCB5b3VyIHVuaXF1ZSBwcmVkaWNhbWVudCBpbiBhIEdpdEh1YiBpc3N1ZS5cbiAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzID09PSBcIm9iamVjdFwiKSB7XG4gICAgZ2xvYmFsVGhpcy5yZWdlbmVyYXRvclJ1bnRpbWUgPSBydW50aW1lO1xuICB9IGVsc2Uge1xuICAgIEZ1bmN0aW9uKFwiclwiLCBcInJlZ2VuZXJhdG9yUnVudGltZSA9IHJcIikocnVudGltZSk7XG4gIH1cbn1cbiIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gKG1vZHVsZSkgPT4ge1xuXHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cblx0XHQoKSA9PiAobW9kdWxlWydkZWZhdWx0J10pIDpcblx0XHQoKSA9PiAobW9kdWxlKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgeyBhOiBnZXR0ZXIgfSk7XG5cdHJldHVybiBnZXR0ZXI7XG59OyIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBzdGFydHVwXG4vLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8vIFRoaXMgZW50cnkgbW9kdWxlIGlzIHJlZmVyZW5jZWQgYnkgb3RoZXIgbW9kdWxlcyBzbyBpdCBjYW4ndCBiZSBpbmxpbmVkXG5fX3dlYnBhY2tfcmVxdWlyZV9fKDY2Nik7XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNzQzKTtcbiJdLCJuYW1lcyI6WyJyYW5kb21VVUlEIiwiY3J5cHRvIiwiYmluZCIsImdldFJhbmRvbVZhbHVlcyIsInJuZHM4IiwiVWludDhBcnJheSIsInJuZyIsIkVycm9yIiwiYnl0ZVRvSGV4IiwiaSIsInB1c2giLCJ0b1N0cmluZyIsInNsaWNlIiwib3B0aW9ucyIsImJ1ZiIsIm9mZnNldCIsInJuZHMiLCJyYW5kb20iLCJhcnIiLCJ0b0xvd2VyQ2FzZSIsInVuc2FmZVN0cmluZ2lmeSIsIkJPTSIsIktFWV9BQ0NFU1NfVE9LRU4iLCJwcm9tcHQiLCJhcGlLZXkiLCJjaHJvbWUiLCJzdG9yYWdlIiwic3luYyIsImdldCIsIml0ZW1zIiwiY2FjaGUiLCJFeHBpcnlNYXAiLCJhc3luYyIsImdldEFjY2Vzc1Rva2VuIiwicmVzcCIsImZldGNoIiwidGhlbiIsInIiLCJqc29uIiwiY2F0Y2giLCJhY2Nlc3NUb2tlbiIsInNldCIsImdldENvbnZlcnNhdGlvbklkIiwibWV0aG9kIiwiaGVhZGVycyIsIkF1dGhvcml6YXRpb24iLCJsZW5ndGgiLCJpZCIsImRlbGV0ZUNvbnZlcnNhdGlvbiIsImNvbnZlcnNhdGlvbklkIiwiYm9keSIsIkpTT04iLCJzdHJpbmdpZnkiLCJpc192aXNpYmxlIiwic3VjY2VzcyIsImdldFN1bW1hcnkiLCJxdWVzdGlvbiIsImNhbGxiYWNrIiwibWVzc2FnZUpzb24iLCJhY3Rpb24iLCJtZXNzYWdlcyIsInV1aWR2NCIsImF1dGhvciIsInJvbGUiLCJjb250ZW50IiwiY29udGVudF90eXBlIiwicGFydHMiLCJtb2RlbCIsInBhcmVudF9tZXNzYWdlX2lkIiwicmVzb3VyY2UiLCJvbk1lc3NhZ2UiLCJvbkVycm9yIiwiZmV0Y2hPcHRpb25zIiwiZXJyIiwicGFyc2VyIiwib25QYXJzZSIsImlzRmlyc3RDaHVuayIsImJ1ZmZlciIsInN0YXJ0aW5nUG9zaXRpb24iLCJzdGFydGluZ0ZpZWxkTGVuZ3RoIiwiZXZlbnRJZCIsImV2ZW50TmFtZSIsImRhdGEiLCJyZXNldCIsImZlZWQiLCJjaHVuayIsImV2ZXJ5IiwiY2hhckNvZGUiLCJpbmRleCIsImNoYXJDb2RlQXQiLCJoYXNCb20iLCJwb3NpdGlvbiIsImRpc2NhcmRUcmFpbGluZ05ld2xpbmUiLCJjaGFyYWN0ZXIiLCJsaW5lTGVuZ3RoIiwiZmllbGRMZW5ndGgiLCJwYXJzZUV2ZW50U3RyZWFtTGluZSIsImxpbmVCdWZmZXIiLCJ0eXBlIiwiZXZlbnQiLCJub1ZhbHVlIiwiZmllbGQiLCJzdGVwIiwidmFsdWVMZW5ndGgiLCJ2YWx1ZSIsImNvbmNhdCIsImluY2x1ZGVzIiwicmV0cnkiLCJwYXJzZUludCIsIk51bWJlciIsImlzTmFOIiwiY3JlYXRlUGFyc2VyIiwic3RyZWFtIiwicmVhZGVyIiwiZ2V0UmVhZGVyIiwiZG9uZSIsInJlYWQiLCJyZWxlYXNlTG9jayIsInN0cmVhbUFzeW5jSXRlcmFibGUiLCJzdHIiLCJUZXh0RGVjb2RlciIsImRlY29kZSIsImZldGNoU1NFIiwibWVzc2FnZSIsInBhcnNlIiwidGV4dCIsImNvbnNvbGUiLCJsb2ciLCJwcmV2ZW50SW5zdGFuY2UiLCJjb21iaW5lU3VtbWFyaWVzIiwic3VtbWFyaWVzIiwiY29tYmluZWRTdW1tYXJ5Iiwic3VtbWFyeSIsIm9uQ2xpY2tlZCIsImFkZExpc3RlbmVyIiwidGFiIiwidGFiSWQiLCJzZXRUaW1lb3V0Iiwic2V0QmFkZ2VCYWNrZ3JvdW5kQ29sb3IiLCJjb2xvciIsInNldEJhZGdlVGV4dCIsInNjcmlwdGluZyIsImV4ZWN1dGVTY3JpcHQiLCJ0YXJnZXQiLCJmaWxlcyIsInJ1bnRpbWUiLCJvbkNvbm5lY3QiLCJwb3J0IiwicmVxdWVzdCIsInNlbmRlciIsInNlbmRSZXNwb25zZSIsImRlYnVnIiwibWF4TGVuZ3RoIiwiY2h1bmtzIiwid29yZHMiLCJzcGxpdCIsImN1cnJlbnRDaHVuayIsIndvcmQiLCJzcGxpdFRleHRJbnRvQ2h1bmtzIiwiY3VycmVudFN1bW1hcnkiLCJncHRRdWVzdGlvbiIsImN1cnJlbnRBbnN3ZXIiLCJhbnN3ZXIiLCJwb3N0TWVzc2FnZSIsImVycm9yIiwiZGVsZXRlIiwibWFwQWdlQ2xlYW5lciIsImNvbnN0cnVjdG9yIiwibWF4QWdlIiwidGhpcyIsIlN5bWJvbCIsInRvU3RyaW5nVGFnIiwiTWFwIiwia2V5Iiwic2l6ZSIsImNsZWFyIiwiaGFzIiwiRGF0ZSIsIm5vdyIsInZhbHVlcyIsImNyZWF0ZUl0ZXJhdG9yIiwiaXRlbSIsImtleXMiLCJlbnRyaWVzIiwiZm9yRWFjaCIsImNhbGxiYWNrZm4iLCJ0aGlzQXJnIiwiYXBwbHkiLCJpdGVyYXRvciIsInByb2plY3Rpb24iLCJtb2R1bGUiLCJleHBvcnRzIiwicERlZmVyIiwibWFwIiwicHJvcGVydHkiLCJwcm9jZXNzaW5nS2V5IiwicHJvY2Vzc2luZ1RpbWVyIiwicHJvY2Vzc2luZ0RlZmVycmVkIiwiY2xlYW51cCIsInVuZGVmaW5lZCIsInNldHVwVGltZXIiLCJkZWxheSIsInJlc29sdmUiLCJ1bnJlZiIsInByb21pc2UiLCJlbnRyeSIsIl9hIiwib3JpZ2luYWxTZXQiLCJyZXN1bHQiLCJjbGVhclRpbWVvdXQiLCJyZWplY3QiLCJyZXQiLCJQcm9taXNlIiwiT3AiLCJPYmplY3QiLCJwcm90b3R5cGUiLCJoYXNPd24iLCJoYXNPd25Qcm9wZXJ0eSIsImRlZmluZVByb3BlcnR5Iiwib2JqIiwiZGVzYyIsIiRTeW1ib2wiLCJpdGVyYXRvclN5bWJvbCIsImFzeW5jSXRlcmF0b3JTeW1ib2wiLCJhc3luY0l0ZXJhdG9yIiwidG9TdHJpbmdUYWdTeW1ib2wiLCJkZWZpbmUiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJ3cmFwIiwiaW5uZXJGbiIsIm91dGVyRm4iLCJzZWxmIiwidHJ5TG9jc0xpc3QiLCJwcm90b0dlbmVyYXRvciIsIkdlbmVyYXRvciIsImdlbmVyYXRvciIsImNyZWF0ZSIsImNvbnRleHQiLCJDb250ZXh0IiwibWFrZUludm9rZU1ldGhvZCIsInRyeUNhdGNoIiwiZm4iLCJhcmciLCJjYWxsIiwiR2VuU3RhdGVTdXNwZW5kZWRTdGFydCIsIkdlblN0YXRlU3VzcGVuZGVkWWllbGQiLCJHZW5TdGF0ZUV4ZWN1dGluZyIsIkdlblN0YXRlQ29tcGxldGVkIiwiQ29udGludWVTZW50aW5lbCIsIkdlbmVyYXRvckZ1bmN0aW9uIiwiR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUiLCJJdGVyYXRvclByb3RvdHlwZSIsImdldFByb3RvIiwiZ2V0UHJvdG90eXBlT2YiLCJOYXRpdmVJdGVyYXRvclByb3RvdHlwZSIsIkdwIiwiZGVmaW5lSXRlcmF0b3JNZXRob2RzIiwiX2ludm9rZSIsIkFzeW5jSXRlcmF0b3IiLCJQcm9taXNlSW1wbCIsImludm9rZSIsInJlY29yZCIsIl9fYXdhaXQiLCJ1bndyYXBwZWQiLCJwcmV2aW91c1Byb21pc2UiLCJjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZyIsInN0YXRlIiwiZG9uZVJlc3VsdCIsImRlbGVnYXRlIiwiZGVsZWdhdGVSZXN1bHQiLCJtYXliZUludm9rZURlbGVnYXRlIiwic2VudCIsIl9zZW50IiwiZGlzcGF0Y2hFeGNlcHRpb24iLCJhYnJ1cHQiLCJtZXRob2ROYW1lIiwiVHlwZUVycm9yIiwiaW5mbyIsInJlc3VsdE5hbWUiLCJuZXh0IiwibmV4dExvYyIsInB1c2hUcnlFbnRyeSIsImxvY3MiLCJ0cnlMb2MiLCJjYXRjaExvYyIsImZpbmFsbHlMb2MiLCJhZnRlckxvYyIsInRyeUVudHJpZXMiLCJyZXNldFRyeUVudHJ5IiwiY29tcGxldGlvbiIsIml0ZXJhYmxlIiwiaXRlcmF0b3JNZXRob2QiLCJkaXNwbGF5TmFtZSIsImlzR2VuZXJhdG9yRnVuY3Rpb24iLCJnZW5GdW4iLCJjdG9yIiwibmFtZSIsIm1hcmsiLCJzZXRQcm90b3R5cGVPZiIsIl9fcHJvdG9fXyIsImF3cmFwIiwiaXRlciIsInZhbCIsIm9iamVjdCIsInJldmVyc2UiLCJwb3AiLCJza2lwVGVtcFJlc2V0IiwicHJldiIsImNoYXJBdCIsInN0b3AiLCJyb290UmVjb3JkIiwicnZhbCIsImV4Y2VwdGlvbiIsImhhbmRsZSIsImxvYyIsImNhdWdodCIsImhhc0NhdGNoIiwiaGFzRmluYWxseSIsImZpbmFsbHlFbnRyeSIsImNvbXBsZXRlIiwiZmluaXNoIiwidGhyb3duIiwiZGVsZWdhdGVZaWVsZCIsInJlZ2VuZXJhdG9yUnVudGltZSIsImFjY2lkZW50YWxTdHJpY3RNb2RlIiwiZ2xvYmFsVGhpcyIsIkZ1bmN0aW9uIiwiX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fIiwiX193ZWJwYWNrX3JlcXVpcmVfXyIsIm1vZHVsZUlkIiwiY2FjaGVkTW9kdWxlIiwiX193ZWJwYWNrX21vZHVsZXNfXyIsIm4iLCJnZXR0ZXIiLCJfX2VzTW9kdWxlIiwiZCIsImEiLCJkZWZpbml0aW9uIiwibyIsInByb3AiXSwic291cmNlUm9vdCI6IiJ9 --------------------------------------------------------------------------------