@excalidraw/excalidraw 0.16.0 → 0.16.1-104f64f
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +22 -0
- package/dist/excalidraw-assets/locales/ar-SA-json-db7c644ccbeb85d54a47.js +1 -0
- package/dist/excalidraw-assets/locales/az-AZ-json-08a6de50238dbb21926c.js +1 -0
- package/dist/excalidraw-assets/locales/bg-BG-json-42fb0378311f3ade2627.js +1 -0
- package/dist/excalidraw-assets/locales/bn-BD-json-9ad9e5ae95c4c66297b1.js +1 -0
- package/dist/excalidraw-assets/locales/ca-ES-json-a6b2c18f7e85cfd11599.js +1 -0
- package/dist/excalidraw-assets/locales/cs-CZ-json-ea03835d73f9b921f7c4.js +1 -0
- package/dist/excalidraw-assets/locales/da-DK-json-a94944ac6fa9756d2fac.js +1 -0
- package/dist/excalidraw-assets/locales/de-DE-json-d82053ab52357510811b.js +1 -0
- package/dist/excalidraw-assets/locales/el-GR-json-4cbc2dbda5a5df636ee1.js +1 -0
- package/dist/excalidraw-assets/locales/es-ES-json-7afb66536ee40d852fa2.js +1 -0
- package/dist/excalidraw-assets/locales/eu-ES-json-671a4afcfce7b0a7660b.js +1 -0
- package/dist/excalidraw-assets/locales/fa-IR-json-76b039039b043cc4280c.js +1 -0
- package/dist/excalidraw-assets/locales/fi-FI-json-64c8902f10425e1b2e81.js +1 -0
- package/dist/excalidraw-assets/locales/fr-FR-json-d16a471290ba26a6c66a.js +1 -0
- package/dist/excalidraw-assets/locales/gl-ES-json-d11c7966c3c2f95756e0.js +1 -0
- package/dist/excalidraw-assets/locales/he-IL-json-a7bc2a673875b2e655e1.js +1 -0
- package/dist/excalidraw-assets/locales/hi-IN-json-2874e177a309dd1be266.js +1 -0
- package/dist/excalidraw-assets/locales/hu-HU-json-0419027d32efac73d518.js +1 -0
- package/dist/excalidraw-assets/locales/id-ID-json-6542dd92ab54a2c1c48e.js +1 -0
- package/dist/excalidraw-assets/locales/it-IT-json-ab410570df07304cb0ca.js +1 -0
- package/dist/excalidraw-assets/locales/ja-JP-json-2cb067da0fb518e73564.js +1 -0
- package/dist/excalidraw-assets/locales/kaa-json-4d0a4868835d0334a549.js +1 -0
- package/dist/excalidraw-assets/locales/kab-KAB-json-0d400ba2836cc0752cd6.js +1 -0
- package/dist/excalidraw-assets/locales/kk-KZ-json-449979109ab2d8d6b4b2.js +1 -0
- package/dist/excalidraw-assets/locales/km-KH-json-cbe8e2e8d26d30a3175c.js +1 -0
- package/dist/excalidraw-assets/locales/ko-KR-json-c2387972637d47f15765.js +1 -0
- package/dist/excalidraw-assets/locales/ku-TR-json-bafa8865ed7002bb249e.js +1 -0
- package/dist/excalidraw-assets/locales/lt-LT-json-9b7e91a51b90ee551cad.js +1 -0
- package/dist/excalidraw-assets/locales/lv-LV-json-f7f9363e42ee2e3a7c67.js +1 -0
- package/dist/excalidraw-assets/locales/mr-IN-json-ad1359c30c334d05eee0.js +1 -0
- package/dist/excalidraw-assets/locales/my-MM-json-3ba296b6fcf2a2197a7c.js +1 -0
- package/dist/excalidraw-assets/locales/nb-NO-json-798d785698d467e76fcf.js +1 -0
- package/dist/excalidraw-assets/locales/nl-NL-json-2cf913fe2f491c5d7075.js +1 -0
- package/dist/excalidraw-assets/locales/nn-NO-json-aa607835ad9408789c5f.js +1 -0
- package/dist/excalidraw-assets/locales/oc-FR-json-644a5eaa1311f70cb697.js +1 -0
- package/dist/excalidraw-assets/locales/pa-IN-json-165c5c2760688033b2cc.js +1 -0
- package/dist/excalidraw-assets/locales/pl-PL-json-35c1f168f53af24b657a.js +1 -0
- package/dist/excalidraw-assets/locales/pt-BR-json-370215dc506c58ee3217.js +1 -0
- package/dist/excalidraw-assets/locales/pt-PT-json-6f3d80656622a222b4e2.js +1 -0
- package/dist/excalidraw-assets/locales/ro-RO-json-3c32b962880e225d3416.js +1 -0
- package/dist/excalidraw-assets/locales/ru-RU-json-e1f4ed9d2d074f778304.js +1 -0
- package/dist/excalidraw-assets/locales/si-LK-json-4921d4298abfa256fe6f.js +1 -0
- package/dist/excalidraw-assets/locales/sk-SK-json-27b59d7e026675f929c4.js +1 -0
- package/dist/excalidraw-assets/locales/sl-SI-json-efb839ef0456f5c72e6e.js +1 -0
- package/dist/excalidraw-assets/locales/sv-SE-json-7cc9e929689f69c86e59.js +1 -0
- package/dist/excalidraw-assets/locales/ta-IN-json-2fa1854af68381c61913.js +1 -0
- package/dist/excalidraw-assets/locales/th-TH-json-9a390d3cc7a7a6226b63.js +1 -0
- package/dist/excalidraw-assets/locales/tr-TR-json-fc9b16e9dc2be2660439.js +1 -0
- package/dist/excalidraw-assets/locales/uk-UA-json-12240e0e4d42ecfd0bc7.js +1 -0
- package/dist/excalidraw-assets/locales/vi-VN-json-9c1c2a9fa9d6b5a58223.js +1 -0
- package/dist/excalidraw-assets/locales/zh-CN-json-069c304b5011429be615.js +1 -0
- package/dist/excalidraw-assets/locales/zh-HK-json-d9bf1e4e2d1f8650c680.js +1 -0
- package/dist/excalidraw-assets/locales/zh-TW-json-5a3fa7cacfa83c411d89.js +1 -0
- package/dist/excalidraw-assets-dev/locales/ar-SA-json-f35c4f87e6e2dcf7c20a.js +22 -0
- package/dist/excalidraw-assets-dev/locales/az-AZ-json-5d70eb8bf3f20abc3bac.js +22 -0
- package/dist/excalidraw-assets-dev/locales/bg-BG-json-88cced5fd8a6d8298501.js +22 -0
- package/dist/excalidraw-assets-dev/locales/bn-BD-json-a06588c61947851c8579.js +22 -0
- package/dist/excalidraw-assets-dev/locales/ca-ES-json-9b25933a25836cc0be23.js +22 -0
- package/dist/excalidraw-assets-dev/locales/cs-CZ-json-1d6c97ea271d017058c9.js +22 -0
- package/dist/excalidraw-assets-dev/locales/da-DK-json-34a60c9843cecd71376f.js +22 -0
- package/dist/excalidraw-assets-dev/locales/de-DE-json-d13450595b795867412b.js +22 -0
- package/dist/excalidraw-assets-dev/locales/el-GR-json-c854b199f3ac07d40294.js +22 -0
- package/dist/excalidraw-assets-dev/locales/es-ES-json-6a667bfbf4ff3d0181a7.js +22 -0
- package/dist/excalidraw-assets-dev/locales/eu-ES-json-3ec11367a80491b09056.js +22 -0
- package/dist/excalidraw-assets-dev/locales/fa-IR-json-e459964936177074abe7.js +22 -0
- package/dist/excalidraw-assets-dev/locales/fi-FI-json-f7839bb6f5ad0a3c7e0d.js +22 -0
- package/dist/excalidraw-assets-dev/locales/fr-FR-json-20e8535e2675a6736c81.js +22 -0
- package/dist/excalidraw-assets-dev/locales/gl-ES-json-861f534b46c0db1fa8db.js +22 -0
- package/dist/excalidraw-assets-dev/locales/he-IL-json-504d78736487793ffccd.js +22 -0
- package/dist/excalidraw-assets-dev/locales/hi-IN-json-82d988431011c330242a.js +22 -0
- package/dist/excalidraw-assets-dev/locales/hu-HU-json-d4150250980011726fd9.js +22 -0
- package/dist/excalidraw-assets-dev/locales/id-ID-json-82e300d4fe1e87adba9b.js +22 -0
- package/dist/excalidraw-assets-dev/locales/it-IT-json-6ecc9aec005faab90f41.js +22 -0
- package/dist/excalidraw-assets-dev/locales/ja-JP-json-3c6a065f0f1303b297fa.js +22 -0
- package/dist/excalidraw-assets-dev/locales/kaa-json-983a9ccc652aa01980f3.js +22 -0
- package/dist/excalidraw-assets-dev/locales/kab-KAB-json-cac3cf66f1db5c1a6e19.js +22 -0
- package/dist/excalidraw-assets-dev/locales/kk-KZ-json-e9dd81c22419efd44478.js +22 -0
- package/dist/excalidraw-assets-dev/locales/km-KH-json-be77acee611d96d88dda.js +22 -0
- package/dist/excalidraw-assets-dev/locales/ko-KR-json-ad8e9d31d52b26f3fbc2.js +22 -0
- package/dist/excalidraw-assets-dev/locales/ku-TR-json-ed67af91ae1920f114a8.js +22 -0
- package/dist/excalidraw-assets-dev/locales/lt-LT-json-2c3d35d6fb5dbf95a27e.js +22 -0
- package/dist/excalidraw-assets-dev/locales/lv-LV-json-fa8973c231afb2ddafe9.js +22 -0
- package/dist/excalidraw-assets-dev/locales/mr-IN-json-2949146743072eb11b40.js +22 -0
- package/dist/excalidraw-assets-dev/locales/my-MM-json-4c04ffe415641f69ed75.js +22 -0
- package/dist/excalidraw-assets-dev/locales/nb-NO-json-b8d7a5b70562dacdad45.js +22 -0
- package/dist/excalidraw-assets-dev/locales/nl-NL-json-a65f82a25fe038c45d35.js +22 -0
- package/dist/excalidraw-assets-dev/locales/nn-NO-json-858fbccbc5be386977db.js +22 -0
- package/dist/excalidraw-assets-dev/locales/oc-FR-json-a68ea08272c8da3c0e3f.js +22 -0
- package/dist/excalidraw-assets-dev/locales/pa-IN-json-90a2b3775bd7d8983def.js +22 -0
- package/dist/excalidraw-assets-dev/locales/pl-PL-json-9bb55330d5aaf336646e.js +22 -0
- package/dist/excalidraw-assets-dev/locales/pt-BR-json-3635e753c1b6e5b681fa.js +22 -0
- package/dist/excalidraw-assets-dev/locales/pt-PT-json-0d3694a92e0134549086.js +22 -0
- package/dist/excalidraw-assets-dev/locales/ro-RO-json-e83fda16c860c6d0b383.js +22 -0
- package/dist/excalidraw-assets-dev/locales/ru-RU-json-ddc13261ce5d864d36a9.js +22 -0
- package/dist/excalidraw-assets-dev/locales/si-LK-json-16eb66dbfc6c55fc85b1.js +22 -0
- package/dist/excalidraw-assets-dev/locales/sk-SK-json-782ead8707f2ad0e8e4e.js +22 -0
- package/dist/excalidraw-assets-dev/locales/sl-SI-json-82e55cf7cdbdc7d7f959.js +22 -0
- package/dist/excalidraw-assets-dev/locales/sv-SE-json-2f362899d3ac4089534f.js +22 -0
- package/dist/excalidraw-assets-dev/locales/ta-IN-json-07623a485202da63a84b.js +22 -0
- package/dist/excalidraw-assets-dev/locales/th-TH-json-4e4b97f5f6e905191383.js +22 -0
- package/dist/excalidraw-assets-dev/locales/tr-TR-json-003be1cf6ebf0b787dec.js +22 -0
- package/dist/excalidraw-assets-dev/locales/uk-UA-json-ca6ea1156db2649d3e27.js +22 -0
- package/dist/excalidraw-assets-dev/locales/vi-VN-json-9a5e5fab41a1a120a916.js +22 -0
- package/dist/excalidraw-assets-dev/locales/zh-CN-json-670c28a6ae1e3ddecaa4.js +22 -0
- package/dist/excalidraw-assets-dev/locales/zh-HK-json-93b9b676d4f4b5702797.js +22 -0
- package/dist/excalidraw-assets-dev/locales/zh-TW-json-805d10b0eed9ca51b318.js +22 -0
- package/dist/excalidraw-assets-dev/vendor-a14cd58fa2db417e42b2.js +7 -7
- package/dist/excalidraw.development.js +287 -122
- package/dist/excalidraw.production.min.js +1 -1
- package/package.json +2 -2
- package/types/actions/actionAddToLibrary.d.ts +24 -24
- package/types/actions/actionAlign.d.ts +8 -8
- package/types/actions/actionBoundText.d.ts +16 -16
- package/types/actions/actionCanvas.d.ts +112 -112
- package/types/actions/actionClipboard.d.ts +45 -47
- package/types/actions/actionDeleteSelected.d.ts +27 -29
- package/types/actions/actionDistribute.d.ts +4 -4
- package/types/actions/actionDuplicateSelection.d.ts +2 -2
- package/types/actions/actionElementLock.d.ts +18 -18
- package/types/actions/actionExport.d.ts +91 -93
- package/types/actions/actionFinalize.d.ts +18 -18
- package/types/actions/actionFlip.d.ts +4 -4
- package/types/actions/actionFrame.d.ts +26 -26
- package/types/actions/actionGroup.d.ts +20 -20
- package/types/actions/actionLinearEditor.d.ts +8 -8
- package/types/actions/actionMenu.d.ts +26 -26
- package/types/actions/actionProperties.d.ts +110 -110
- package/types/actions/actionSelectAll.d.ts +10 -10
- package/types/actions/actionStyles.d.ts +12 -12
- package/types/actions/actionToggleGridMode.d.ts +10 -10
- package/types/actions/{actionToggleLock.d.ts → actionToggleObjectsSnapMode.d.ts} +48 -30
- package/types/actions/actionToggleStats.d.ts +10 -10
- package/types/actions/actionToggleViewMode.d.ts +10 -10
- package/types/actions/actionToggleZenMode.d.ts +10 -10
- package/types/actions/actionZindex.d.ts +8 -8
- package/types/actions/index.d.ts +1 -0
- package/types/actions/shortcuts.d.ts +1 -1
- package/types/actions/types.d.ts +1 -1
- package/types/appState.d.ts +6 -11
- package/types/clipboard.d.ts +5 -5
- package/types/components/Actions.d.ts +4 -9
- package/types/components/App.d.ts +163 -6
- package/types/components/ColorPicker/ColorInput.d.ts +3 -2
- package/types/components/EyeDropper.d.ts +17 -6
- package/types/components/LaserTool/LaserPathManager.d.ts +28 -0
- package/types/components/LaserTool/LaserPointerButton.d.ts +10 -0
- package/types/components/LaserTool/LaserTool.d.ts +7 -0
- package/types/components/LayerUI.d.ts +2 -5
- package/types/components/MobileMenu.d.ts +1 -5
- package/types/components/Sidebar/Sidebar.d.ts +1 -1
- package/types/components/Stack.d.ts +2 -2
- package/types/components/dropdownMenu/DropdownMenu.d.ts +6 -3
- package/types/components/dropdownMenu/DropdownMenuItem.d.ts +2 -1
- package/types/components/dropdownMenu/DropdownMenuItemCustom.d.ts +2 -1
- package/types/components/dropdownMenu/DropdownMenuItemLink.d.ts +2 -1
- package/types/components/dropdownMenu/common.d.ts +1 -1
- package/types/components/icons.d.ts +2 -0
- package/types/components/main-menu/MainMenu.d.ts +6 -3
- package/types/constants.d.ts +10 -0
- package/types/cursor.d.ts +5 -0
- package/types/data/blob.d.ts +2 -1
- package/types/element/Hyperlink.d.ts +10 -10
- package/types/element/bounds.d.ts +4 -5
- package/types/element/dragElements.d.ts +11 -2
- package/types/element/embeddable.d.ts +8 -8
- package/types/element/linearElementEditor.d.ts +8 -8
- package/types/element/mutateElement.d.ts +1 -1
- package/types/element/resizeElements.d.ts +2 -2
- package/types/emitter.d.ts +20 -0
- package/types/frame.d.ts +5 -0
- package/types/hooks/useStable.d.ts +1 -0
- package/types/keys.d.ts +1 -0
- package/types/math.d.ts +2 -0
- package/types/renderer/renderSnaps.d.ts +2 -0
- package/types/scene/comparisons.d.ts +0 -1
- package/types/scene/index.d.ts +1 -1
- package/types/scene/selection.d.ts +1 -0
- package/types/snapping.d.ts +108 -0
- package/types/types.d.ts +36 -16
- package/types/utils.d.ts +6 -9
- package/dist/excalidraw-assets/locales/ar-SA-json-b9c75e6743e089f51f9b.js +0 -1
- package/dist/excalidraw-assets/locales/az-AZ-json-32268e2c7ad89fce5d2c.js +0 -1
- package/dist/excalidraw-assets/locales/bg-BG-json-ff5ef83d3c2706367417.js +0 -1
- package/dist/excalidraw-assets/locales/bn-BD-json-f9b1344b2f5c0ab53ce8.js +0 -1
- package/dist/excalidraw-assets/locales/ca-ES-json-d4a1f01f8c174c315974.js +0 -1
- package/dist/excalidraw-assets/locales/cs-CZ-json-ff1b9bbfe92356698245.js +0 -1
- package/dist/excalidraw-assets/locales/da-DK-json-ac982a0c1e02b45f9500.js +0 -1
- package/dist/excalidraw-assets/locales/de-DE-json-a3222d8a9ed4864ccedf.js +0 -1
- package/dist/excalidraw-assets/locales/el-GR-json-8cc1609bd088ec4f197a.js +0 -1
- package/dist/excalidraw-assets/locales/es-ES-json-4f3da97feff33cb00e6d.js +0 -1
- package/dist/excalidraw-assets/locales/eu-ES-json-f9efd2bf2555bceb526a.js +0 -1
- package/dist/excalidraw-assets/locales/fa-IR-json-abcad5d329ac9558750e.js +0 -1
- package/dist/excalidraw-assets/locales/fi-FI-json-7250174bb3682c3ee602.js +0 -1
- package/dist/excalidraw-assets/locales/fr-FR-json-f82759a1bc767e0889bd.js +0 -1
- package/dist/excalidraw-assets/locales/gl-ES-json-8408403b5df17158e269.js +0 -1
- package/dist/excalidraw-assets/locales/he-IL-json-2e5cea590dd00f76b42f.js +0 -1
- package/dist/excalidraw-assets/locales/hi-IN-json-3898c9c1216b44476529.js +0 -1
- package/dist/excalidraw-assets/locales/hu-HU-json-1b5028b3a2676b3e7bde.js +0 -1
- package/dist/excalidraw-assets/locales/id-ID-json-43d505d7071a0e359681.js +0 -1
- package/dist/excalidraw-assets/locales/it-IT-json-a1526e95ebe4c2156ffb.js +0 -1
- package/dist/excalidraw-assets/locales/ja-JP-json-b7b0079dca8ece2551c7.js +0 -1
- package/dist/excalidraw-assets/locales/kaa-json-b2f03ae2f239b9fae304.js +0 -1
- package/dist/excalidraw-assets/locales/kab-KAB-json-e8618205ea49417e5fb4.js +0 -1
- package/dist/excalidraw-assets/locales/kk-KZ-json-f648362328b839e9313f.js +0 -1
- package/dist/excalidraw-assets/locales/km-KH-json-920cbd8cb9ea3c2ce631.js +0 -1
- package/dist/excalidraw-assets/locales/ko-KR-json-e5f26d9854a5d68ada0a.js +0 -1
- package/dist/excalidraw-assets/locales/ku-TR-json-374bbbb0b003a490681d.js +0 -1
- package/dist/excalidraw-assets/locales/lt-LT-json-9caac0d3530651221c75.js +0 -1
- package/dist/excalidraw-assets/locales/lv-LV-json-c811870330575e53285c.js +0 -1
- package/dist/excalidraw-assets/locales/mr-IN-json-05294735c64b63223d8e.js +0 -1
- package/dist/excalidraw-assets/locales/my-MM-json-c3cff6d30b1e629f546f.js +0 -1
- package/dist/excalidraw-assets/locales/nb-NO-json-75cfab63ad7c2ff45f19.js +0 -1
- package/dist/excalidraw-assets/locales/nl-NL-json-90ef39ed303967aeb9c2.js +0 -1
- package/dist/excalidraw-assets/locales/nn-NO-json-1a8db0d8c3717d895cc5.js +0 -1
- package/dist/excalidraw-assets/locales/oc-FR-json-925326d13bc187dcd377.js +0 -1
- package/dist/excalidraw-assets/locales/pa-IN-json-d9ee09801ed220840b2b.js +0 -1
- package/dist/excalidraw-assets/locales/pl-PL-json-9a1b0b7262cd86ab734f.js +0 -1
- package/dist/excalidraw-assets/locales/pt-BR-json-62a1095dd13343b61194.js +0 -1
- package/dist/excalidraw-assets/locales/pt-PT-json-cc517eed349ce432b054.js +0 -1
- package/dist/excalidraw-assets/locales/ro-RO-json-162b57c475da796d5a5b.js +0 -1
- package/dist/excalidraw-assets/locales/ru-RU-json-cfc347872e181d1335a7.js +0 -1
- package/dist/excalidraw-assets/locales/si-LK-json-674ece30d49390e45733.js +0 -1
- package/dist/excalidraw-assets/locales/sk-SK-json-8edebc008b63305c87e1.js +0 -1
- package/dist/excalidraw-assets/locales/sl-SI-json-826580e1006547dbbd3b.js +0 -1
- package/dist/excalidraw-assets/locales/sv-SE-json-84a855efd030e37f51ab.js +0 -1
- package/dist/excalidraw-assets/locales/ta-IN-json-f59f50c4b8f2b2fee8ca.js +0 -1
- package/dist/excalidraw-assets/locales/th-TH-json-4cbe42d56e0a6f261769.js +0 -1
- package/dist/excalidraw-assets/locales/tr-TR-json-eb07e9699c26fef02345.js +0 -1
- package/dist/excalidraw-assets/locales/uk-UA-json-a48bb2e866a11d396a35.js +0 -1
- package/dist/excalidraw-assets/locales/vi-VN-json-cbbaff972778abc0e34b.js +0 -1
- package/dist/excalidraw-assets/locales/zh-CN-json-62d636303447fe79db54.js +0 -1
- package/dist/excalidraw-assets/locales/zh-HK-json-19e6814bddb06e0dd6e3.js +0 -1
- package/dist/excalidraw-assets/locales/zh-TW-json-3fcc3dcef74999ea3757.js +0 -1
- package/dist/excalidraw-assets-dev/locales/ar-SA-json-a69e95810fd104088c5c.js +0 -22
- package/dist/excalidraw-assets-dev/locales/az-AZ-json-589b1b62c7020f14c833.js +0 -22
- package/dist/excalidraw-assets-dev/locales/bg-BG-json-79742eced03e74339dfa.js +0 -22
- package/dist/excalidraw-assets-dev/locales/bn-BD-json-737c1b739f303a032d89.js +0 -22
- package/dist/excalidraw-assets-dev/locales/ca-ES-json-5f515dea6151baaa2eaa.js +0 -22
- package/dist/excalidraw-assets-dev/locales/cs-CZ-json-124bc5ab8060f0c7e965.js +0 -22
- package/dist/excalidraw-assets-dev/locales/da-DK-json-d099915b14b07f999456.js +0 -22
- package/dist/excalidraw-assets-dev/locales/de-DE-json-d8d9ee97794526088903.js +0 -22
- package/dist/excalidraw-assets-dev/locales/el-GR-json-8562deea2ef40d73cf8a.js +0 -22
- package/dist/excalidraw-assets-dev/locales/es-ES-json-da3d630806693d7dac08.js +0 -22
- package/dist/excalidraw-assets-dev/locales/eu-ES-json-ea32646b47bf29438fb9.js +0 -22
- package/dist/excalidraw-assets-dev/locales/fa-IR-json-e8d73ea1c5bdccca7b27.js +0 -22
- package/dist/excalidraw-assets-dev/locales/fi-FI-json-1d2a667fad3ea0ced0ef.js +0 -22
- package/dist/excalidraw-assets-dev/locales/fr-FR-json-ef3b02eac347cee42eac.js +0 -22
- package/dist/excalidraw-assets-dev/locales/gl-ES-json-3c8bbe9429fc52e410b2.js +0 -22
- package/dist/excalidraw-assets-dev/locales/he-IL-json-4a05a09da3b8c37144d5.js +0 -22
- package/dist/excalidraw-assets-dev/locales/hi-IN-json-0300ce94e80ea89134af.js +0 -22
- package/dist/excalidraw-assets-dev/locales/hu-HU-json-331ac1b31c82505ea6cc.js +0 -22
- package/dist/excalidraw-assets-dev/locales/id-ID-json-f8ba56a28586e4e77070.js +0 -22
- package/dist/excalidraw-assets-dev/locales/it-IT-json-0d8f11dec1a87e9359c8.js +0 -22
- package/dist/excalidraw-assets-dev/locales/ja-JP-json-ceaa3287f265ae241112.js +0 -22
- package/dist/excalidraw-assets-dev/locales/kaa-json-4efd2d14964af8a534cb.js +0 -22
- package/dist/excalidraw-assets-dev/locales/kab-KAB-json-3e7e196cc06505d82d71.js +0 -22
- package/dist/excalidraw-assets-dev/locales/kk-KZ-json-96ab3e149666871ce872.js +0 -22
- package/dist/excalidraw-assets-dev/locales/km-KH-json-5e3f43be16a6ec0eb24f.js +0 -22
- package/dist/excalidraw-assets-dev/locales/ko-KR-json-1f078c7aad070d3bd0e9.js +0 -22
- package/dist/excalidraw-assets-dev/locales/ku-TR-json-fcef5d1f6a04981f2a5e.js +0 -22
- package/dist/excalidraw-assets-dev/locales/lt-LT-json-09bf8afbe684fc98c92a.js +0 -22
- package/dist/excalidraw-assets-dev/locales/lv-LV-json-95d0faca7a20097e219f.js +0 -22
- package/dist/excalidraw-assets-dev/locales/mr-IN-json-3ffe983e37fedc73cd65.js +0 -22
- package/dist/excalidraw-assets-dev/locales/my-MM-json-c88241ade5d8f9bafe5d.js +0 -22
- package/dist/excalidraw-assets-dev/locales/nb-NO-json-b80dd1befb2641b9364c.js +0 -22
- package/dist/excalidraw-assets-dev/locales/nl-NL-json-4f65f25ec5e87503413e.js +0 -22
- package/dist/excalidraw-assets-dev/locales/nn-NO-json-2134d8b06b7e30965748.js +0 -22
- package/dist/excalidraw-assets-dev/locales/oc-FR-json-3e134022a025ff54b6f2.js +0 -22
- package/dist/excalidraw-assets-dev/locales/pa-IN-json-97ad2e2064b71f244820.js +0 -22
- package/dist/excalidraw-assets-dev/locales/pl-PL-json-1ed88814e0018339868e.js +0 -22
- package/dist/excalidraw-assets-dev/locales/pt-BR-json-49f03e588be4c6bbe08c.js +0 -22
- package/dist/excalidraw-assets-dev/locales/pt-PT-json-2929d15eba5953ef7715.js +0 -22
- package/dist/excalidraw-assets-dev/locales/ro-RO-json-785455320326c2640311.js +0 -22
- package/dist/excalidraw-assets-dev/locales/ru-RU-json-8836a70e1fe715aa70c7.js +0 -22
- package/dist/excalidraw-assets-dev/locales/si-LK-json-244722aa29ba7ca8bd7a.js +0 -22
- package/dist/excalidraw-assets-dev/locales/sk-SK-json-97afb0ec22d1503e2af4.js +0 -22
- package/dist/excalidraw-assets-dev/locales/sl-SI-json-e59c2bd944228503e705.js +0 -22
- package/dist/excalidraw-assets-dev/locales/sv-SE-json-8ee6702d94e84e48faa8.js +0 -22
- package/dist/excalidraw-assets-dev/locales/ta-IN-json-3c99dc4ff8af7e2523f3.js +0 -22
- package/dist/excalidraw-assets-dev/locales/th-TH-json-a4b323409d22013c30e2.js +0 -22
- package/dist/excalidraw-assets-dev/locales/tr-TR-json-399c6f39c50e30399d18.js +0 -22
- package/dist/excalidraw-assets-dev/locales/uk-UA-json-8657d9ac1c78af847957.js +0 -22
- package/dist/excalidraw-assets-dev/locales/vi-VN-json-e81217b667a314e4b841.js +0 -22
- package/dist/excalidraw-assets-dev/locales/zh-CN-json-8a2394a4129f40872d71.js +0 -22
- package/dist/excalidraw-assets-dev/locales/zh-HK-json-2f278ce98daca1c37501.js +0 -22
- package/dist/excalidraw-assets-dev/locales/zh-TW-json-e4eb1416e4564d3a1fd9.js +0 -22
- package/types/bug-issue-template.d.ts +0 -2
- package/types/components/ActiveFile.d.ts +0 -7
- package/types/components/ClearCanvas.d.ts +0 -4
- package/types/components/CollabButton.d.ts +0 -7
- package/types/components/ColorPicker.d.ts +0 -14
- package/types/components/LibraryButton.d.ts +0 -8
- package/types/components/MenuItem.d.ts +0 -11
- package/types/components/MenuUtils.d.ts +0 -2
- package/types/components/MermaidToExcalidraw.d.ts +0 -8
- package/types/components/SingleLibraryItem.d.ts +0 -10
- package/types/components/TopErrorBoundary.d.ts +0 -15
- package/types/components/WelcomeScreen.d.ts +0 -8
- package/types/components/WelcomeScreenDecor.d.ts +0 -6
- package/types/components/context/tunnels.d.ts +0 -16
- package/types/components/dropdownMenu/DropdownMenuSub.d.ts +0 -33
- package/types/components/dropdownMenu/DropdownMenuSubContent.d.ts +0 -8
- package/types/components/dropdownMenu/DropdownMenuSubItem.d.ts +0 -12
- package/types/components/dropdownMenu/DropdownMenuSubTrigger.d.ts +0 -10
- package/types/components/hoc/withUpstreamOverride.d.ts +0 -10
- package/types/components/mainMenu/DefaultItems.d.ts +0 -44
- package/types/components/mainMenu/MainMenu.d.ts +0 -44
- package/types/excalidraw-app/CustomStats.d.ts +0 -9
- package/types/excalidraw-app/app_constants.d.ts +0 -32
- package/types/excalidraw-app/collab/Collab.d.ts +0 -163
- package/types/excalidraw-app/collab/Portal.d.ts +0 -28
- package/types/excalidraw-app/collab/RoomDialog.d.ts +0 -13
- package/types/excalidraw-app/collab/reconciliation.d.ts +0 -10
- package/types/excalidraw-app/components/EncryptedIcon.d.ts +0 -1
- package/types/excalidraw-app/components/ExcalidrawPlusAppLink.d.ts +0 -1
- package/types/excalidraw-app/components/ExportToExcalidrawPlus.d.ts +0 -9
- package/types/excalidraw-app/components/LanguageList.d.ts +0 -4
- package/types/excalidraw-app/components/icons.d.ts +0 -1
- package/types/excalidraw-app/data/FileManager.d.ts +0 -66
- package/types/excalidraw-app/data/LocalData.d.ts +0 -32
- package/types/excalidraw-app/data/Locker.d.ts +0 -8
- package/types/excalidraw-app/data/firebase.d.ts +0 -25
- package/types/excalidraw-app/data/index.d.ts +0 -183
- package/types/excalidraw-app/data/localStorage.d.ts +0 -109
- package/types/excalidraw-app/data/tabSync.d.ts +0 -9
- package/types/excalidraw-app/index.d.ts +0 -26
- package/types/packages/excalidraw/dist/excalidraw-assets/4946-34a258033fc93182d93c.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/5123-4e35c29ac5437254d305.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/5123-daebd9b6b87e1bbe78f4.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/5248-d356fa1109e1dbcc3dcc.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/5248-f8f0ebb2164542e9022c.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/5349-3a48a0033517d8decee0.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/5349-ebf41289e749ef013603.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/5526-fd1695851005cc52a2e9.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/582-27eb83dbb30ec4ce8690.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/5891-0e64b1825f1881d915fe.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/5891-7451b2baef69037183a4.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/5891-d9f1805bab3295e4fa0f.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/6185-202fa6b37d1f5eb9bb86.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/6185-425cfc549fa5a585c209.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/6708-16821f489c8851acc5af.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/6787-fdae1cf01637e3590c46.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/6956-1e3ae1b5da724446de5b.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/6956-402dbe89c709049b8db9.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/6956-cbc6925f843f966d36ce.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/7000-51ba5b1dafa77754e79d.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/7000-87e6892703f1bb896675.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/7000-efb2d6821af4b5095e6c.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/722-42a3ef6a85c94be1583b.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/722-8aaaa7eaf9fa51947f24.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/724-8ceb13efcbe37ed57670.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/7464-0aed66befef89a37da85.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/7464-379c4ae241963795b61b.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/7581-208a591609e15b99a63a.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/7693-513241204c51311b320c.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/7693-97b7759f80ce5d113298.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/787-be9c869e7d7271841498.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/797-ab7845cca84cb7bff6f5.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/809-92fa1800a841eadac4b9.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/8164-a74eaee76495e40c7a07.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/832-02dea61ec29eaf266a2f.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/8455-081e09145375ef09ed0b.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/8455-12b0b57f9a9eedb8e2d1.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/8494-388800034d846ba48e92.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/8787-5393f3338cbe90c7b46c.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/8787-647baa009bc2d705d45e.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/8832-893ebf883cfc11063d32.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/8832-f6f14a3bda1806f7bd6e.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/8832-f7525b08a6e288020b0d.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/891-9f297e64494feaebfc3f.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/895-5d086be2f88a610bac3b.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/895-ba0eff504ebb071cc11a.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/927-5310cd2df4ad33af183e.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/927-f5a50f091a6379ad54f2.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/9445-278b87ff5a1590d3da09.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/946-0c23ccd05f4aa7242283.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/956-48e31d2d4c8fc184b88a.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/9577-09dbe7a2f393366867e4.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/9582-619140c5d47bcd586310.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/9582-71a10d7a16e75a0a18f3.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/bug-issue-template-7628a1d844446e5ca713.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ar-SA-json-06d4bd2f3a164162f2b8.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ar-SA-json-1bb6302a93fa38d23d93.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ar-SA-json-20b8359339093c0d55e4.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ar-SA-json-6c06adbd0d9d02eac2b2.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ar-SA-json-7880ce61551376011ec8.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ar-SA-json-7917b25a9d62d616fcc5.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ar-SA-json-b9c75e6743e089f51f9b.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ar-SA-json-ebd2fb41664a101f0c07.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/az-AZ-json-189f5418fd6ecc4b80e7.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/az-AZ-json-32268e2c7ad89fce5d2c.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/az-AZ-json-95ab85135314fce51ccc.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/bg-BG-json-04c32894a53ff1b841f2.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/bg-BG-json-0d8dbcb99870971021ee.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/bg-BG-json-143258eabf8ef7ec5e77.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/bg-BG-json-44988db4fe7f7bee07bc.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/bg-BG-json-53f3c1f9f00040cafd2c.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/bg-BG-json-72ac7b7548d7fefdcd2a.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/bg-BG-json-a1facb11dbb377c90536.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/bg-BG-json-ff5ef83d3c2706367417.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/bn-BD-json-634967cdb3ba0649af4d.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/bn-BD-json-759924ef13bd9e602cb3.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/bn-BD-json-7ff651d150881fbbfb13.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/bn-BD-json-87b3aebd833413ec69fb.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/bn-BD-json-c8a37406c9152cd7acf4.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/bn-BD-json-e2b7f233baf2dcd84360.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/bn-BD-json-f7ee4adf1477b5385c0b.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/bn-BD-json-f9b1344b2f5c0ab53ce8.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ca-ES-json-2526e4d277313d9fa2ba.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ca-ES-json-319bfc63af7c5cf7ec18.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ca-ES-json-4d5527dd80e208ef2522.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ca-ES-json-55c9b183f935a5d11aca.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ca-ES-json-6108f4ae0be3d1e369a6.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ca-ES-json-7cd4f86fb6ea67ac9b66.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ca-ES-json-d4a1f01f8c174c315974.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ca-ES-json-d5ae178e89b6c667f9a0.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/cs-CZ-json-03e03422bf616825e4de.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/cs-CZ-json-1ae99f296c9febb99f72.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/cs-CZ-json-3ff3ea69ff9ae725c469.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/cs-CZ-json-63e64aea4eee696f6560.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/cs-CZ-json-6d90332bcb443eb42802.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/cs-CZ-json-806bf1bb13213e333674.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/cs-CZ-json-9eb9864732272e7dd3e5.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/cs-CZ-json-ff1b9bbfe92356698245.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/da-DK-json-3537795fe77f731fa73b.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/da-DK-json-4f8e7ffffcfe77676372.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/da-DK-json-52be03e18f1bc98be9c8.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/da-DK-json-aa428b72489c68d3eafe.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/da-DK-json-ac982a0c1e02b45f9500.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/da-DK-json-d3633cf24300764ec674.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/da-DK-json-d6ab0523c9f9ac4d4c9e.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/da-DK-json-ed85a6f48e1df51b1b46.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/de-DE-json-1335b7dc7abe28365271.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/de-DE-json-1e0ab10e858bdd7cd5c7.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/de-DE-json-9ee7f888aa463032fc1c.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/de-DE-json-a3222d8a9ed4864ccedf.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/de-DE-json-d3be08a6c1c77da3217b.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/de-DE-json-f02ac029c64432725793.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/de-DE-json-f70dfb7201a16dc3f9fc.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/el-GR-json-041566c45d784db853b3.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/el-GR-json-1e030118d23307b7ca92.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/el-GR-json-72b6ce23553a9c8e270b.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/el-GR-json-79f7d66730b39df84f8e.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/el-GR-json-7c44f217b4928b0b59c4.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/el-GR-json-8cc1609bd088ec4f197a.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/el-GR-json-908e098345bfe344ced8.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/el-GR-json-dbefbe1435eb60114eb6.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/es-ES-json-124029c5c7386ccbce1c.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/es-ES-json-47d0ae898ef2c67ce309.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/es-ES-json-48638f55b72a2e52aabe.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/es-ES-json-4f3da97feff33cb00e6d.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/es-ES-json-682b92427b8b27bb0aa8.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/es-ES-json-8791f8a3ec6253466a9b.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/es-ES-json-bce3ffccc2d4f618c802.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/es-ES-json-c1f2257ac1f4cf4ae735.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/es-ES-json-eee803809b86a9619a29.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/es-ES-json-f2467c6a875a9e288756.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/eu-ES-json-1cc77079b354b962615f.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/eu-ES-json-2debb0a180f671e8c417.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/eu-ES-json-31f3b78ca505730777ed.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/eu-ES-json-5533c5bc25f2a8c5f167.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/eu-ES-json-5720590cf9a63067baf3.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/eu-ES-json-94f1d5fdfee449a29705.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/eu-ES-json-f959c593c0f00edff67b.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/eu-ES-json-f9efd2bf2555bceb526a.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/fa-IR-json-10a870520551a183f2d7.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/fa-IR-json-1a48b1b4d36c56bc98b2.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/fa-IR-json-586a1324f942d89620b6.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/fa-IR-json-5a4de9617f16bd36abf9.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/fa-IR-json-6377cea468f09539260f.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/fa-IR-json-901375a61be9b3ebce1d.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/fa-IR-json-97bb57d1147c72892c68.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/fa-IR-json-abcad5d329ac9558750e.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/fi-FI-json-192a5cc851541797f756.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/fi-FI-json-5f4fce8f7a54b9660c99.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/fi-FI-json-6353e444c17d44bae461.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/fi-FI-json-7250174bb3682c3ee602.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/fi-FI-json-8941c5209ec2fe54175f.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/fi-FI-json-a3f9ff6f42d18d749cea.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/fi-FI-json-b5f1567c3ca0a897e452.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/fi-FI-json-d43636fb51002f55e2a4.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/fr-FR-json-68052da0ebafb9f1909f.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/fr-FR-json-9a524eca06b781609d92.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/fr-FR-json-a7f8d76d690714b6eb78.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/fr-FR-json-b5ea877625968f748b7f.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/fr-FR-json-cb24197bbfb2a4788fde.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/fr-FR-json-f350482e7da034549dbf.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/fr-FR-json-f82759a1bc767e0889bd.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/gl-ES-json-152d0b099ec8f3e92986.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/gl-ES-json-2117445509ba7c479ee0.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/gl-ES-json-24ddd1aea2914489d66b.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/gl-ES-json-8408403b5df17158e269.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/gl-ES-json-bff1413c13a0b907cd6d.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/gl-ES-json-c54966edc31ab5d6917e.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/gl-ES-json-efa2a7afe9e96f9e3f3e.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/gl-ES-json-f2cfc131a1585df53888.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/he-IL-json-0a140148a521e80ef951.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/he-IL-json-2686abc8b155be579d06.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/he-IL-json-2e5cea590dd00f76b42f.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/he-IL-json-3280be0edae615c7685f.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/he-IL-json-3c35f4b2962e3609017e.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/he-IL-json-990bb8880202c20c3785.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/he-IL-json-b892c5cb5828ae59d407.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/he-IL-json-bcfe172e6fc193bbf5f1.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/hi-IN-json-33a69bbfe9268d9133d4.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/hi-IN-json-3898c9c1216b44476529.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/hi-IN-json-39b76db3f7abc53a54d2.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/hi-IN-json-532e91c58a2a4d1f1d79.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/hi-IN-json-a86588d386d42bea67ad.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/hi-IN-json-dad8ce15f9b7a435a926.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/hi-IN-json-e22f4ad73126c2971850.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/hi-IN-json-efc9f7ef04774f58cbad.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/hi-IN-json-fa6d3964054b114046c0.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/hu-HU-json-1b5028b3a2676b3e7bde.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/hu-HU-json-3b647d54caa9cd086abc.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/hu-HU-json-3e1fd56fcc0d67127a79.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/hu-HU-json-545e1923f5ad1c94c6ab.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/hu-HU-json-636059732ee89c1c92d7.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/hu-HU-json-6ccf0d8a164ecec52187.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/hu-HU-json-9eced03fca421da9dc33.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/hu-HU-json-ec488d80d0a50ac94743.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/id-ID-json-0e69caf5d919807ed234.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/id-ID-json-41353abc8704e1038943.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/id-ID-json-43d505d7071a0e359681.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/id-ID-json-6031eb8be253b20c28e9.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/id-ID-json-7aae0423987e3f6e37c9.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/id-ID-json-7b86bce77d4d5a362f05.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/id-ID-json-7d938493c5aa6afef186.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/id-ID-json-b2365a8dfc32c19a9827.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/id-ID-json-b724e9ec875dd8ffee62.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/it-IT-json-446b14f993000d0f572f.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/it-IT-json-4e385faed32727fe36ce.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/it-IT-json-781eb695d0817b01d76f.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/it-IT-json-9423dbb2f3510f7a9e78.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/it-IT-json-9ecc203d696bd8ab1e5c.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/it-IT-json-a1526e95ebe4c2156ffb.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/it-IT-json-a909a4d4bb19af207fff.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/it-IT-json-b14da0116f6f5e0712e9.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ja-JP-json-323f591c38869b307b87.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ja-JP-json-3ca539ebaf199164dd7f.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ja-JP-json-5ad34302e890d7e34a47.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ja-JP-json-9e961616beed862eac56.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ja-JP-json-b7b0079dca8ece2551c7.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ja-JP-json-ed349748677b7b9c99eb.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ja-JP-json-ef6ec5abb0c3c53c7a51.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ja-JP-json-fe7beb29f046cf979c5a.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/kaa-json-9f53b94f867da184baea.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/kaa-json-ac1f4f50b9d889b7b8c6.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/kaa-json-b2f03ae2f239b9fae304.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/kab-KAB-json-17519996c12e47f5fded.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/kab-KAB-json-2d1204c965bc93f5754b.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/kab-KAB-json-4cd28c882b4db23990d8.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/kab-KAB-json-69853849c71eff277ba0.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/kab-KAB-json-7941c7649f7cf319f9fa.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/kab-KAB-json-8a859cf6ef556b4cb21a.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/kab-KAB-json-cfa9b0d85d8026ba7d23.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/kab-KAB-json-e8618205ea49417e5fb4.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/kk-KZ-json-0d11cd6204ccf3fe525f.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/kk-KZ-json-106d2a41c68f69765668.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/kk-KZ-json-1f9df2b51e34996bad30.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/kk-KZ-json-31eb6ba41a19136eff88.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/kk-KZ-json-34a913b2b552691de36c.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/kk-KZ-json-54b696e36d8ecb99f663.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/kk-KZ-json-99a76a48916e784a3941.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/kk-KZ-json-f648362328b839e9313f.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/kk-KZ-json-f89d72504164df84c087.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/km-KH-json-2ad4c79b6584160ff2b2.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/km-KH-json-7f445f80e19ca90e9998.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/km-KH-json-920cbd8cb9ea3c2ce631.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ko-KR-json-04089ce24a73ee1c83f0.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ko-KR-json-15bb3deafeb6d9994aa2.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ko-KR-json-34efab5d47b95406706a.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ko-KR-json-3d69fbb43c407fca47d3.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ko-KR-json-6ee79cc1ac4f34e85f50.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ko-KR-json-9a0b6ecc5be0f4e98fee.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ko-KR-json-cf33ecf52ab95055544b.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ko-KR-json-e5f26d9854a5d68ada0a.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ku-TR-json-04cd173683d79bb264e7.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ku-TR-json-05e1c3849ef5154e3157.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ku-TR-json-186e282f3181862b9e7a.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ku-TR-json-2608a20f805341b51a6e.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ku-TR-json-374bbbb0b003a490681d.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ku-TR-json-6077b8b65644d4b19461.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ku-TR-json-7f8c5abdd3f7ea7fc945.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ku-TR-json-d10a4bb9ede3c08a08e1.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/lt-LT-json-07a117096cba0d54446a.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/lt-LT-json-08c7fc343ef2f533ec5f.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/lt-LT-json-0d6150d8b3d418652fe9.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/lt-LT-json-3b6f507ea5233727b386.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/lt-LT-json-9caac0d3530651221c75.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/lt-LT-json-a258da44916407cf694a.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/lt-LT-json-b7e9188e36f165b5bb4a.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/lt-LT-json-f0baeb52b74ec4e2b65e.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/lv-LV-json-1e3a5e87e39d2d90274c.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/lv-LV-json-24ab5a572ca1e9899a88.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/lv-LV-json-5ff95e7961229ff568fb.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/lv-LV-json-6ff0f96956a0ab6a1af7.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/lv-LV-json-7dbbb288da81c4987475.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/lv-LV-json-c31a44bb3a66bf7e2106.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/lv-LV-json-c811870330575e53285c.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/mr-IN-json-018610e3231f3e9bd068.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/mr-IN-json-05294735c64b63223d8e.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/mr-IN-json-069b53ee4b91eda493ce.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/mr-IN-json-25f7150363e7c782986e.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/mr-IN-json-a7a04f967d1b0df28700.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/mr-IN-json-c4ed686e0b29f45551ae.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/mr-IN-json-c922a007bb00d3e4f3b1.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/mr-IN-json-d72d88dfcb51c3668e5b.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/my-MM-json-1a05d5c242c822079dca.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/my-MM-json-354b418b74398f6efb2b.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/my-MM-json-42e19993d78f0511571b.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/my-MM-json-694823d3bc2b0943a916.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/my-MM-json-7a5e168f3c205e6dc827.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/my-MM-json-ae5520774cf5063c0d6c.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/my-MM-json-c3cff6d30b1e629f546f.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/my-MM-json-e35accf714a96ecbf476.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/nb-NO-json-4424f16783be9dc1b68c.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/nb-NO-json-4f1808f3507956e1afe9.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/nb-NO-json-4f22057d9bc9df25cb6a.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/nb-NO-json-75cfab63ad7c2ff45f19.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/nb-NO-json-769cc81d00c75b0f6585.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/nb-NO-json-7ea7ab2356e76889af8d.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/nb-NO-json-bf819e799f3bcbcd0f6b.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/nb-NO-json-df3df0be06e3f1bf4b06.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/nl-NL-json-01fa3b9dd189861e48db.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/nl-NL-json-4b701336a4c5c331d25a.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/nl-NL-json-4f8122fee38767f89bd3.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/nl-NL-json-57a2b32c58feb9bae878.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/nl-NL-json-5805f36f33a3f8e53adc.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/nl-NL-json-85d5f44469db5c5e6124.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/nl-NL-json-90ef39ed303967aeb9c2.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/nl-NL-json-e2408c0b590b8987e423.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/nn-NO-json-1a8db0d8c3717d895cc5.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/nn-NO-json-5e0a10f6fe31c9155bd4.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/nn-NO-json-67ff40e2c3eb08ee2368.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/nn-NO-json-72c1151e278eaa3007da.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/nn-NO-json-8209f0f674435b52293d.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/nn-NO-json-c8fc60cb596ea118bcee.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/nn-NO-json-d566f1edbd6be33a70b3.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/oc-FR-json-1d888554c45e5174ede4.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/oc-FR-json-24548a7feecb4c99eaa3.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/oc-FR-json-5774a39c1b0c4c676b1d.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/oc-FR-json-78fba0f25867078ee02f.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/oc-FR-json-925326d13bc187dcd377.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/oc-FR-json-9f77cc0039994979994c.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/oc-FR-json-e90ca79174b6e1eccb72.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/oc-FR-json-ff98e2029afacd5a71e7.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/pa-IN-json-08abbf2590eb9e585c48.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/pa-IN-json-0ef170e4e8fc90c8b8c0.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/pa-IN-json-0fd029451b07248c5194.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/pa-IN-json-1854ecccf3c6f8ea9c46.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/pa-IN-json-448f5d174c6ac1f9eae2.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/pa-IN-json-4727608e172fc670161c.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/pa-IN-json-9ec2bd766af522488b44.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/pa-IN-json-9ffe63db0e1a6b0274f7.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/pa-IN-json-cb5408e8f1874709aa5c.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/pa-IN-json-d4f592694e6f6af11450.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/pa-IN-json-d9ee09801ed220840b2b.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/pl-PL-json-474c6d4804d20d89d2dc.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/pl-PL-json-5180dc575281ed9d5e15.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/pl-PL-json-67fbdbdf0ab730d0d9eb.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/pl-PL-json-8d41ca8cad23ad48c767.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/pl-PL-json-9a1b0b7262cd86ab734f.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/pl-PL-json-a8ddc96c59a92fca9d77.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/pl-PL-json-b4be83b26070e4cf70ca.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/pl-PL-json-eec56b7a089b7cb68635.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/pt-BR-json-1317f88b4d299ad9a2ce.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/pt-BR-json-1e850bd4508a5abf6aec.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/pt-BR-json-2b79e2f8dfc749f13152.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/pt-BR-json-2e7a1690edc8d46e8842.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/pt-BR-json-62a1095dd13343b61194.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/pt-BR-json-702df09b285f0ea66503.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/pt-BR-json-80997877c2c88f481632.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/pt-BR-json-94fa57d1ac7d244fde4e.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/pt-PT-json-0d63b7c4b4188b9378b8.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/pt-PT-json-2ab96d5143b947c7245c.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/pt-PT-json-37c5101916c53869cd8c.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/pt-PT-json-5235c5f4796f2fab31ae.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/pt-PT-json-54e547cc2cd8b0700305.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/pt-PT-json-6d8fb5092f873fdd74be.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/pt-PT-json-aba1622a80e32e465a3d.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/pt-PT-json-cc517eed349ce432b054.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ro-RO-json-162b57c475da796d5a5b.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ro-RO-json-3397acad1a98b5093c8b.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ro-RO-json-4740dfa2ef1d58f191dc.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ro-RO-json-6f6fbe0dacd28213189e.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ro-RO-json-7e65c3ca40525a2b7f5e.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ro-RO-json-97f37a829dc90dfcc450.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ro-RO-json-bdd13022520b63c2e758.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ro-RO-json-d7e41ef2638d95584d14.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ru-RU-json-1ac97d5e23a89ebff869.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ru-RU-json-8ab49e8d0473e92a8ab9.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ru-RU-json-96975eab7a07d2d6b772.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ru-RU-json-c7b2021bbfe94a4c3b92.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ru-RU-json-cf20180d869889c9e654.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ru-RU-json-cfc347872e181d1335a7.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ru-RU-json-d465d5f2e2ab8e7d3e1d.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ru-RU-json-f3368da59c45bb4ea83d.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/si-LK-json-0e496395bea7aa09c12e.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/si-LK-json-1444e979b8c965d31530.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/si-LK-json-5b0bbe1d22e2d6e37d35.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/si-LK-json-674ece30d49390e45733.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/si-LK-json-8fd0cfbf2c34c1a666d7.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/si-LK-json-99d0a5a652dbc68ed47d.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/si-LK-json-db1222db995d9425e281.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/si-LK-json-e13dc6084f655194af4f.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/sk-SK-json-02cfad34246f8cfedd42.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/sk-SK-json-05a75d43e4bffa53061d.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/sk-SK-json-39a1277ee816fa9d9661.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/sk-SK-json-50dcb09552f93c2de3a4.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/sk-SK-json-8edebc008b63305c87e1.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/sk-SK-json-cd3468557b0bce2c8793.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/sk-SK-json-f6694f00a14601aafbc9.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/sl-SI-json-239877b5b4b9450f4ff8.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/sl-SI-json-68eba9ac00ae57bae3f4.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/sl-SI-json-7fff7355941d29976813.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/sl-SI-json-826580e1006547dbbd3b.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/sl-SI-json-956739803bca409172cb.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/sl-SI-json-96a6aef1538281cc4243.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/sl-SI-json-a0dbeb91d8ddbfac8ac1.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/sl-SI-json-c8c152fc0e647c41b0b9.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/sv-SE-json-036a58ce76df0ef486f1.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/sv-SE-json-0f63ca33e643f47b01fc.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/sv-SE-json-209bf1d6aa674d6550df.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/sv-SE-json-36b97455521e61312a47.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/sv-SE-json-84a855efd030e37f51ab.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/sv-SE-json-8930dabe22b7aabb2293.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/sv-SE-json-bdf45471677387a015b6.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/sv-SE-json-dbe06cf14132b3898415.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/sv-SE-json-efd822b4ee2770a3b369.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ta-IN-json-4063d11b19f24794564a.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ta-IN-json-42f4d7224c772d6e2bfd.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ta-IN-json-489ab902f9b0c9beda2e.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ta-IN-json-65ab5662735db73d72d6.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ta-IN-json-860e88f005450b4f47b0.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ta-IN-json-e215bca042782bf1aafb.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ta-IN-json-f59f50c4b8f2b2fee8ca.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/ta-IN-json-fb0ad99371cc9d395a4a.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/th-TH-json-3a152569bbebfec7c6c0.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/th-TH-json-4cbe42d56e0a6f261769.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/th-TH-json-779ad701c23e676f3907.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/tr-TR-json-1f83ec99916cff31ea83.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/tr-TR-json-2e9abe9bb4deaf4dd351.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/tr-TR-json-787da8dfc2342305e3a6.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/tr-TR-json-7cb48008ab8645becf37.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/tr-TR-json-9002b1505b0931924d42.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/tr-TR-json-9573840dee2a1381073f.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/tr-TR-json-a0b61deedb90f078aa01.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/tr-TR-json-eb07e9699c26fef02345.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/uk-UA-json-170d7a0da69417b02ba9.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/uk-UA-json-2360947dd1e1db4ee5ad.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/uk-UA-json-31b987b925c003b67518.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/uk-UA-json-4e345c790342b7672248.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/uk-UA-json-a48bb2e866a11d396a35.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/uk-UA-json-b402aaa379cc70152220.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/uk-UA-json-bbfc556c0ea7b939c13a.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/uk-UA-json-e1832968cea3ac1b1f14.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/uk-UA-json-fd59eb3c7073d54a61ff.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/vi-VN-json-111b8f1260701cbdeb96.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/vi-VN-json-238d97c20e7382d8d408.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/vi-VN-json-2d39986eb03760539582.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/vi-VN-json-2f5b95c0011820e16f4b.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/vi-VN-json-74c28cd0708c8a4843e2.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/vi-VN-json-8e07b04b68ca2190a3ba.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/vi-VN-json-bcc95c0e05c13d6f59f3.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/vi-VN-json-cbbaff972778abc0e34b.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/zh-CN-json-00370833a30f1f2920fc.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/zh-CN-json-0ae042d21bb1d8c961da.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/zh-CN-json-0c84694ac9a1000f2eda.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/zh-CN-json-2cb13b38b6615ada3097.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/zh-CN-json-62d636303447fe79db54.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/zh-CN-json-75e3e6cf7a1cb55917ed.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/zh-CN-json-cba518876516337cde09.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/zh-CN-json-ee9966d1cd4ff9e87533.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/zh-HK-json-19e6814bddb06e0dd6e3.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/zh-HK-json-24ae5342eb038f3b0f4a.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/zh-HK-json-3a8d1819016d2ff6a8a5.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/zh-HK-json-3e6c24c64212546390be.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/zh-HK-json-4bcbf71743fda1544a84.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/zh-HK-json-696f940b619ce66fe8d2.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/zh-HK-json-9af6e5a3292b417d9698.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/zh-HK-json-a90c2e97d0115af3affe.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/zh-TW-json-0a3f9065ffa97f4146ce.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/zh-TW-json-1f855b7f18a6b359ad85.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/zh-TW-json-34674e3698d74ccdf98b.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/zh-TW-json-3fcc3dcef74999ea3757.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/zh-TW-json-a4a2e5b4cc51ab083773.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/zh-TW-json-c39caba2da3f001066a8.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/locales/zh-TW-json-c578828a49f1eb06685e.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/mermaid-to-excalidraw-0f090ea67ee25ae13e70.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/mermaid-to-excalidraw-4be5ea7a51077d9ec088.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/mermaid-to-excalidraw-95400fcdf6b7abd1d00f.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/mermaid-to-excalidraw-b3199268ffa9cf39d994.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/mermaid-to-excalidraw-fa6d7ac161ecd73a4ee8.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/socketIoClient-9dfbabed609bb6017f9b.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/vendor-04a7955edccf0af9a10f.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/vendor-1e6c2df4e69cc1956ad5.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/vendor-53d1c69ef585b6dd219b.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/vendor-618c1c3c7155e775e091.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/vendor-7765355a6ad45000a1e6.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/vendor-88ed95c19ded77583148.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/vendor-9d753ee472bb5273f6e2.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/vendor-a026459b6e88c51893c3.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/vendors--c4Diagram-9cddb37f.js-0f692c7467a13ee5da63.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/vendors--cose-base.js-cb166517c85afbecc8bd.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/vendors--cytoscape.umd.js-9eaa7571a3800ca459d6.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/vendors--elk.bundled.js-85ba03a3ac2b98d15a52.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/vendors--erDiagram-f6946109.js-1fd66bdcbae53207831c.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/vendors--flowDiagram-93327f21.js-5fc7845c3ae2e75f9e0d.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/vendors--flowchart-elk-definition-5082a990.js-afb1d44bc87134411202.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/vendors--ganttDiagram-7ce12d6b.js-be11c3f2576eb9d6543f.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/vendors--gitGraphDiagram-1e960c50.js-8671b3bd3aec7ceecf1a.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/vendors--image-blob-reduce.esm.mjs-7824d92868d73a1ba8ff.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/vendors--index.js-0e16ac7492fe50d30542.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/vendors--layout-base.js-6ad47537ba823827c9ac.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/vendors--mindmap-definition-4fc2557c.js-199740119192f9543ff0.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/vendors--pica.js-762a74c125df5c4d735d.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/vendors--pieDiagram-157505fe.js-1894309d42fb4567d6a2.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/vendors--quadrantDiagram-fd70f2d0.js-0ed3cbfdea36fbf245e3.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/vendors--requirementDiagram-19c99588.js-51100eb211fceb65d5cc.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/vendors--sequenceDiagram-5dfd0049.js-cd0a99428974f3efadd4.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/vendors--timeline-definition-5ed366f4.js-0dec0c8d9e6344e84d39.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/vendors-mermaid-to-excalidraw-index.js-3532b766d8809a4e71ad.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/vendors-mermaid-to-excalidraw-locale.js-9150ea0c5e3ddf197bd7.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/vendors-mermaid-to-excalidraw-mermaid-b0ad2de1.js-a59e3b5ee6f4174765e5.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/vendors-mermaid-to-excalidraw-purify.js-2a52b964a69ac2b71ddc.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/vendors-~-styles-aefe6593.js-e2e2b2ccfdca4c668e27.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/vendors-~-styles-fa41df25.js-5026a5a22c331218b047.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/vendors-~~-flowDb-6a57c1b4.js-c05522418ee5acb22267.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/vendors-~~~-index-a92ac404.js-0cfea43f6030cfdcb335.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/vendors-~~~~-edges-49ac43a2.js-fa4d096c4cf2e17c883a.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/el-GR-json-8562deea2ef40d73cf8a.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/el-GR-json-a0d2db555d8eabf2314d.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/el-GR-json-c18382659d1c0307b73b.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/el-GR-json-c5595d65d7aa1fde7a41.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/el-GR-json-cc428d6d24413e24785d.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/es-ES-json-007f93b37e43a42fcf84.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/es-ES-json-93b74ae63ccd847c1735.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/es-ES-json-aacc6f2fd98f0f967c32.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/es-ES-json-ad62d132bdf680947bb1.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/es-ES-json-d28c0a34dd65557c36d1.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/es-ES-json-da3d630806693d7dac08.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/es-ES-json-f300883866a6249a4943.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/eu-ES-json-2ce16fff0331672e3630.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/eu-ES-json-5321ea491e8c1e8e265c.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/eu-ES-json-63e15be6c04e80959411.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/eu-ES-json-a9c30edbcd64040f6d81.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/eu-ES-json-b1d18c7b4bd1d54d5dfd.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/eu-ES-json-e480895dba843bf8cde0.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/eu-ES-json-ea32646b47bf29438fb9.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/fa-IR-json-23a53581031622df43cb.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/fa-IR-json-607ddee328d9a13e688d.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/fa-IR-json-7b9d274d5accc82982e9.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/fa-IR-json-94f0178e594bf4339882.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/fa-IR-json-c94925ee07701ef438a2.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/fa-IR-json-d8736c460ba5f77209bf.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/fa-IR-json-e8d73ea1c5bdccca7b27.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/fi-FI-json-1d2a667fad3ea0ced0ef.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/fi-FI-json-29f534e1e3daf160eb2c.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/fi-FI-json-37fb26a58706b3949bb1.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/fi-FI-json-534ff9afaddfa5e98712.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/fi-FI-json-7de4002b4d7f24054a84.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/fi-FI-json-92708cde694d0f77df88.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/fi-FI-json-b466031cdd8ef6f8c32b.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/fr-FR-json-0d4f6fdfa9be76a941d7.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/fr-FR-json-148222fdde4309b9ffdd.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/fr-FR-json-337cdd5043bb5c6a174c.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/fr-FR-json-4a98afe80b0f71441e85.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/fr-FR-json-c966daa00fcfc0689b74.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/fr-FR-json-ef3b02eac347cee42eac.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/fr-FR-json-fc60b276b98e6bc57ae8.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/gl-ES-json-210eff58e4414a5490e8.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/gl-ES-json-3c8bbe9429fc52e410b2.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/gl-ES-json-4652301a81ddc5cf642e.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/gl-ES-json-46863175bb629a5bb37e.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/gl-ES-json-4e4f84a35e936b9ca6f6.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/gl-ES-json-4e726abf2864318b51f9.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/gl-ES-json-b6d43d24dfabd06e45d5.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/he-IL-json-4a05a09da3b8c37144d5.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/he-IL-json-5f74dda2737436b4482a.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/he-IL-json-86ff7589978ed9654753.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/he-IL-json-8eb84a20c4dca6812a50.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/he-IL-json-9bb31b0b25e5a4e8ebec.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/he-IL-json-a54ad386ceb9b48ccc84.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/he-IL-json-e0bd304682986695208c.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/hi-IN-json-0300ce94e80ea89134af.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/hi-IN-json-0e1dae2ff14e81ba2dd4.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/hi-IN-json-568c16b512f4c2c8dc80.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/hi-IN-json-5ce4fc9ec6678cfd2f6b.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/hi-IN-json-87d2ac812dc34ff143a2.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/hi-IN-json-a46793165036aac854c6.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/hi-IN-json-f836b4aefaa6ea897222.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/hu-HU-json-06c7fd881b6f211775f3.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/hu-HU-json-230434a2a2eb764d410c.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/hu-HU-json-331ac1b31c82505ea6cc.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/hu-HU-json-6127772c863962f7a7c9.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/hu-HU-json-a96298a55c135b42996d.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/hu-HU-json-c84969170aeddccc8e84.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/hu-HU-json-e6a409606cf22a639a75.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/id-ID-json-0850671b76921f20c9b6.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/id-ID-json-699249ec43c0d419134b.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/id-ID-json-81ef59d57194b5eaf5cc.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/id-ID-json-864c1049b7c1d9c4afa6.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/id-ID-json-c163c21859b707d96c6d.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/id-ID-json-cec1d9b72fad17e79219.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/id-ID-json-f8ba56a28586e4e77070.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/it-IT-json-0d8f11dec1a87e9359c8.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/it-IT-json-0e799ccdafb272e65046.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/it-IT-json-2cef8370cf78d9233c2b.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/it-IT-json-3ae9ff054a8832e055d3.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/it-IT-json-5436ec678e0205d56856.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/it-IT-json-d843759aca6069b269dc.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/it-IT-json-f3776c336b416375460b.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/ja-JP-json-044db93261d04ea64e6f.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/ja-JP-json-32f639470c104e80bfa4.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/ja-JP-json-452835b81621e5ae6cb6.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/ja-JP-json-4f64b1c6188e0451fd4b.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/ja-JP-json-56cc5f3aa96171a64a22.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/ja-JP-json-ceaa3287f265ae241112.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/ja-JP-json-ea55175bf36ae67d1486.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/kaa-json-4017d8481aa0b479424a.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/kaa-json-4efd2d14964af8a534cb.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/kab-KAB-json-0571060fae93fb1f4655.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/kab-KAB-json-3e7e196cc06505d82d71.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/kab-KAB-json-3eb03ea3bf8e5247387a.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/kab-KAB-json-61a7d382c88b96fe1f38.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/kab-KAB-json-df2b76743a2c3409b1f5.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/kab-KAB-json-e40e6e3caaf73fb06f29.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/kab-KAB-json-ffe286fa0d0bb4f0c8b0.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/kk-KZ-json-0a85d681d9deb9c440c9.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/kk-KZ-json-0f99b0b0e9aeb250f10d.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/kk-KZ-json-25ada9f88f38cfb84b18.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/kk-KZ-json-2c2022e9751e266daf48.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/kk-KZ-json-4f7020bbbed7cb7c32e5.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/kk-KZ-json-96ab3e149666871ce872.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/kk-KZ-json-b788f0957735d7e6cf09.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/km-KH-json-38d489a3cd78fb378b39.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/km-KH-json-5e3f43be16a6ec0eb24f.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/ko-KR-json-1f078c7aad070d3bd0e9.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/ko-KR-json-3de3dc5cb1dac5b79f94.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/ko-KR-json-8a4074591f36df4d0c58.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/ko-KR-json-c7c136cb71decba363c7.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/ko-KR-json-dab1c947d6d2ca3ddac0.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/ko-KR-json-f99bca5d636386cef1d9.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/ko-KR-json-ff6664051cb7d2f50fb0.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/ku-TR-json-22a3fdac3947f747cd75.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/ku-TR-json-2729f5ab5a5ff6559d01.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/ku-TR-json-36f8d2a4b09be400f869.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/ku-TR-json-7f671260a35125754327.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/ku-TR-json-c342bf0a9985d2953f39.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/ku-TR-json-d9a93bd27cba79b19aee.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/ku-TR-json-fcef5d1f6a04981f2a5e.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/lt-LT-json-0907f29dc7c40b6e344f.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/lt-LT-json-09bf8afbe684fc98c92a.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/lt-LT-json-3a8687d15506be04a010.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/lt-LT-json-535e00475a2d73aa8927.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/lt-LT-json-5b6406e76cf0d826cc16.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/lt-LT-json-6c2e9629a9ba65c0dca7.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/lt-LT-json-7f27a7b2adcd586b55e8.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/lv-LV-json-216a1fe6e16d46a93b33.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/lv-LV-json-57a16241f5e7412fbaa8.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/lv-LV-json-602964f8d302ae46b08b.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/lv-LV-json-6e981883d91c29060dd4.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/lv-LV-json-95d0faca7a20097e219f.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/lv-LV-json-a811474717b56be40608.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/lv-LV-json-ccbb9781322782d02fae.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/mr-IN-json-1bac19e335b1be4d57b1.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/mr-IN-json-3ffe983e37fedc73cd65.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/mr-IN-json-6ad409707531c84de376.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/mr-IN-json-6ba2b497881dcd6a3874.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/mr-IN-json-78bc3cb48615cd48e74a.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/mr-IN-json-d2359502fdbadc31b122.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/mr-IN-json-d8ec700e1e33441c238b.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/my-MM-json-0ee160095e1784b8d62b.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/my-MM-json-574ead3f733f6b07b31e.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/my-MM-json-5c3b77241cc063b2c5b0.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/my-MM-json-64e7f48498773cc79d25.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/my-MM-json-bf5438b8b540213e7b7d.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/my-MM-json-c88241ade5d8f9bafe5d.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/my-MM-json-cb25da0149000113fd3f.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/nb-NO-json-2cf7b76c223968714b89.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/nb-NO-json-354ad83d68de9511218b.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/nb-NO-json-44f164754214bc9c1baa.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/nb-NO-json-6acf941b2b6d5a982730.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/nb-NO-json-b80dd1befb2641b9364c.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/nb-NO-json-bd11ba266e4e2c0fa619.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/nb-NO-json-d7ca016e9141141cf6d2.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/nl-NL-json-04f6aacdcbd509af44a0.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/nl-NL-json-1690236e0232b67cd430.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/nl-NL-json-3ba3e0f154412bbcf188.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/nl-NL-json-4f65f25ec5e87503413e.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/nl-NL-json-7315dae866197d6cc89a.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/nl-NL-json-8e66a88c43a7eeed44f8.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/nl-NL-json-afccd2db9c47f6a66cf5.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/nn-NO-json-0842a8c2527c65806122.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/nn-NO-json-2134d8b06b7e30965748.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/nn-NO-json-608fd6a88621d6d18035.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/nn-NO-json-75b6725e1dfad76dd3d6.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/nn-NO-json-aeb6613de563968f6d62.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/nn-NO-json-cd35c740e50d116d56a0.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/nn-NO-json-cd3bec2e4911f6ca612d.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/oc-FR-json-3e134022a025ff54b6f2.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/oc-FR-json-54e22feb16f23f963b44.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/oc-FR-json-dc16297d69033e71846a.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/oc-FR-json-de0b9a7212e599f039d6.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/oc-FR-json-e0e1a7000404bafe6fd7.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/oc-FR-json-e352ed207a2bc6ff2f9a.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/oc-FR-json-ec9566e0768dfe4b1496.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/pa-IN-json-03bbe592bfa55fe214a9.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/pa-IN-json-29d4806d6fa46f846df7.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/pa-IN-json-2ad0a6609c7ab52d467d.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/pa-IN-json-64ff3aef4c4f2285e7d4.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/pa-IN-json-66af94286f884f29d157.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/pa-IN-json-97ad2e2064b71f244820.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/pa-IN-json-dac3ca0c7dc3107d180d.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/pl-PL-json-1ed88814e0018339868e.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/pl-PL-json-3e483c75de431520dfa3.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/pl-PL-json-4b55b15e99350eeae02f.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/pl-PL-json-54a4380c2eb120f8391a.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/pl-PL-json-5e2c724996753a370f00.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/pl-PL-json-6ce16ec772ca39cb8744.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/pl-PL-json-e9d55427ccc0a3ee2287.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/pt-BR-json-32d105b423af2efd99bc.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/pt-BR-json-3756b9371bfb0744a247.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/pt-BR-json-49f03e588be4c6bbe08c.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/pt-BR-json-7571b67e63f5e151e90a.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/pt-BR-json-7d9b0fb67c76161b2785.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/pt-BR-json-a9f4548703a436582ea1.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/pt-BR-json-b51075fd4a34edc98c62.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/pt-PT-json-2929d15eba5953ef7715.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/pt-PT-json-2df486888ab37d6c0765.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/pt-PT-json-54efec7908df52d47dd5.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/pt-PT-json-722910761860dbd3fb87.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/pt-PT-json-77d5ca078872e12eb25b.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/pt-PT-json-a0efd06ca81979f0a547.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/pt-PT-json-f580e6aa27acd18cf7eb.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/ro-RO-json-259991b384060c398825.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/ro-RO-json-785455320326c2640311.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/ro-RO-json-7d91654ae261bb9d572c.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/ro-RO-json-afba8739d17043e44853.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/ro-RO-json-bddb9c5835477b2cf255.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/ro-RO-json-f62b471f8125751df395.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/ro-RO-json-fe65a70419c866a6ce94.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/ru-RU-json-0b36410a81160861bfbe.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/ru-RU-json-1666880345e0ee1d9198.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/ru-RU-json-2c39ffbb623db8024be0.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/ru-RU-json-51faee1b80ed8a59b81c.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/ru-RU-json-807c094575141684a23c.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/ru-RU-json-8836a70e1fe715aa70c7.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/ru-RU-json-8f00196487b21d4c1ce8.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/si-LK-json-13432a6405a3e78d9a36.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/si-LK-json-244722aa29ba7ca8bd7a.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/si-LK-json-338de2463f06f3a76069.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/si-LK-json-a867646cf3fa3a22cafb.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/si-LK-json-d6a06f63464d79fd36eb.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/si-LK-json-e6e6b1caa13f7abcfacc.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/si-LK-json-ea88723100210c4a4f50.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/sk-SK-json-1335b58f9707aa5275fa.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/sk-SK-json-97afb0ec22d1503e2af4.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/sk-SK-json-b8a13e82d3ccc25365ff.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/sk-SK-json-bb5ffb40cd779a63565f.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/sk-SK-json-dc42543f0ffa26f7e2de.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/sk-SK-json-ead9c71815507529bd9f.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/sk-SK-json-f0dcb9f158c1416791e9.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/sl-SI-json-10c5ba653479b04d3ba8.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/sl-SI-json-3f5b456d22c9a71932f3.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/sl-SI-json-79d34e23c08ceec64254.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/sl-SI-json-7f2b05323ad2e88110b3.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/sl-SI-json-cd56d7fa0376488e5343.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/sl-SI-json-d1036f8f3d1f6b1a70f4.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/sl-SI-json-e59c2bd944228503e705.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/sv-SE-json-053d2c3abda7dcc70df7.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/sv-SE-json-0aec1cdc076c868b1384.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/sv-SE-json-53791d0a923a4de6a2e2.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/sv-SE-json-8a96e0b5538383ba0644.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/sv-SE-json-8ee6702d94e84e48faa8.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/sv-SE-json-99fffeccfd850fe9c2e1.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/sv-SE-json-b16a829e634fedfb3471.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/ta-IN-json-0f92406d511259672140.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/ta-IN-json-30fffc9f1cedf1d559d8.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/ta-IN-json-3c99dc4ff8af7e2523f3.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/ta-IN-json-41c81e1f857b5e0da8e5.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/ta-IN-json-4228f65ccc341129ef91.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/ta-IN-json-80c52510c4c5fad8cbee.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/ta-IN-json-82adc75c8ce42916819b.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/th-TH-json-523e92f9f3b6924c3f66.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/th-TH-json-53f4f07ed0af4f4164f1.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/th-TH-json-a4b323409d22013c30e2.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/tr-TR-json-399c6f39c50e30399d18.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/tr-TR-json-4ce84a228518e4c17dda.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/tr-TR-json-5297403ca60a39d7f7a2.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/tr-TR-json-662131ef5ef936bed6fc.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/tr-TR-json-745c327779771326407a.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/tr-TR-json-e43e35aa81edeb9058ee.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/tr-TR-json-efa928fe68850c03bfed.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/uk-UA-json-0e7734abfada3d4d8c23.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/uk-UA-json-2cd06c30d512defd8a0b.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/uk-UA-json-402769714cfefd83da2c.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/uk-UA-json-4e9f0d94b39ba92e56f2.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/uk-UA-json-8657d9ac1c78af847957.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/uk-UA-json-a91561233fde5c47199c.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/uk-UA-json-e2259f0f2a3d9e40527c.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/vi-VN-json-059de236624a1a5c0074.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/vi-VN-json-24e0a602b51ae02a9396.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/vi-VN-json-87f5a22fd45850d1ddf7.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/vi-VN-json-91051a67195b4c7f2dc2.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/vi-VN-json-da80feb32fd43849da41.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/vi-VN-json-e81217b667a314e4b841.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/vi-VN-json-fe2d25d75865c608e798.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/zh-CN-json-09003f959f8d8d9ee650.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/zh-CN-json-4762509f4cfefbc0e504.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/zh-CN-json-6c5e2f363709b51a4fca.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/zh-CN-json-8a2394a4129f40872d71.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/zh-CN-json-9a4f14a3964c94a3b1d0.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/zh-CN-json-cfa7b0a95405aae3bd85.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/zh-CN-json-e5e59a1cd383192a1792.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/zh-HK-json-2e545ed460deb9818584.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/zh-HK-json-2f278ce98daca1c37501.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/zh-HK-json-79ea857f9fc00efa982e.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/zh-HK-json-9e65481cf4e01edf7ee9.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/zh-HK-json-aee1350572c354c80356.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/zh-HK-json-d549d0545edbb2c9b957.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/zh-HK-json-d621701ec05102b37e3b.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/zh-TW-json-077dac2df525c01b947c.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/zh-TW-json-5c0415fa2e3076904544.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/zh-TW-json-67cab9706c94be113c72.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/zh-TW-json-8e24a4e83f3a0e4ae157.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/zh-TW-json-e4eb1416e4564d3a1fd9.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/zh-TW-json-eb23779805948ed5342c.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/zh-TW-json-fa855c8136cdf8c637e0.d.ts +0 -2
- package/types/packages/excalidraw/dist/vendors-excalidraw.production.min-deflate.js.d.ts +0 -0
- package/types/packages/excalidraw/dist/vendors-excalidraw.production.min-index.js.d.ts +0 -0
- package/types/packages/excalidraw/dist/vendors-excalidraw.production.min-index.mjs.d.ts +0 -0
- package/types/packages/excalidraw/dist/vendors-excalidraw.production.min-index.module.js.d.ts +0 -0
- package/types/packages/excalidraw/dist/vendors-excalidraw.production.min-inflate.js.d.ts +0 -0
- package/types/packages/excalidraw/dist/vendors-excalidraw.production.min-trees.js.d.ts +0 -0
- package/types/packages/excalidraw/example/public/bundle.d.ts +0 -4
- package/types/packages/excalidraw/example/public/excalidraw-assets-dev/locales/ar-SA-json-422720aeae76b43f4e34.d.ts +0 -2
- package/types/packages/excalidraw/example/public/excalidraw-assets-dev/locales/bg-BG-json-ae0d3ff13ac91abf996f.d.ts +0 -2
- package/types/packages/excalidraw/example/public/excalidraw-assets-dev/locales/bn-BD-json-32cdc6ced24b13f36bbc.d.ts +0 -2
- package/types/packages/excalidraw/example/public/excalidraw-assets-dev/locales/ca-ES-json-a49f03ca494b1ca8ed9b.d.ts +0 -2
- package/types/packages/excalidraw/example/public/excalidraw-assets-dev/locales/cs-CZ-json-2f07dbffe26aa12a024c.d.ts +0 -2
- package/types/packages/excalidraw/example/public/excalidraw-assets-dev/locales/da-DK-json-6ae97a313d4264946e31.d.ts +0 -2
- package/types/packages/excalidraw/example/public/excalidraw-assets-dev/locales/de-DE-json-c80daaed2a67b2f15223.d.ts +0 -2
- package/types/packages/excalidraw/example/public/excalidraw-assets-dev/locales/el-GR-json-51bfd33c7f83bbd7f6db.d.ts +0 -2
- package/types/packages/excalidraw/example/public/excalidraw-assets-dev/locales/es-ES-json-8b67d656368fbf73428a.d.ts +0 -2
- package/types/packages/excalidraw/example/public/excalidraw-assets-dev/locales/eu-ES-json-5e56699d66f76750fe41.d.ts +0 -2
- package/types/packages/excalidraw/example/public/excalidraw-assets-dev/locales/fa-IR-json-d0c9c049db458a8ca59b.d.ts +0 -2
- package/types/packages/excalidraw/example/public/excalidraw-assets-dev/locales/fi-FI-json-1ae181bce5d26c50d814.d.ts +0 -2
- package/types/packages/excalidraw/example/public/excalidraw-assets-dev/locales/fr-FR-json-0956ba0a6dca32f13c7c.d.ts +0 -2
- package/types/packages/excalidraw/example/public/excalidraw-assets-dev/locales/gl-ES-json-1d1f4fc2134412b9c96a.d.ts +0 -2
- package/types/packages/excalidraw/example/public/excalidraw-assets-dev/locales/he-IL-json-1f78737fd8e123db1288.d.ts +0 -2
- package/types/packages/excalidraw/example/public/excalidraw-assets-dev/locales/hi-IN-json-5be1ea05cc7ee8432cb8.d.ts +0 -2
- package/types/packages/excalidraw/example/public/excalidraw-assets-dev/locales/hu-HU-json-107000c3f76466f229a2.d.ts +0 -2
- package/types/packages/excalidraw/example/public/excalidraw-assets-dev/locales/id-ID-json-f782bb0be319848f497f.d.ts +0 -2
- package/types/packages/excalidraw/example/public/excalidraw-assets-dev/locales/it-IT-json-c10398560de544c3d260.d.ts +0 -2
- package/types/packages/excalidraw/example/public/excalidraw-assets-dev/locales/ja-JP-json-e6171aca80f24923fe78.d.ts +0 -2
- package/types/packages/excalidraw/example/public/excalidraw-assets-dev/locales/kab-KAB-json-24afe8bf173c1ff2b0fb.d.ts +0 -2
- package/types/packages/excalidraw/example/public/excalidraw-assets-dev/locales/kk-KZ-json-ebcf4e820011c8b8947f.d.ts +0 -2
- package/types/packages/excalidraw/example/public/excalidraw-assets-dev/locales/ko-KR-json-8ea51a4ccc4dcc5ad697.d.ts +0 -2
- package/types/packages/excalidraw/example/public/excalidraw-assets-dev/locales/lt-LT-json-5bbbf30868522c7bc767.d.ts +0 -2
- package/types/packages/excalidraw/example/public/excalidraw-assets-dev/locales/lv-LV-json-b098759876ad0f66ffeb.d.ts +0 -2
- package/types/packages/excalidraw/example/public/excalidraw-assets-dev/locales/mr-IN-json-095d9331dce2f1e28fe2.d.ts +0 -2
- package/types/packages/excalidraw/example/public/excalidraw-assets-dev/locales/my-MM-json-6d5eac0f31d26c9151d0.d.ts +0 -2
- package/types/packages/excalidraw/example/public/excalidraw-assets-dev/locales/nb-NO-json-3212c5604c8178216a20.d.ts +0 -2
- package/types/packages/excalidraw/example/public/excalidraw-assets-dev/locales/nl-NL-json-a0917464058630804509.d.ts +0 -2
- package/types/packages/excalidraw/example/public/excalidraw-assets-dev/locales/nn-NO-json-acadf455071816b2e1ed.d.ts +0 -2
- package/types/packages/excalidraw/example/public/excalidraw-assets-dev/locales/oc-FR-json-09009791e68cc185268f.d.ts +0 -2
- package/types/packages/excalidraw/example/public/excalidraw-assets-dev/locales/pa-IN-json-0b4a87b2f3a174822e14.d.ts +0 -2
- package/types/packages/excalidraw/example/public/excalidraw-assets-dev/locales/pl-PL-json-e9f93bc2be954bd5cd6f.d.ts +0 -2
- package/types/packages/excalidraw/example/public/excalidraw-assets-dev/locales/pt-BR-json-1d39c9c817cafb4df7bc.d.ts +0 -2
- package/types/packages/excalidraw/example/public/excalidraw-assets-dev/locales/pt-PT-json-bf4365a3b12692290c60.d.ts +0 -2
- package/types/packages/excalidraw/example/public/excalidraw-assets-dev/locales/ro-RO-json-b5a994918893bdb7f12a.d.ts +0 -2
- package/types/packages/excalidraw/example/public/excalidraw-assets-dev/locales/ru-RU-json-4ca260298f98f8b9d64b.d.ts +0 -2
- package/types/packages/excalidraw/example/public/excalidraw-assets-dev/locales/si-LK-json-036efbecc1473ea2654c.d.ts +0 -2
- package/types/packages/excalidraw/example/public/excalidraw-assets-dev/locales/sk-SK-json-01a56bd743bfafa0ea7f.d.ts +0 -2
- package/types/packages/excalidraw/example/public/excalidraw-assets-dev/locales/sl-SI-json-7c07dba5b6bcb7072b72.d.ts +0 -2
- package/types/packages/excalidraw/example/public/excalidraw-assets-dev/locales/sv-SE-json-344d32171a6dcaa49e4b.d.ts +0 -2
- package/types/packages/excalidraw/example/public/excalidraw-assets-dev/locales/ta-IN-json-972a32d06dc37eae0265.d.ts +0 -2
- package/types/packages/excalidraw/example/public/excalidraw-assets-dev/locales/tr-TR-json-fe7706a48e8c387f0efa.d.ts +0 -2
- package/types/packages/excalidraw/example/public/excalidraw-assets-dev/locales/uk-UA-json-3530ec9aa3e0e74258f2.d.ts +0 -2
- package/types/packages/excalidraw/example/public/excalidraw-assets-dev/locales/vi-VN-json-8787bf8cf6bfb42f8db7.d.ts +0 -2
- package/types/packages/excalidraw/example/public/excalidraw-assets-dev/locales/zh-CN-json-973f54c2e185ded6c3aa.d.ts +0 -2
- package/types/packages/excalidraw/example/public/excalidraw-assets-dev/locales/zh-HK-json-327e43ba85bde53f4508.d.ts +0 -2
- package/types/packages/excalidraw/example/public/excalidraw-assets-dev/locales/zh-TW-json-76cff34960ab6a8ef9ae.d.ts +0 -2
- package/types/packages/excalidraw/example/public/excalidraw-assets-dev/vendor-045ba36ab51d57ee5669.d.ts +0 -0
- package/types/packages/excalidraw/example/public/excalidraw.development.d.ts +0 -4
- /package/types/packages/excalidraw/dist/{1482.d.ts → excalidraw-assets/locales/ar-SA-json-db7c644ccbeb85d54a47.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/{3145.d.ts → excalidraw-assets/locales/az-AZ-json-08a6de50238dbb21926c.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/{excalidraw-assets-dev/bug-issue-template-28bde25b78f0c2ca82bd.d.ts → excalidraw-assets/locales/bg-BG-json-42fb0378311f3ade2627.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/{excalidraw-assets-dev/socketIoClient-fa4b6d469c39d45f2e09.d.ts → excalidraw-assets/locales/bn-BD-json-9ad9e5ae95c4c66297b1.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/{excalidraw-assets-dev/vendor-09807cea73c630ed21df.d.ts → excalidraw-assets/locales/ca-ES-json-a6b2c18f7e85cfd11599.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/{excalidraw-assets-dev/vendor-314a9d35303abe8e0fa9.d.ts → excalidraw-assets/locales/cs-CZ-json-ea03835d73f9b921f7c4.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/{excalidraw-assets-dev/vendor-c00e8786eb9fe4ac838a.d.ts → excalidraw-assets/locales/da-DK-json-a94944ac6fa9756d2fac.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/{excalidraw-assets-dev/vendor-cdf32fffa1d8406fcad7.d.ts → excalidraw-assets/locales/de-DE-json-d82053ab52357510811b.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/{excalidraw-assets-dev/vendor-e6df8519da951026ff69.d.ts → excalidraw-assets/locales/el-GR-json-4cbc2dbda5a5df636ee1.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets/{0-ad5a1bcaae1f904451f6.d.ts → locales/es-ES-json-7afb66536ee40d852fa2.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets/{100-ee956408a6ae91443fe4.d.ts → locales/eu-ES-json-671a4afcfce7b0a7660b.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets/{113-1177b57ebb1ae4a5ab42.d.ts → locales/fa-IR-json-76b039039b043cc4280c.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets/{113-3f540c6affa81c85fafb.d.ts → locales/fi-FI-json-64c8902f10425e1b2e81.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets/{123-51e78947de710c7c11bb.d.ts → locales/fr-FR-json-d16a471290ba26a6c66a.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets/{1413-8a64f55a922cdcbd52e9.d.ts → locales/gl-ES-json-d11c7966c3c2f95756e0.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets/{1486-c03ed79ce5ed488070dc.d.ts → locales/he-IL-json-a7bc2a673875b2e655e1.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets/{1524-08538a05b850a3036ce5.d.ts → locales/hi-IN-json-2874e177a309dd1be266.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets/{1768-ad1714c7528580d8d26e.d.ts → locales/hu-HU-json-0419027d32efac73d518.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets/{185-f9b3b879e1f40c301cd4.d.ts → locales/id-ID-json-6542dd92ab54a2c1c48e.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets/{2418-439a0957759ac636a25c.d.ts → locales/it-IT-json-ab410570df07304cb0ca.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets/{2418-9c681e5907e1a7f093f9.d.ts → locales/ja-JP-json-2cb067da0fb518e73564.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets/{248-275bedf6a41de91e2b75.d.ts → locales/kaa-json-4d0a4868835d0334a549.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets/{2699-04b5ecb5a54dcbea702f.d.ts → locales/kab-KAB-json-0d400ba2836cc0752cd6.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets/{2809-0b8c02cfee8b6d9dc3a0.d.ts → locales/kk-KZ-json-449979109ab2d8d6b4b2.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets/{2809-27fc025a92a9e4ce6393.d.ts → locales/km-KH-json-cbe8e2e8d26d30a3175c.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets/{2809-8da3a3f40d253d28c3f1.d.ts → locales/ko-KR-json-c2387972637d47f15765.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets/{3148-33eaabd5fbcbd2f5daf7.d.ts → locales/ku-TR-json-bafa8865ed7002bb249e.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets/{315-94423c0ffdc4ca02b374.d.ts → locales/lt-LT-json-9b7e91a51b90ee551cad.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets/{315-a3acdb9fc1208a6c5471.d.ts → locales/lv-LV-json-f7f9363e42ee2e3a7c67.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets/{328-0b9c67a538fd9973b3bd.d.ts → locales/mr-IN-json-ad1359c30c334d05eee0.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets/{328-73642058fc8101af5ebb.d.ts → locales/my-MM-json-3ba296b6fcf2a2197a7c.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets/{3430-d0339c71fee031d90e8d.d.ts → locales/nb-NO-json-798d785698d467e76fcf.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets/{3430-fe45a4aebf1a8513a431.d.ts → locales/nl-NL-json-2cf913fe2f491c5d7075.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets/{349-5a80055b384634838a8f.d.ts → locales/nn-NO-json-aa607835ad9408789c5f.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets/{3539-e87b055826a0b8faa98f.d.ts → locales/oc-FR-json-644a5eaa1311f70cb697.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets/{357-489a6fb9e2f9942873a9.d.ts → locales/pa-IN-json-165c5c2760688033b2cc.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets/{357-5f634810fe92d71bd89c.d.ts → locales/pl-PL-json-35c1f168f53af24b657a.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets/{3724-0b4d6ac8677b287d8eda.d.ts → locales/pt-BR-json-370215dc506c58ee3217.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets/{3948-2e4bb81ff6180a4d14e7.d.ts → locales/pt-PT-json-6f3d80656622a222b4e2.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets/{3948-64cabedbf167de960c6c.d.ts → locales/ro-RO-json-3c32b962880e225d3416.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets/{4024-9a3842539a2e52e17907.d.ts → locales/ru-RU-json-e1f4ed9d2d074f778304.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets/{4036-9b0fef5eba7479644904.d.ts → locales/si-LK-json-4921d4298abfa256fe6f.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets/{4036-a6ded6a16c3d8401fddc.d.ts → locales/sk-SK-json-27b59d7e026675f929c4.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets/{418-855bc792a206853599e9.d.ts → locales/sl-SI-json-efb839ef0456f5c72e6e.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets/{430-d18f78f4c54d44e2f183.d.ts → locales/sv-SE-json-7cc9e929689f69c86e59.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets/{431-b46d06bb6224e64c467a.d.ts → locales/ta-IN-json-2fa1854af68381c61913.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets/{431-d69c03e10942d04db7f1.d.ts → locales/th-TH-json-9a390d3cc7a7a6226b63.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets/{445-3dca5550de6c6a3c6b2e.d.ts → locales/tr-TR-json-fc9b16e9dc2be2660439.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets/{453-4eba68e311bf89951319.d.ts → locales/uk-UA-json-12240e0e4d42ecfd0bc7.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets/{453-821ac85757ac165cadb1.d.ts → locales/vi-VN-json-9c1c2a9fa9d6b5a58223.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets/{455-781bceffd24276fc1f4a.d.ts → locales/zh-CN-json-069c304b5011429be615.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets/{4881-4ccd6db636fab9e44519.d.ts → locales/zh-HK-json-d9bf1e4e2d1f8650c680.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets/{4946-0b98a36ce9bc404b25f3.d.ts → locales/zh-TW-json-5a3fa7cacfa83c411d89.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/{ar-SA-json-808d2efbf452212f669d.d.ts → ar-SA-json-f35c4f87e6e2dcf7c20a.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/{ar-SA-json-8df64942a3f6232064a4.d.ts → az-AZ-json-5d70eb8bf3f20abc3bac.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/{ar-SA-json-96e4fe4f95a1be3983be.d.ts → bg-BG-json-88cced5fd8a6d8298501.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/{ar-SA-json-a69e95810fd104088c5c.d.ts → bn-BD-json-a06588c61947851c8579.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/{ar-SA-json-ab6a9216e129bbba9b1a.d.ts → ca-ES-json-9b25933a25836cc0be23.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/{ar-SA-json-b6404a304896578c57e7.d.ts → cs-CZ-json-1d6c97ea271d017058c9.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/{ar-SA-json-f0a936944c7690d6ca20.d.ts → da-DK-json-34a60c9843cecd71376f.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/{az-AZ-json-589b1b62c7020f14c833.d.ts → de-DE-json-d13450595b795867412b.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/{az-AZ-json-aa2106a195005649f288.d.ts → el-GR-json-c854b199f3ac07d40294.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/{bg-BG-json-0da12a1e2151c9abeddd.d.ts → es-ES-json-6a667bfbf4ff3d0181a7.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/{bg-BG-json-244a526ffd7fb0401bf4.d.ts → eu-ES-json-3ec11367a80491b09056.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/{bg-BG-json-27fa33071eaa81394d61.d.ts → fa-IR-json-e459964936177074abe7.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/{bg-BG-json-3d8cfccdb2df6bf180ac.d.ts → fi-FI-json-f7839bb6f5ad0a3c7e0d.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/{bg-BG-json-79742eced03e74339dfa.d.ts → fr-FR-json-20e8535e2675a6736c81.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/{bg-BG-json-e9f8c439c703b9c46f8f.d.ts → gl-ES-json-861f534b46c0db1fa8db.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/{bg-BG-json-f0939048738ceeacefae.d.ts → he-IL-json-504d78736487793ffccd.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/{bn-BD-json-4b92eb02a90d83c47173.d.ts → hi-IN-json-82d988431011c330242a.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/{bn-BD-json-6b8f0d28591eb6926c5a.d.ts → hu-HU-json-d4150250980011726fd9.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/{bn-BD-json-737c1b739f303a032d89.d.ts → id-ID-json-82e300d4fe1e87adba9b.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/{bn-BD-json-84daac1a6f87d54ab482.d.ts → it-IT-json-6ecc9aec005faab90f41.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/{bn-BD-json-b181d32e04f431472a00.d.ts → ja-JP-json-3c6a065f0f1303b297fa.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/{bn-BD-json-c6894a7a9379197f0339.d.ts → kaa-json-983a9ccc652aa01980f3.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/{bn-BD-json-fcc8b944b3acc1c55753.d.ts → kab-KAB-json-cac3cf66f1db5c1a6e19.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/{ca-ES-json-0f0e2e2efe8081b84670.d.ts → kk-KZ-json-e9dd81c22419efd44478.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/{ca-ES-json-31e2a61e80cf3fc5e692.d.ts → km-KH-json-be77acee611d96d88dda.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/{ca-ES-json-5f515dea6151baaa2eaa.d.ts → ko-KR-json-ad8e9d31d52b26f3fbc2.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/{ca-ES-json-76499e62393c03007178.d.ts → ku-TR-json-ed67af91ae1920f114a8.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/{ca-ES-json-b8795d2c06e02f8459d2.d.ts → lt-LT-json-2c3d35d6fb5dbf95a27e.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/{ca-ES-json-e85ce0d6447d42432c66.d.ts → lv-LV-json-fa8973c231afb2ddafe9.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/{ca-ES-json-f19488481689426f35e7.d.ts → mr-IN-json-2949146743072eb11b40.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/{cs-CZ-json-101521a09a7715f909be.d.ts → my-MM-json-4c04ffe415641f69ed75.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/{cs-CZ-json-124bc5ab8060f0c7e965.d.ts → nb-NO-json-b8d7a5b70562dacdad45.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/{cs-CZ-json-2a885b79b3be836df283.d.ts → nl-NL-json-a65f82a25fe038c45d35.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/{cs-CZ-json-343789a27d8b5e259601.d.ts → nn-NO-json-858fbccbc5be386977db.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/{cs-CZ-json-3c34245696c3fa41b731.d.ts → oc-FR-json-a68ea08272c8da3c0e3f.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/{cs-CZ-json-4131c5c6a650ff359d88.d.ts → pa-IN-json-90a2b3775bd7d8983def.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/{cs-CZ-json-96005b5d91bada4af762.d.ts → pl-PL-json-9bb55330d5aaf336646e.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/{da-DK-json-291963ff7bdf063a3414.d.ts → pt-BR-json-3635e753c1b6e5b681fa.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/{da-DK-json-43c89c591886c0bf87c5.d.ts → pt-PT-json-0d3694a92e0134549086.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/{da-DK-json-4d9054b3dd4ff8de7bfa.d.ts → ro-RO-json-e83fda16c860c6d0b383.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/{da-DK-json-68847d6e62bc249abbec.d.ts → ru-RU-json-ddc13261ce5d864d36a9.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/{da-DK-json-d099915b14b07f999456.d.ts → si-LK-json-16eb66dbfc6c55fc85b1.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/{da-DK-json-dfdaec93be64dc2704d9.d.ts → sk-SK-json-782ead8707f2ad0e8e4e.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/{da-DK-json-fa77dc522933d084c6c6.d.ts → sl-SI-json-82e55cf7cdbdc7d7f959.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/{de-DE-json-0dfed44e094e5e7647ea.d.ts → sv-SE-json-2f362899d3ac4089534f.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/{de-DE-json-2600a783fee15a69cacc.d.ts → ta-IN-json-07623a485202da63a84b.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/{de-DE-json-53038367422db181d67c.d.ts → th-TH-json-4e4b97f5f6e905191383.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/{de-DE-json-72757b9d842748bf832e.d.ts → tr-TR-json-003be1cf6ebf0b787dec.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/{de-DE-json-c1c6f1ccba0c81e36ff3.d.ts → uk-UA-json-ca6ea1156db2649d3e27.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/{de-DE-json-c4d1b52feda557945ecf.d.ts → vi-VN-json-9a5e5fab41a1a120a916.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/{de-DE-json-d8d9ee97794526088903.d.ts → zh-CN-json-670c28a6ae1e3ddecaa4.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/{el-GR-json-4a570378e97ad31b9d10.d.ts → zh-HK-json-93b9b676d4f4b5702797.d.ts} +0 -0
- /package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/{el-GR-json-6b618647cd5dc299d56b.d.ts → zh-TW-json-805d10b0eed9ca51b318.d.ts} +0 -0
|
@@ -25,7 +25,7 @@ eval("/*!\n\npica\nhttps://github.com/nodeca/pica\n\n*/\n\n(function(f){if(true)
|
|
|
25
25
|
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
|
26
26
|
|
|
27
27
|
"use strict";
|
|
28
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n\n/*! image-blob-reduce 3.0.1 https://github.com/nodeca/image-blob-reduce @license MIT */\nvar assign$1 = function assign(to) {\n var from;\n\n for (var s = 1; s < arguments.length; s++) {\n from = Object(arguments[s]);\n\n for (var key in from) {\n if (Object.prototype.hasOwnProperty.call(from, key)) to[key] = from[key];\n }\n }\n\n return to;\n};\n\n\nfunction pick(from, props) {\n var to = {};\n\n props.forEach(function (key) {\n if (Object.prototype.hasOwnProperty.call(from, key)) to[key] = from[key];\n });\n\n return to;\n}\n\n\nfunction pick_pica_resize_options(from) {\n return pick(from, [\n 'alpha',\n 'unsharpAmount',\n 'unsharpRadius',\n 'unsharpThreshold',\n 'cancelToken'\n ]);\n}\n\n\nvar pick_1 = pick;\nvar pick_pica_resize_options_1 = pick_pica_resize_options;\n\nvar utils = {\n\tassign: assign$1,\n\tpick: pick_1,\n\tpick_pica_resize_options: pick_pica_resize_options_1\n};\n\nfunction createCommonjsModule(fn) {\n var module = { exports: {} };\n\treturn fn(module, module.exports), module.exports;\n}\n\nfunction commonjsRequire (target) {\n\tthrow new Error('Could not dynamically require \"' + target + '\". Please configure the dynamicRequireTargets option of @rollup/plugin-commonjs appropriately for this require call to behave properly.');\n}\n\n/*!\n\npica\nhttps://github.com/nodeca/pica\n\n*/\n\nvar pica = createCommonjsModule(function (module, exports) {\n(function(f){{module.exports=f();}})(function(){return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof commonjsRequire&&commonjsRequire;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t);}return n[i].exports}for(var u=\"function\"==typeof commonjsRequire&&commonjsRequire,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(_dereq_,module,exports){\n\nvar inherits = _dereq_('inherits');\n\nvar Multimath = _dereq_('multimath');\n\nvar mm_unsharp_mask = _dereq_('./mm_unsharp_mask');\n\nvar mm_resize = _dereq_('./mm_resize');\n\nfunction MathLib(requested_features) {\n var __requested_features = requested_features || [];\n\n var features = {\n js: __requested_features.indexOf('js') >= 0,\n wasm: __requested_features.indexOf('wasm') >= 0\n };\n Multimath.call(this, features);\n this.features = {\n js: features.js,\n wasm: features.wasm && this.has_wasm()\n };\n this.use(mm_unsharp_mask);\n this.use(mm_resize);\n}\n\ninherits(MathLib, Multimath);\n\nMathLib.prototype.resizeAndUnsharp = function resizeAndUnsharp(options, cache) {\n var result = this.resize(options, cache);\n\n if (options.unsharpAmount) {\n this.unsharp_mask(result, options.toWidth, options.toHeight, options.unsharpAmount, options.unsharpRadius, options.unsharpThreshold);\n }\n\n return result;\n};\n\nmodule.exports = MathLib;\n\n},{\"./mm_resize\":4,\"./mm_unsharp_mask\":9,\"inherits\":19,\"multimath\":20}],2:[function(_dereq_,module,exports){\n//var FIXED_FRAC_BITS = 14;\n\nfunction clampTo8(i) {\n return i < 0 ? 0 : i > 255 ? 255 : i;\n} // Convolve image in horizontal directions and transpose output. In theory,\n// transpose allow:\n//\n// - use the same convolver for both passes (this fails due different\n// types of input array and temporary buffer)\n// - making vertical pass by horisonltal lines inprove CPU cache use.\n//\n// But in real life this doesn't work :)\n//\n\n\nfunction convolveHorizontally(src, dest, srcW, srcH, destW, filters) {\n var r, g, b, a;\n var filterPtr, filterShift, filterSize;\n var srcPtr, srcY, destX, filterVal;\n var srcOffset = 0,\n destOffset = 0; // For each row\n\n for (srcY = 0; srcY < srcH; srcY++) {\n filterPtr = 0; // Apply precomputed filters to each destination row point\n\n for (destX = 0; destX < destW; destX++) {\n // Get the filter that determines the current output pixel.\n filterShift = filters[filterPtr++];\n filterSize = filters[filterPtr++];\n srcPtr = srcOffset + filterShift * 4 | 0;\n r = g = b = a = 0; // Apply the filter to the row to get the destination pixel r, g, b, a\n\n for (; filterSize > 0; filterSize--) {\n filterVal = filters[filterPtr++]; // Use reverse order to workaround deopts in old v8 (node v.10)\n // Big thanks to @mraleph (Vyacheslav Egorov) for the tip.\n\n a = a + filterVal * src[srcPtr + 3] | 0;\n b = b + filterVal * src[srcPtr + 2] | 0;\n g = g + filterVal * src[srcPtr + 1] | 0;\n r = r + filterVal * src[srcPtr] | 0;\n srcPtr = srcPtr + 4 | 0;\n } // Bring this value back in range. All of the filter scaling factors\n // are in fixed point with FIXED_FRAC_BITS bits of fractional part.\n //\n // (!) Add 1/2 of value before clamping to get proper rounding. In other\n // case brightness loss will be noticeable if you resize image with white\n // border and place it on white background.\n //\n\n\n dest[destOffset + 3] = clampTo8(a + (1 << 13) >> 14\n /*FIXED_FRAC_BITS*/\n );\n dest[destOffset + 2] = clampTo8(b + (1 << 13) >> 14\n /*FIXED_FRAC_BITS*/\n );\n dest[destOffset + 1] = clampTo8(g + (1 << 13) >> 14\n /*FIXED_FRAC_BITS*/\n );\n dest[destOffset] = clampTo8(r + (1 << 13) >> 14\n /*FIXED_FRAC_BITS*/\n );\n destOffset = destOffset + srcH * 4 | 0;\n }\n\n destOffset = (srcY + 1) * 4 | 0;\n srcOffset = (srcY + 1) * srcW * 4 | 0;\n }\n} // Technically, convolvers are the same. But input array and temporary\n// buffer can be of different type (especially, in old browsers). So,\n// keep code in separate functions to avoid deoptimizations & speed loss.\n\n\nfunction convolveVertically(src, dest, srcW, srcH, destW, filters) {\n var r, g, b, a;\n var filterPtr, filterShift, filterSize;\n var srcPtr, srcY, destX, filterVal;\n var srcOffset = 0,\n destOffset = 0; // For each row\n\n for (srcY = 0; srcY < srcH; srcY++) {\n filterPtr = 0; // Apply precomputed filters to each destination row point\n\n for (destX = 0; destX < destW; destX++) {\n // Get the filter that determines the current output pixel.\n filterShift = filters[filterPtr++];\n filterSize = filters[filterPtr++];\n srcPtr = srcOffset + filterShift * 4 | 0;\n r = g = b = a = 0; // Apply the filter to the row to get the destination pixel r, g, b, a\n\n for (; filterSize > 0; filterSize--) {\n filterVal = filters[filterPtr++]; // Use reverse order to workaround deopts in old v8 (node v.10)\n // Big thanks to @mraleph (Vyacheslav Egorov) for the tip.\n\n a = a + filterVal * src[srcPtr + 3] | 0;\n b = b + filterVal * src[srcPtr + 2] | 0;\n g = g + filterVal * src[srcPtr + 1] | 0;\n r = r + filterVal * src[srcPtr] | 0;\n srcPtr = srcPtr + 4 | 0;\n } // Bring this value back in range. All of the filter scaling factors\n // are in fixed point with FIXED_FRAC_BITS bits of fractional part.\n //\n // (!) Add 1/2 of value before clamping to get proper rounding. In other\n // case brightness loss will be noticeable if you resize image with white\n // border and place it on white background.\n //\n\n\n dest[destOffset + 3] = clampTo8(a + (1 << 13) >> 14\n /*FIXED_FRAC_BITS*/\n );\n dest[destOffset + 2] = clampTo8(b + (1 << 13) >> 14\n /*FIXED_FRAC_BITS*/\n );\n dest[destOffset + 1] = clampTo8(g + (1 << 13) >> 14\n /*FIXED_FRAC_BITS*/\n );\n dest[destOffset] = clampTo8(r + (1 << 13) >> 14\n /*FIXED_FRAC_BITS*/\n );\n destOffset = destOffset + srcH * 4 | 0;\n }\n\n destOffset = (srcY + 1) * 4 | 0;\n srcOffset = (srcY + 1) * srcW * 4 | 0;\n }\n}\n\nmodule.exports = {\n convolveHorizontally: convolveHorizontally,\n convolveVertically: convolveVertically\n};\n\n},{}],3:[function(_dereq_,module,exports){\n/* eslint-disable max-len */\n\nmodule.exports = 'AGFzbQEAAAAADAZkeWxpbmsAAAAAAAEXA2AAAGAGf39/f39/AGAHf39/f39/fwACDwEDZW52Bm1lbW9yeQIAAAMEAwABAgYGAX8AQQALB1cFEV9fd2FzbV9jYWxsX2N0b3JzAAAIY29udm9sdmUAAQpjb252b2x2ZUhWAAIMX19kc29faGFuZGxlAwAYX193YXNtX2FwcGx5X2RhdGFfcmVsb2NzAAAK7AMDAwABC8YDAQ9/AkAgA0UNACAERQ0AA0AgDCENQQAhE0EAIQcDQCAHQQJqIQYCfyAHQQF0IAVqIgcuAQIiFEUEQEGAwAAhCEGAwAAhCUGAwAAhCkGAwAAhCyAGDAELIBIgBy4BAGohCEEAIQsgFCEHQQAhDiAGIQlBACEPQQAhEANAIAUgCUEBdGouAQAiESAAIAhBAnRqKAIAIgpBGHZsIBBqIRAgCkH/AXEgEWwgC2ohCyAKQRB2Qf8BcSARbCAPaiEPIApBCHZB/wFxIBFsIA5qIQ4gCEEBaiEIIAlBAWohCSAHQQFrIgcNAAsgC0GAQGshCCAOQYBAayEJIA9BgEBrIQogEEGAQGshCyAGIBRqCyEHIAEgDUECdGogCUEOdSIGQf8BIAZB/wFIGyIGQQAgBkEAShtBCHRBgP4DcSAKQQ51IgZB/wEgBkH/AUgbIgZBACAGQQBKG0EQdEGAgPwHcSALQQ51IgZB/wEgBkH/AUgbIgZBACAGQQBKG0EYdHJyIAhBDnUiBkH/ASAGQf8BSBsiBkEAIAZBAEobcjYCACADIA1qIQ0gE0EBaiITIARHDQALIAxBAWoiDCACbCESIAMgDEcNAAsLCx4AQQAgAiADIAQgBSAAEAEgAkEAIAQgBSAGIAEQAQs=';\n\n},{}],4:[function(_dereq_,module,exports){\n\nmodule.exports = {\n name: 'resize',\n fn: _dereq_('./resize'),\n wasm_fn: _dereq_('./resize_wasm'),\n wasm_src: _dereq_('./convolve_wasm_base64')\n};\n\n},{\"./convolve_wasm_base64\":3,\"./resize\":5,\"./resize_wasm\":8}],5:[function(_dereq_,module,exports){\n\nvar createFilters = _dereq_('./resize_filter_gen');\n\nvar convolveHorizontally = _dereq_('./convolve').convolveHorizontally;\n\nvar convolveVertically = _dereq_('./convolve').convolveVertically;\n\nfunction resetAlpha(dst, width, height) {\n var ptr = 3,\n len = width * height * 4 | 0;\n\n while (ptr < len) {\n dst[ptr] = 0xFF;\n ptr = ptr + 4 | 0;\n }\n}\n\nmodule.exports = function resize(options) {\n var src = options.src;\n var srcW = options.width;\n var srcH = options.height;\n var destW = options.toWidth;\n var destH = options.toHeight;\n var scaleX = options.scaleX || options.toWidth / options.width;\n var scaleY = options.scaleY || options.toHeight / options.height;\n var offsetX = options.offsetX || 0;\n var offsetY = options.offsetY || 0;\n var dest = options.dest || new Uint8Array(destW * destH * 4);\n var quality = typeof options.quality === 'undefined' ? 3 : options.quality;\n var alpha = options.alpha || false;\n var filtersX = createFilters(quality, srcW, destW, scaleX, offsetX),\n filtersY = createFilters(quality, srcH, destH, scaleY, offsetY);\n var tmp = new Uint8Array(destW * srcH * 4); // To use single function we need src & tmp of the same type.\n // But src can be CanvasPixelArray, and tmp - Uint8Array. So, keep\n // vertical and horizontal passes separately to avoid deoptimization.\n\n convolveHorizontally(src, tmp, srcW, srcH, destW, filtersX);\n convolveVertically(tmp, dest, srcH, destW, destH, filtersY); // That's faster than doing checks in convolver.\n // !!! Note, canvas data is not premultipled. We don't need other\n // alpha corrections.\n\n if (!alpha) resetAlpha(dest, destW, destH);\n return dest;\n};\n\n},{\"./convolve\":2,\"./resize_filter_gen\":6}],6:[function(_dereq_,module,exports){\n\nvar FILTER_INFO = _dereq_('./resize_filter_info'); // Precision of fixed FP values\n\n\nvar FIXED_FRAC_BITS = 14;\n\nfunction toFixedPoint(num) {\n return Math.round(num * ((1 << FIXED_FRAC_BITS) - 1));\n}\n\nmodule.exports = function resizeFilterGen(quality, srcSize, destSize, scale, offset) {\n var filterFunction = FILTER_INFO[quality].filter;\n var scaleInverted = 1.0 / scale;\n var scaleClamped = Math.min(1.0, scale); // For upscale\n // Filter window (averaging interval), scaled to src image\n\n var srcWindow = FILTER_INFO[quality].win / scaleClamped;\n var destPixel, srcPixel, srcFirst, srcLast, filterElementSize, floatFilter, fxpFilter, total, pxl, idx, floatVal, filterTotal, filterVal;\n var leftNotEmpty, rightNotEmpty, filterShift, filterSize;\n var maxFilterElementSize = Math.floor((srcWindow + 1) * 2);\n var packedFilter = new Int16Array((maxFilterElementSize + 2) * destSize);\n var packedFilterPtr = 0;\n var slowCopy = !packedFilter.subarray || !packedFilter.set; // For each destination pixel calculate source range and built filter values\n\n for (destPixel = 0; destPixel < destSize; destPixel++) {\n // Scaling should be done relative to central pixel point\n srcPixel = (destPixel + 0.5) * scaleInverted + offset;\n srcFirst = Math.max(0, Math.floor(srcPixel - srcWindow));\n srcLast = Math.min(srcSize - 1, Math.ceil(srcPixel + srcWindow));\n filterElementSize = srcLast - srcFirst + 1;\n floatFilter = new Float32Array(filterElementSize);\n fxpFilter = new Int16Array(filterElementSize);\n total = 0.0; // Fill filter values for calculated range\n\n for (pxl = srcFirst, idx = 0; pxl <= srcLast; pxl++, idx++) {\n floatVal = filterFunction((pxl + 0.5 - srcPixel) * scaleClamped);\n total += floatVal;\n floatFilter[idx] = floatVal;\n } // Normalize filter, convert to fixed point and accumulate conversion error\n\n\n filterTotal = 0;\n\n for (idx = 0; idx < floatFilter.length; idx++) {\n filterVal = floatFilter[idx] / total;\n filterTotal += filterVal;\n fxpFilter[idx] = toFixedPoint(filterVal);\n } // Compensate normalization error, to minimize brightness drift\n\n\n fxpFilter[destSize >> 1] += toFixedPoint(1.0 - filterTotal); //\n // Now pack filter to useable form\n //\n // 1. Trim heading and tailing zero values, and compensate shitf/length\n // 2. Put all to single array in this format:\n //\n // [ pos shift, data length, value1, value2, value3, ... ]\n //\n\n leftNotEmpty = 0;\n\n while (leftNotEmpty < fxpFilter.length && fxpFilter[leftNotEmpty] === 0) {\n leftNotEmpty++;\n }\n\n if (leftNotEmpty < fxpFilter.length) {\n rightNotEmpty = fxpFilter.length - 1;\n\n while (rightNotEmpty > 0 && fxpFilter[rightNotEmpty] === 0) {\n rightNotEmpty--;\n }\n\n filterShift = srcFirst + leftNotEmpty;\n filterSize = rightNotEmpty - leftNotEmpty + 1;\n packedFilter[packedFilterPtr++] = filterShift; // shift\n\n packedFilter[packedFilterPtr++] = filterSize; // size\n\n if (!slowCopy) {\n packedFilter.set(fxpFilter.subarray(leftNotEmpty, rightNotEmpty + 1), packedFilterPtr);\n packedFilterPtr += filterSize;\n } else {\n // fallback for old IE < 11, without subarray/set methods\n for (idx = leftNotEmpty; idx <= rightNotEmpty; idx++) {\n packedFilter[packedFilterPtr++] = fxpFilter[idx];\n }\n }\n } else {\n // zero data, write header only\n packedFilter[packedFilterPtr++] = 0; // shift\n\n packedFilter[packedFilterPtr++] = 0; // size\n }\n }\n\n return packedFilter;\n};\n\n},{\"./resize_filter_info\":7}],7:[function(_dereq_,module,exports){\n\nmodule.exports = [{\n // Nearest neibor (Box)\n win: 0.5,\n filter: function filter(x) {\n return x >= -0.5 && x < 0.5 ? 1.0 : 0.0;\n }\n}, {\n // Hamming\n win: 1.0,\n filter: function filter(x) {\n if (x <= -1.0 || x >= 1.0) {\n return 0.0;\n }\n\n if (x > -1.19209290E-07 && x < 1.19209290E-07) {\n return 1.0;\n }\n\n var xpi = x * Math.PI;\n return Math.sin(xpi) / xpi * (0.54 + 0.46 * Math.cos(xpi / 1.0));\n }\n}, {\n // Lanczos, win = 2\n win: 2.0,\n filter: function filter(x) {\n if (x <= -2.0 || x >= 2.0) {\n return 0.0;\n }\n\n if (x > -1.19209290E-07 && x < 1.19209290E-07) {\n return 1.0;\n }\n\n var xpi = x * Math.PI;\n return Math.sin(xpi) / xpi * Math.sin(xpi / 2.0) / (xpi / 2.0);\n }\n}, {\n // Lanczos, win = 3\n win: 3.0,\n filter: function filter(x) {\n if (x <= -3.0 || x >= 3.0) {\n return 0.0;\n }\n\n if (x > -1.19209290E-07 && x < 1.19209290E-07) {\n return 1.0;\n }\n\n var xpi = x * Math.PI;\n return Math.sin(xpi) / xpi * Math.sin(xpi / 3.0) / (xpi / 3.0);\n }\n}];\n\n},{}],8:[function(_dereq_,module,exports){\n\nvar createFilters = _dereq_('./resize_filter_gen');\n\nfunction resetAlpha(dst, width, height) {\n var ptr = 3,\n len = width * height * 4 | 0;\n\n while (ptr < len) {\n dst[ptr] = 0xFF;\n ptr = ptr + 4 | 0;\n }\n}\n\nfunction asUint8Array(src) {\n return new Uint8Array(src.buffer, 0, src.byteLength);\n}\n\nvar IS_LE = true; // should not crash everything on module load in old browsers\n\ntry {\n IS_LE = new Uint32Array(new Uint8Array([1, 0, 0, 0]).buffer)[0] === 1;\n} catch (__) {}\n\nfunction copyInt16asLE(src, target, target_offset) {\n if (IS_LE) {\n target.set(asUint8Array(src), target_offset);\n return;\n }\n\n for (var ptr = target_offset, i = 0; i < src.length; i++) {\n var data = src[i];\n target[ptr++] = data & 0xFF;\n target[ptr++] = data >> 8 & 0xFF;\n }\n}\n\nmodule.exports = function resize_wasm(options) {\n var src = options.src;\n var srcW = options.width;\n var srcH = options.height;\n var destW = options.toWidth;\n var destH = options.toHeight;\n var scaleX = options.scaleX || options.toWidth / options.width;\n var scaleY = options.scaleY || options.toHeight / options.height;\n var offsetX = options.offsetX || 0.0;\n var offsetY = options.offsetY || 0.0;\n var dest = options.dest || new Uint8Array(destW * destH * 4);\n var quality = typeof options.quality === 'undefined' ? 3 : options.quality;\n var alpha = options.alpha || false;\n var filtersX = createFilters(quality, srcW, destW, scaleX, offsetX),\n filtersY = createFilters(quality, srcH, destH, scaleY, offsetY); // destination is 0 too.\n\n var src_offset = 0; // buffer between convolve passes\n\n var tmp_offset = this.__align(src_offset + Math.max(src.byteLength, dest.byteLength));\n\n var filtersX_offset = this.__align(tmp_offset + srcH * destW * 4);\n\n var filtersY_offset = this.__align(filtersX_offset + filtersX.byteLength);\n\n var alloc_bytes = filtersY_offset + filtersY.byteLength;\n\n var instance = this.__instance('resize', alloc_bytes); //\n // Fill memory block with data to process\n //\n\n\n var mem = new Uint8Array(this.__memory.buffer);\n var mem32 = new Uint32Array(this.__memory.buffer); // 32-bit copy is much faster in chrome\n\n var src32 = new Uint32Array(src.buffer);\n mem32.set(src32); // We should guarantee LE bytes order. Filters are not big, so\n // speed difference is not significant vs direct .set()\n\n copyInt16asLE(filtersX, mem, filtersX_offset);\n copyInt16asLE(filtersY, mem, filtersY_offset); //\n // Now call webassembly method\n // emsdk does method names with '_'\n\n var fn = instance.exports.convolveHV || instance.exports._convolveHV;\n fn(filtersX_offset, filtersY_offset, tmp_offset, srcW, srcH, destW, destH); //\n // Copy data back to typed array\n //\n // 32-bit copy is much faster in chrome\n\n var dest32 = new Uint32Array(dest.buffer);\n dest32.set(new Uint32Array(this.__memory.buffer, 0, destH * destW)); // That's faster than doing checks in convolver.\n // !!! Note, canvas data is not premultipled. We don't need other\n // alpha corrections.\n\n if (!alpha) resetAlpha(dest, destW, destH);\n return dest;\n};\n\n},{\"./resize_filter_gen\":6}],9:[function(_dereq_,module,exports){\n\nmodule.exports = {\n name: 'unsharp_mask',\n fn: _dereq_('./unsharp_mask'),\n wasm_fn: _dereq_('./unsharp_mask_wasm'),\n wasm_src: _dereq_('./unsharp_mask_wasm_base64')\n};\n\n},{\"./unsharp_mask\":10,\"./unsharp_mask_wasm\":11,\"./unsharp_mask_wasm_base64\":12}],10:[function(_dereq_,module,exports){\n\nvar glur_mono16 = _dereq_('glur/mono16');\n\nfunction hsv_v16(img, width, height) {\n var size = width * height;\n var out = new Uint16Array(size);\n var r, g, b, max;\n\n for (var i = 0; i < size; i++) {\n r = img[4 * i];\n g = img[4 * i + 1];\n b = img[4 * i + 2];\n max = r >= g && r >= b ? r : g >= b && g >= r ? g : b;\n out[i] = max << 8;\n }\n\n return out;\n}\n\nmodule.exports = function unsharp(img, width, height, amount, radius, threshold) {\n var v1, v2, vmul;\n var diff, iTimes4;\n\n if (amount === 0 || radius < 0.5) {\n return;\n }\n\n if (radius > 2.0) {\n radius = 2.0;\n }\n\n var brightness = hsv_v16(img, width, height);\n var blured = new Uint16Array(brightness); // copy, because blur modify src\n\n glur_mono16(blured, width, height, radius);\n var amountFp = amount / 100 * 0x1000 + 0.5 | 0;\n var thresholdFp = threshold << 8;\n var size = width * height;\n /* eslint-disable indent */\n\n for (var i = 0; i < size; i++) {\n v1 = brightness[i];\n diff = v1 - blured[i];\n\n if (Math.abs(diff) >= thresholdFp) {\n // add unsharp mask to the brightness channel\n v2 = v1 + (amountFp * diff + 0x800 >> 12); // Both v1 and v2 are within [0.0 .. 255.0] (0000-FF00) range, never going into\n // [255.003 .. 255.996] (FF01-FFFF). This allows to round this value as (x+.5)|0\n // later without overflowing.\n\n v2 = v2 > 0xff00 ? 0xff00 : v2;\n v2 = v2 < 0x0000 ? 0x0000 : v2; // Avoid division by 0. V=0 means rgb(0,0,0), unsharp with unsharpAmount>0 cannot\n // change this value (because diff between colors gets inflated), so no need to verify correctness.\n\n v1 = v1 !== 0 ? v1 : 1; // Multiplying V in HSV model by a constant is equivalent to multiplying each component\n // in RGB by the same constant (same for HSL), see also:\n // https://beesbuzz.biz/code/16-hsv-color-transforms\n\n vmul = (v2 << 12) / v1 | 0; // Result will be in [0..255] range because:\n // - all numbers are positive\n // - r,g,b <= (v1/256)\n // - r,g,b,(v1/256),(v2/256) <= 255\n // So highest this number can get is X*255/X+0.5=255.5 which is < 256 and rounds down.\n\n iTimes4 = i * 4;\n img[iTimes4] = img[iTimes4] * vmul + 0x800 >> 12; // R\n\n img[iTimes4 + 1] = img[iTimes4 + 1] * vmul + 0x800 >> 12; // G\n\n img[iTimes4 + 2] = img[iTimes4 + 2] * vmul + 0x800 >> 12; // B\n }\n }\n};\n\n},{\"glur/mono16\":18}],11:[function(_dereq_,module,exports){\n\nmodule.exports = function unsharp(img, width, height, amount, radius, threshold) {\n if (amount === 0 || radius < 0.5) {\n return;\n }\n\n if (radius > 2.0) {\n radius = 2.0;\n }\n\n var pixels = width * height;\n var img_bytes_cnt = pixels * 4;\n var hsv_bytes_cnt = pixels * 2;\n var blur_bytes_cnt = pixels * 2;\n var blur_line_byte_cnt = Math.max(width, height) * 4; // float32 array\n\n var blur_coeffs_byte_cnt = 8 * 4; // float32 array\n\n var img_offset = 0;\n var hsv_offset = img_bytes_cnt;\n var blur_offset = hsv_offset + hsv_bytes_cnt;\n var blur_tmp_offset = blur_offset + blur_bytes_cnt;\n var blur_line_offset = blur_tmp_offset + blur_bytes_cnt;\n var blur_coeffs_offset = blur_line_offset + blur_line_byte_cnt;\n\n var instance = this.__instance('unsharp_mask', img_bytes_cnt + hsv_bytes_cnt + blur_bytes_cnt * 2 + blur_line_byte_cnt + blur_coeffs_byte_cnt, {\n exp: Math.exp\n }); // 32-bit copy is much faster in chrome\n\n\n var img32 = new Uint32Array(img.buffer);\n var mem32 = new Uint32Array(this.__memory.buffer);\n mem32.set(img32); // HSL\n\n var fn = instance.exports.hsv_v16 || instance.exports._hsv_v16;\n fn(img_offset, hsv_offset, width, height); // BLUR\n\n fn = instance.exports.blurMono16 || instance.exports._blurMono16;\n fn(hsv_offset, blur_offset, blur_tmp_offset, blur_line_offset, blur_coeffs_offset, width, height, radius); // UNSHARP\n\n fn = instance.exports.unsharp || instance.exports._unsharp;\n fn(img_offset, img_offset, hsv_offset, blur_offset, width, height, amount, threshold); // 32-bit copy is much faster in chrome\n\n img32.set(new Uint32Array(this.__memory.buffer, 0, pixels));\n};\n\n},{}],12:[function(_dereq_,module,exports){\n/* eslint-disable max-len */\n\nmodule.exports = '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';\n\n},{}],13:[function(_dereq_,module,exports){\n\nvar GC_INTERVAL = 100;\n\nfunction Pool(create, idle) {\n this.create = create;\n this.available = [];\n this.acquired = {};\n this.lastId = 1;\n this.timeoutId = 0;\n this.idle = idle || 2000;\n}\n\nPool.prototype.acquire = function () {\n var _this = this;\n\n var resource;\n\n if (this.available.length !== 0) {\n resource = this.available.pop();\n } else {\n resource = this.create();\n resource.id = this.lastId++;\n\n resource.release = function () {\n return _this.release(resource);\n };\n }\n\n this.acquired[resource.id] = resource;\n return resource;\n};\n\nPool.prototype.release = function (resource) {\n var _this2 = this;\n\n delete this.acquired[resource.id];\n resource.lastUsed = Date.now();\n this.available.push(resource);\n\n if (this.timeoutId === 0) {\n this.timeoutId = setTimeout(function () {\n return _this2.gc();\n }, GC_INTERVAL);\n }\n};\n\nPool.prototype.gc = function () {\n var _this3 = this;\n\n var now = Date.now();\n this.available = this.available.filter(function (resource) {\n if (now - resource.lastUsed > _this3.idle) {\n resource.destroy();\n return false;\n }\n\n return true;\n });\n\n if (this.available.length !== 0) {\n this.timeoutId = setTimeout(function () {\n return _this3.gc();\n }, GC_INTERVAL);\n } else {\n this.timeoutId = 0;\n }\n};\n\nmodule.exports = Pool;\n\n},{}],14:[function(_dereq_,module,exports){\n// min size = 1 can consume large amount of memory\n\nvar MIN_INNER_TILE_SIZE = 2;\n\nmodule.exports = function createStages(fromWidth, fromHeight, toWidth, toHeight, srcTileSize, destTileBorder) {\n var scaleX = toWidth / fromWidth;\n var scaleY = toHeight / fromHeight; // derived from createRegions equation:\n // innerTileWidth = pixelFloor(srcTileSize * scaleX) - 2 * destTileBorder;\n\n var minScale = (2 * destTileBorder + MIN_INNER_TILE_SIZE + 1) / srcTileSize; // refuse to scale image multiple times by less than twice each time,\n // it could only happen because of invalid options\n\n if (minScale > 0.5) return [[toWidth, toHeight]];\n var stageCount = Math.ceil(Math.log(Math.min(scaleX, scaleY)) / Math.log(minScale)); // no additional resizes are necessary,\n // stageCount can be zero or be negative when enlarging the image\n\n if (stageCount <= 1) return [[toWidth, toHeight]];\n var result = [];\n\n for (var i = 0; i < stageCount; i++) {\n var width = Math.round(Math.pow(Math.pow(fromWidth, stageCount - i - 1) * Math.pow(toWidth, i + 1), 1 / stageCount));\n var height = Math.round(Math.pow(Math.pow(fromHeight, stageCount - i - 1) * Math.pow(toHeight, i + 1), 1 / stageCount));\n result.push([width, height]);\n }\n\n return result;\n};\n\n},{}],15:[function(_dereq_,module,exports){\n/*\n * pixelFloor and pixelCeil are modified versions of Math.floor and Math.ceil\n * functions which take into account floating point arithmetic errors.\n * Those errors can cause undesired increments/decrements of sizes and offsets:\n * Math.ceil(36 / (36 / 500)) = 501\n * pixelCeil(36 / (36 / 500)) = 500\n */\n\nvar PIXEL_EPSILON = 1e-5;\n\nfunction pixelFloor(x) {\n var nearest = Math.round(x);\n\n if (Math.abs(x - nearest) < PIXEL_EPSILON) {\n return nearest;\n }\n\n return Math.floor(x);\n}\n\nfunction pixelCeil(x) {\n var nearest = Math.round(x);\n\n if (Math.abs(x - nearest) < PIXEL_EPSILON) {\n return nearest;\n }\n\n return Math.ceil(x);\n}\n\nmodule.exports = function createRegions(options) {\n var scaleX = options.toWidth / options.width;\n var scaleY = options.toHeight / options.height;\n var innerTileWidth = pixelFloor(options.srcTileSize * scaleX) - 2 * options.destTileBorder;\n var innerTileHeight = pixelFloor(options.srcTileSize * scaleY) - 2 * options.destTileBorder; // prevent infinite loop, this should never happen\n\n if (innerTileWidth < 1 || innerTileHeight < 1) {\n throw new Error('Internal error in pica: target tile width/height is too small.');\n }\n\n var x, y;\n var innerX, innerY, toTileWidth, toTileHeight;\n var tiles = [];\n var tile; // we go top-to-down instead of left-to-right to make image displayed from top to\n // doesn in the browser\n\n for (innerY = 0; innerY < options.toHeight; innerY += innerTileHeight) {\n for (innerX = 0; innerX < options.toWidth; innerX += innerTileWidth) {\n x = innerX - options.destTileBorder;\n\n if (x < 0) {\n x = 0;\n }\n\n toTileWidth = innerX + innerTileWidth + options.destTileBorder - x;\n\n if (x + toTileWidth >= options.toWidth) {\n toTileWidth = options.toWidth - x;\n }\n\n y = innerY - options.destTileBorder;\n\n if (y < 0) {\n y = 0;\n }\n\n toTileHeight = innerY + innerTileHeight + options.destTileBorder - y;\n\n if (y + toTileHeight >= options.toHeight) {\n toTileHeight = options.toHeight - y;\n }\n\n tile = {\n toX: x,\n toY: y,\n toWidth: toTileWidth,\n toHeight: toTileHeight,\n toInnerX: innerX,\n toInnerY: innerY,\n toInnerWidth: innerTileWidth,\n toInnerHeight: innerTileHeight,\n offsetX: x / scaleX - pixelFloor(x / scaleX),\n offsetY: y / scaleY - pixelFloor(y / scaleY),\n scaleX: scaleX,\n scaleY: scaleY,\n x: pixelFloor(x / scaleX),\n y: pixelFloor(y / scaleY),\n width: pixelCeil(toTileWidth / scaleX),\n height: pixelCeil(toTileHeight / scaleY)\n };\n tiles.push(tile);\n }\n }\n\n return tiles;\n};\n\n},{}],16:[function(_dereq_,module,exports){\n\nfunction objClass(obj) {\n return Object.prototype.toString.call(obj);\n}\n\nmodule.exports.isCanvas = function isCanvas(element) {\n var cname = objClass(element);\n return cname === '[object HTMLCanvasElement]'\n /* browser */\n || cname === '[object OffscreenCanvas]' || cname === '[object Canvas]'\n /* node-canvas */\n ;\n};\n\nmodule.exports.isImage = function isImage(element) {\n return objClass(element) === '[object HTMLImageElement]';\n};\n\nmodule.exports.isImageBitmap = function isImageBitmap(element) {\n return objClass(element) === '[object ImageBitmap]';\n};\n\nmodule.exports.limiter = function limiter(concurrency) {\n var active = 0,\n queue = [];\n\n function roll() {\n if (active < concurrency && queue.length) {\n active++;\n queue.shift()();\n }\n }\n\n return function limit(fn) {\n return new Promise(function (resolve, reject) {\n queue.push(function () {\n fn().then(function (result) {\n resolve(result);\n active--;\n roll();\n }, function (err) {\n reject(err);\n active--;\n roll();\n });\n });\n roll();\n });\n };\n};\n\nmodule.exports.cib_quality_name = function cib_quality_name(num) {\n switch (num) {\n case 0:\n return 'pixelated';\n\n case 1:\n return 'low';\n\n case 2:\n return 'medium';\n }\n\n return 'high';\n};\n\nmodule.exports.cib_support = function cib_support(createCanvas) {\n return Promise.resolve().then(function () {\n if (typeof createImageBitmap === 'undefined') {\n return false;\n }\n\n var c = createCanvas(100, 100);\n return createImageBitmap(c, 0, 0, 100, 100, {\n resizeWidth: 10,\n resizeHeight: 10,\n resizeQuality: 'high'\n }).then(function (bitmap) {\n var status = bitmap.width === 10; // Branch below is filtered on upper level. We do not call resize\n // detection for basic ImageBitmap.\n //\n // https://developer.mozilla.org/en-US/docs/Web/API/ImageBitmap\n // old Crome 51 has ImageBitmap without .close(). Then this code\n // will throw and return 'false' as expected.\n //\n\n bitmap.close();\n c = null;\n return status;\n });\n })[\"catch\"](function () {\n return false;\n });\n};\n\nmodule.exports.worker_offscreen_canvas_support = function worker_offscreen_canvas_support() {\n return new Promise(function (resolve, reject) {\n if (typeof OffscreenCanvas === 'undefined') {\n // if OffscreenCanvas is present, we assume browser supports Worker and built-in Promise as well\n resolve(false);\n return;\n }\n\n function workerPayload(self) {\n if (typeof createImageBitmap === 'undefined') {\n self.postMessage(false);\n return;\n }\n\n Promise.resolve().then(function () {\n var canvas = new OffscreenCanvas(10, 10); // test that 2d context can be used in worker\n\n var ctx = canvas.getContext('2d');\n ctx.rect(0, 0, 1, 1); // test that cib can be used to return image bitmap from worker\n\n return createImageBitmap(canvas, 0, 0, 1, 1);\n }).then(function () {\n return self.postMessage(true);\n }, function () {\n return self.postMessage(false);\n });\n }\n\n var code = btoa(\"(\".concat(workerPayload.toString(), \")(self);\"));\n var w = new Worker(\"data:text/javascript;base64,\".concat(code));\n\n w.onmessage = function (ev) {\n return resolve(ev.data);\n };\n\n w.onerror = reject;\n }).then(function (result) {\n return result;\n }, function () {\n return false;\n });\n}; // Check if canvas.getContext('2d').getImageData can be used,\n// FireFox randomizes the output of that function in `privacy.resistFingerprinting` mode\n\n\nmodule.exports.can_use_canvas = function can_use_canvas(createCanvas) {\n var usable = false;\n\n try {\n var canvas = createCanvas(2, 1);\n var ctx = canvas.getContext('2d');\n var d = ctx.createImageData(2, 1);\n d.data[0] = 12;\n d.data[1] = 23;\n d.data[2] = 34;\n d.data[3] = 255;\n d.data[4] = 45;\n d.data[5] = 56;\n d.data[6] = 67;\n d.data[7] = 255;\n ctx.putImageData(d, 0, 0);\n d = null;\n d = ctx.getImageData(0, 0, 2, 1);\n\n if (d.data[0] === 12 && d.data[1] === 23 && d.data[2] === 34 && d.data[3] === 255 && d.data[4] === 45 && d.data[5] === 56 && d.data[6] === 67 && d.data[7] === 255) {\n usable = true;\n }\n } catch (err) {}\n\n return usable;\n}; // Check if createImageBitmap(img, sx, sy, sw, sh) signature works correctly\n// with JPEG images oriented with Exif;\n// https://bugs.chromium.org/p/chromium/issues/detail?id=1220671\n// TODO: remove after it's fixed in chrome for at least 2 releases\n\n\nmodule.exports.cib_can_use_region = function cib_can_use_region() {\n return new Promise(function (resolve) {\n if (typeof createImageBitmap === 'undefined') {\n resolve(false);\n return;\n }\n\n var image = new Image();\n image.src = 'data:image/jpeg;base64,' + '/9j/4QBiRXhpZgAATU0AKgAAAAgABQESAAMAAAABAAYAAAEaAAUAAAABAAAASgEbAAUAA' + 'AABAAAAUgEoAAMAAAABAAIAAAITAAMAAAABAAEAAAAAAAAAAABIAAAAAQAAAEgAAAAB/9' + 'sAQwAEAwMEAwMEBAMEBQQEBQYKBwYGBgYNCQoICg8NEBAPDQ8OERMYFBESFxIODxUcFRc' + 'ZGRsbGxAUHR8dGh8YGhsa/9sAQwEEBQUGBQYMBwcMGhEPERoaGhoaGhoaGhoaGhoaGhoa' + 'GhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoa/8IAEQgAAQACAwERAAIRAQMRA' + 'f/EABQAAQAAAAAAAAAAAAAAAAAAAAf/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAA' + 'IQAxAAAAF/P//EABQQAQAAAAAAAAAAAAAAAAAAAAD/2gAIAQEAAQUCf//EABQRAQAAAAA' + 'AAAAAAAAAAAAAAAD/2gAIAQMBAT8Bf//EABQRAQAAAAAAAAAAAAAAAAAAAAD/2gAIAQIB' + 'AT8Bf//EABQQAQAAAAAAAAAAAAAAAAAAAAD/2gAIAQEABj8Cf//EABQQAQAAAAAAAAAAA' + 'AAAAAAAAAD/2gAIAQEAAT8hf//aAAwDAQACAAMAAAAQH//EABQRAQAAAAAAAAAAAAAAAA' + 'AAAAD/2gAIAQMBAT8Qf//EABQRAQAAAAAAAAAAAAAAAAAAAAD/2gAIAQIBAT8Qf//EABQ' + 'QAQAAAAAAAAAAAAAAAAAAAAD/2gAIAQEAAT8Qf//Z';\n\n image.onload = function () {\n createImageBitmap(image, 0, 0, image.width, image.height).then(function (bitmap) {\n if (bitmap.width === image.width && bitmap.height === image.height) {\n resolve(true);\n } else {\n resolve(false);\n }\n }, function () {\n return resolve(false);\n });\n };\n\n image.onerror = function () {\n return resolve(false);\n };\n });\n};\n\n},{}],17:[function(_dereq_,module,exports){\n\nmodule.exports = function () {\n var MathLib = _dereq_('./mathlib');\n\n var mathLib;\n /* eslint-disable no-undef */\n\n onmessage = function onmessage(ev) {\n var tileOpts = ev.data.opts;\n var returnBitmap = false;\n\n if (!tileOpts.src && tileOpts.srcBitmap) {\n var canvas = new OffscreenCanvas(tileOpts.width, tileOpts.height);\n var ctx = canvas.getContext('2d', {\n alpha: Boolean(tileOpts.alpha)\n });\n ctx.drawImage(tileOpts.srcBitmap, 0, 0);\n tileOpts.src = ctx.getImageData(0, 0, tileOpts.width, tileOpts.height).data;\n canvas.width = canvas.height = 0;\n canvas = null;\n tileOpts.srcBitmap.close();\n tileOpts.srcBitmap = null;\n returnBitmap = true;\n }\n\n if (!mathLib) mathLib = new MathLib(ev.data.features); // Use multimath's sync auto-init. Avoid Promise use in old browsers,\n // because polyfills are not propagated to webworker.\n\n var data = mathLib.resizeAndUnsharp(tileOpts);\n\n if (returnBitmap) {\n var toImageData = new ImageData(new Uint8ClampedArray(data), tileOpts.toWidth, tileOpts.toHeight);\n\n var _canvas = new OffscreenCanvas(tileOpts.toWidth, tileOpts.toHeight);\n\n var _ctx = _canvas.getContext('2d', {\n alpha: Boolean(tileOpts.alpha)\n });\n\n _ctx.putImageData(toImageData, 0, 0);\n\n createImageBitmap(_canvas).then(function (bitmap) {\n postMessage({\n bitmap: bitmap\n }, [bitmap]);\n });\n } else {\n postMessage({\n data: data\n }, [data.buffer]);\n }\n };\n};\n\n},{\"./mathlib\":1}],18:[function(_dereq_,module,exports){\n// Calculate Gaussian blur of an image using IIR filter\n// The method is taken from Intel's white paper and code example attached to it:\n// https://software.intel.com/en-us/articles/iir-gaussian-blur-filter\n// -implementation-using-intel-advanced-vector-extensions\n\nvar a0, a1, a2, a3, b1, b2, left_corner, right_corner;\n\nfunction gaussCoef(sigma) {\n if (sigma < 0.5) {\n sigma = 0.5;\n }\n\n var a = Math.exp(0.726 * 0.726) / sigma,\n g1 = Math.exp(-a),\n g2 = Math.exp(-2 * a),\n k = (1 - g1) * (1 - g1) / (1 + 2 * a * g1 - g2);\n\n a0 = k;\n a1 = k * (a - 1) * g1;\n a2 = k * (a + 1) * g1;\n a3 = -k * g2;\n b1 = 2 * g1;\n b2 = -g2;\n left_corner = (a0 + a1) / (1 - b1 - b2);\n right_corner = (a2 + a3) / (1 - b1 - b2);\n\n // Attempt to force type to FP32.\n return new Float32Array([ a0, a1, a2, a3, b1, b2, left_corner, right_corner ]);\n}\n\nfunction convolveMono16(src, out, line, coeff, width, height) {\n // takes src image and writes the blurred and transposed result into out\n\n var prev_src, curr_src, curr_out, prev_out, prev_prev_out;\n var src_index, out_index, line_index;\n var i, j;\n var coeff_a0, coeff_a1, coeff_b1, coeff_b2;\n\n for (i = 0; i < height; i++) {\n src_index = i * width;\n out_index = i;\n line_index = 0;\n\n // left to right\n prev_src = src[src_index];\n prev_prev_out = prev_src * coeff[6];\n prev_out = prev_prev_out;\n\n coeff_a0 = coeff[0];\n coeff_a1 = coeff[1];\n coeff_b1 = coeff[4];\n coeff_b2 = coeff[5];\n\n for (j = 0; j < width; j++) {\n curr_src = src[src_index];\n\n curr_out = curr_src * coeff_a0 +\n prev_src * coeff_a1 +\n prev_out * coeff_b1 +\n prev_prev_out * coeff_b2;\n\n prev_prev_out = prev_out;\n prev_out = curr_out;\n prev_src = curr_src;\n\n line[line_index] = prev_out;\n line_index++;\n src_index++;\n }\n\n src_index--;\n line_index--;\n out_index += height * (width - 1);\n\n // right to left\n prev_src = src[src_index];\n prev_prev_out = prev_src * coeff[7];\n prev_out = prev_prev_out;\n curr_src = prev_src;\n\n coeff_a0 = coeff[2];\n coeff_a1 = coeff[3];\n\n for (j = width - 1; j >= 0; j--) {\n curr_out = curr_src * coeff_a0 +\n prev_src * coeff_a1 +\n prev_out * coeff_b1 +\n prev_prev_out * coeff_b2;\n\n prev_prev_out = prev_out;\n prev_out = curr_out;\n\n prev_src = curr_src;\n curr_src = src[src_index];\n\n out[out_index] = line[line_index] + prev_out;\n\n src_index--;\n line_index--;\n out_index -= height;\n }\n }\n}\n\n\nfunction blurMono16(src, width, height, radius) {\n // Quick exit on zero radius\n if (!radius) { return; }\n\n var out = new Uint16Array(src.length),\n tmp_line = new Float32Array(Math.max(width, height));\n\n var coeff = gaussCoef(radius);\n\n convolveMono16(src, out, tmp_line, coeff, width, height);\n convolveMono16(out, src, tmp_line, coeff, height, width);\n}\n\nmodule.exports = blurMono16;\n\n},{}],19:[function(_dereq_,module,exports){\nif (typeof Object.create === 'function') {\n // implementation from standard node.js 'util' module\n module.exports = function inherits(ctor, superCtor) {\n if (superCtor) {\n ctor.super_ = superCtor;\n ctor.prototype = Object.create(superCtor.prototype, {\n constructor: {\n value: ctor,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n }\n };\n} else {\n // old school shim for old browsers\n module.exports = function inherits(ctor, superCtor) {\n if (superCtor) {\n ctor.super_ = superCtor;\n var TempCtor = function () {};\n TempCtor.prototype = superCtor.prototype;\n ctor.prototype = new TempCtor();\n ctor.prototype.constructor = ctor;\n }\n };\n}\n\n},{}],20:[function(_dereq_,module,exports){\n\n\nvar assign = _dereq_('object-assign');\nvar base64decode = _dereq_('./lib/base64decode');\nvar hasWebAssembly = _dereq_('./lib/wa_detect');\n\n\nvar DEFAULT_OPTIONS = {\n js: true,\n wasm: true\n};\n\n\nfunction MultiMath(options) {\n if (!(this instanceof MultiMath)) return new MultiMath(options);\n\n var opts = assign({}, DEFAULT_OPTIONS, options || {});\n\n this.options = opts;\n\n this.__cache = {};\n\n this.__init_promise = null;\n this.__modules = opts.modules || {};\n this.__memory = null;\n this.__wasm = {};\n\n this.__isLE = ((new Uint32Array((new Uint8Array([ 1, 0, 0, 0 ])).buffer))[0] === 1);\n\n if (!this.options.js && !this.options.wasm) {\n throw new Error('mathlib: at least \"js\" or \"wasm\" should be enabled');\n }\n}\n\n\nMultiMath.prototype.has_wasm = hasWebAssembly;\n\n\nMultiMath.prototype.use = function (module) {\n this.__modules[module.name] = module;\n\n // Pin the best possible implementation\n if (this.options.wasm && this.has_wasm() && module.wasm_fn) {\n this[module.name] = module.wasm_fn;\n } else {\n this[module.name] = module.fn;\n }\n\n return this;\n};\n\n\nMultiMath.prototype.init = function () {\n if (this.__init_promise) return this.__init_promise;\n\n if (!this.options.js && this.options.wasm && !this.has_wasm()) {\n return Promise.reject(new Error('mathlib: only \"wasm\" was enabled, but it\\'s not supported'));\n }\n\n var self = this;\n\n this.__init_promise = Promise.all(Object.keys(self.__modules).map(function (name) {\n var module = self.__modules[name];\n\n if (!self.options.wasm || !self.has_wasm() || !module.wasm_fn) return null;\n\n // If already compiled - exit\n if (self.__wasm[name]) return null;\n\n // Compile wasm source\n return WebAssembly.compile(self.__base64decode(module.wasm_src))\n .then(function (m) { self.__wasm[name] = m; });\n }))\n .then(function () { return self; });\n\n return this.__init_promise;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////\n// Methods below are for internal use from plugins\n\n\n// Simple decode base64 to typed array. Useful to load embedded webassembly\n// code. You probably don't need to call this method directly.\n//\nMultiMath.prototype.__base64decode = base64decode;\n\n\n// Increase current memory to include specified number of bytes. Do nothing if\n// size is already ok. You probably don't need to call this method directly,\n// because it will be invoked from `.__instance()`.\n//\nMultiMath.prototype.__reallocate = function mem_grow_to(bytes) {\n if (!this.__memory) {\n this.__memory = new WebAssembly.Memory({\n initial: Math.ceil(bytes / (64 * 1024))\n });\n return this.__memory;\n }\n\n var mem_size = this.__memory.buffer.byteLength;\n\n if (mem_size < bytes) {\n this.__memory.grow(Math.ceil((bytes - mem_size) / (64 * 1024)));\n }\n\n return this.__memory;\n};\n\n\n// Returns instantinated webassembly item by name, with specified memory size\n// and environment.\n// - use cache if available\n// - do sync module init, if async init was not called earlier\n// - allocate memory if not enougth\n// - can export functions to webassembly via \"env_extra\",\n// for example, { exp: Math.exp }\n//\nMultiMath.prototype.__instance = function instance(name, memsize, env_extra) {\n if (memsize) this.__reallocate(memsize);\n\n // If .init() was not called, do sync compile\n if (!this.__wasm[name]) {\n var module = this.__modules[name];\n this.__wasm[name] = new WebAssembly.Module(this.__base64decode(module.wasm_src));\n }\n\n if (!this.__cache[name]) {\n var env_base = {\n memoryBase: 0,\n memory: this.__memory,\n tableBase: 0,\n table: new WebAssembly.Table({ initial: 0, element: 'anyfunc' })\n };\n\n this.__cache[name] = new WebAssembly.Instance(this.__wasm[name], {\n env: assign(env_base, env_extra || {})\n });\n }\n\n return this.__cache[name];\n};\n\n\n// Helper to calculate memory aligh for pointers. Webassembly does not require\n// this, but you may wish to experiment. Default base = 8;\n//\nMultiMath.prototype.__align = function align(number, base) {\n base = base || 8;\n var reminder = number % base;\n return number + (reminder ? base - reminder : 0);\n};\n\n\nmodule.exports = MultiMath;\n\n},{\"./lib/base64decode\":21,\"./lib/wa_detect\":22,\"object-assign\":23}],21:[function(_dereq_,module,exports){\n\n\nvar BASE64_MAP = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n\n\nmodule.exports = function base64decode(str) {\n var input = str.replace(/[\\r\\n=]/g, ''), // remove CR/LF & padding to simplify scan\n max = input.length;\n\n var out = new Uint8Array((max * 3) >> 2);\n\n // Collect by 6*4 bits (3 bytes)\n\n var bits = 0;\n var ptr = 0;\n\n for (var idx = 0; idx < max; idx++) {\n if ((idx % 4 === 0) && idx) {\n out[ptr++] = (bits >> 16) & 0xFF;\n out[ptr++] = (bits >> 8) & 0xFF;\n out[ptr++] = bits & 0xFF;\n }\n\n bits = (bits << 6) | BASE64_MAP.indexOf(input.charAt(idx));\n }\n\n // Dump tail\n\n var tailbits = (max % 4) * 6;\n\n if (tailbits === 0) {\n out[ptr++] = (bits >> 16) & 0xFF;\n out[ptr++] = (bits >> 8) & 0xFF;\n out[ptr++] = bits & 0xFF;\n } else if (tailbits === 18) {\n out[ptr++] = (bits >> 10) & 0xFF;\n out[ptr++] = (bits >> 2) & 0xFF;\n } else if (tailbits === 12) {\n out[ptr++] = (bits >> 4) & 0xFF;\n }\n\n return out;\n};\n\n},{}],22:[function(_dereq_,module,exports){\n\n\nvar wa;\n\n\nmodule.exports = function hasWebAssembly() {\n // use cache if called before;\n if (typeof wa !== 'undefined') return wa;\n\n wa = false;\n\n if (typeof WebAssembly === 'undefined') return wa;\n\n // If WebAssenbly is disabled, code can throw on compile\n try {\n // https://github.com/brion/min-wasm-fail/blob/master/min-wasm-fail.in.js\n // Additional check that WA internals are correct\n\n /* eslint-disable comma-spacing, max-len */\n var bin = new Uint8Array([ 0,97,115,109,1,0,0,0,1,6,1,96,1,127,1,127,3,2,1,0,5,3,1,0,1,7,8,1,4,116,101,115,116,0,0,10,16,1,14,0,32,0,65,1,54,2,0,32,0,40,2,0,11 ]);\n var module = new WebAssembly.Module(bin);\n var instance = new WebAssembly.Instance(module, {});\n\n // test storing to and loading from a non-zero location via a parameter.\n // Safari on iOS 11.2.5 returns 0 unexpectedly at non-zero locations\n if (instance.exports.test(4) !== 0) wa = true;\n\n return wa;\n } catch (__) {}\n\n return wa;\n};\n\n},{}],23:[function(_dereq_,module,exports){\n/* eslint-disable no-unused-vars */\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n\tif (val === null || val === undefined) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nfunction shouldUseNative() {\n\ttry {\n\t\tif (!Object.assign) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Detect buggy property enumeration order in older V8 versions.\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\t\tvar test1 = new String('abc'); // eslint-disable-line no-new-wrappers\n\t\ttest1[5] = 'de';\n\t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test2 = {};\n\t\tfor (var i = 0; i < 10; i++) {\n\t\t\ttest2['_' + String.fromCharCode(i)] = i;\n\t\t}\n\t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n\t\t\treturn test2[n];\n\t\t});\n\t\tif (order2.join('') !== '0123456789') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test3 = {};\n\t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n\t\t\ttest3[letter] = letter;\n\t\t});\n\t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n\t\t\t\t'abcdefghijklmnopqrst') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (err) {\n\t\t// We don't expect any of the above to throw, but better to be safe.\n\t\treturn false;\n\t}\n}\n\nmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\n\tvar from;\n\tvar to = toObject(target);\n\tvar symbols;\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = Object(arguments[s]);\n\n\t\tfor (var key in from) {\n\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\tto[key] = from[key];\n\t\t\t}\n\t\t}\n\n\t\tif (getOwnPropertySymbols) {\n\t\t\tsymbols = getOwnPropertySymbols(from);\n\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to;\n};\n\n},{}],24:[function(_dereq_,module,exports){\nvar bundleFn = arguments[3];\nvar sources = arguments[4];\nvar cache = arguments[5];\n\nvar stringify = JSON.stringify;\n\nmodule.exports = function (fn, options) {\n var wkey;\n var cacheKeys = Object.keys(cache);\n\n for (var i = 0, l = cacheKeys.length; i < l; i++) {\n var key = cacheKeys[i];\n var exp = cache[key].exports;\n // Using babel as a transpiler to use esmodule, the export will always\n // be an object with the default export as a property of it. To ensure\n // the existing api and babel esmodule exports are both supported we\n // check for both\n if (exp === fn || exp && exp.default === fn) {\n wkey = key;\n break;\n }\n }\n\n if (!wkey) {\n wkey = Math.floor(Math.pow(16, 8) * Math.random()).toString(16);\n var wcache = {};\n for (var i = 0, l = cacheKeys.length; i < l; i++) {\n var key = cacheKeys[i];\n wcache[key] = key;\n }\n sources[wkey] = [\n 'function(require,module,exports){' + fn + '(self); }',\n wcache\n ];\n }\n var skey = Math.floor(Math.pow(16, 8) * Math.random()).toString(16);\n\n var scache = {}; scache[wkey] = wkey;\n sources[skey] = [\n 'function(require,module,exports){' +\n // try to call default if defined to also support babel esmodule exports\n 'var f = require(' + stringify(wkey) + ');' +\n '(f.default ? f.default : f)(self);' +\n '}',\n scache\n ];\n\n var workerSources = {};\n resolveSources(skey);\n\n function resolveSources(key) {\n workerSources[key] = true;\n\n for (var depPath in sources[key][1]) {\n var depKey = sources[key][1][depPath];\n if (!workerSources[depKey]) {\n resolveSources(depKey);\n }\n }\n }\n\n var src = '(' + bundleFn + ')({'\n + Object.keys(workerSources).map(function (key) {\n return stringify(key) + ':['\n + sources[key][0]\n + ',' + stringify(sources[key][1]) + ']'\n ;\n }).join(',')\n + '},{},[' + stringify(skey) + '])'\n ;\n\n var URL = window.URL || window.webkitURL || window.mozURL || window.msURL;\n\n var blob = new Blob([src], { type: 'text/javascript' });\n if (options && options.bare) { return blob; }\n var workerUrl = URL.createObjectURL(blob);\n var worker = new Worker(workerUrl);\n worker.objectURL = workerUrl;\n return worker;\n};\n\n},{}],\"/index.js\":[function(_dereq_,module,exports){\n\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== \"undefined\" && arr[Symbol.iterator] || arr[\"@@iterator\"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nvar assign = _dereq_('object-assign');\n\nvar webworkify = _dereq_('webworkify');\n\nvar MathLib = _dereq_('./lib/mathlib');\n\nvar Pool = _dereq_('./lib/pool');\n\nvar utils = _dereq_('./lib/utils');\n\nvar worker = _dereq_('./lib/worker');\n\nvar createStages = _dereq_('./lib/stepper');\n\nvar createRegions = _dereq_('./lib/tiler'); // Deduplicate pools & limiters with the same configs\n// when user creates multiple pica instances.\n\n\nvar singletones = {};\nvar NEED_SAFARI_FIX = false;\n\ntry {\n if (typeof navigator !== 'undefined' && navigator.userAgent) {\n NEED_SAFARI_FIX = navigator.userAgent.indexOf('Safari') >= 0;\n }\n} catch (e) {}\n\nvar concurrency = 1;\n\nif (typeof navigator !== 'undefined') {\n concurrency = Math.min(navigator.hardwareConcurrency || 1, 4);\n}\n\nvar DEFAULT_PICA_OPTS = {\n tile: 1024,\n concurrency: concurrency,\n features: ['js', 'wasm', 'ww'],\n idle: 2000,\n createCanvas: function createCanvas(width, height) {\n var tmpCanvas = document.createElement('canvas');\n tmpCanvas.width = width;\n tmpCanvas.height = height;\n return tmpCanvas;\n }\n};\nvar DEFAULT_RESIZE_OPTS = {\n quality: 3,\n alpha: false,\n unsharpAmount: 0,\n unsharpRadius: 0.0,\n unsharpThreshold: 0\n};\nvar CAN_NEW_IMAGE_DATA = false;\nvar CAN_CREATE_IMAGE_BITMAP = false;\nvar CAN_USE_CANVAS_GET_IMAGE_DATA = false;\nvar CAN_USE_OFFSCREEN_CANVAS = false;\nvar CAN_USE_CIB_REGION_FOR_IMAGE = false;\n\nfunction workerFabric() {\n return {\n value: webworkify(worker),\n destroy: function destroy() {\n this.value.terminate();\n\n if (typeof window !== 'undefined') {\n var url = window.URL || window.webkitURL || window.mozURL || window.msURL;\n\n if (url && url.revokeObjectURL && this.value.objectURL) {\n url.revokeObjectURL(this.value.objectURL);\n }\n }\n }\n };\n} ////////////////////////////////////////////////////////////////////////////////\n// API methods\n\n\nfunction Pica(options) {\n if (!(this instanceof Pica)) return new Pica(options);\n this.options = assign({}, DEFAULT_PICA_OPTS, options || {});\n var limiter_key = \"lk_\".concat(this.options.concurrency); // Share limiters to avoid multiple parallel workers when user creates\n // multiple pica instances.\n\n this.__limit = singletones[limiter_key] || utils.limiter(this.options.concurrency);\n if (!singletones[limiter_key]) singletones[limiter_key] = this.__limit; // List of supported features, according to options & browser/node.js\n\n this.features = {\n js: false,\n // pure JS implementation, can be disabled for testing\n wasm: false,\n // webassembly implementation for heavy functions\n cib: false,\n // resize via createImageBitmap (only FF at this moment)\n ww: false // webworkers\n\n };\n this.__workersPool = null; // Store requested features for webworkers\n\n this.__requested_features = [];\n this.__mathlib = null;\n}\n\nPica.prototype.init = function () {\n var _this = this;\n\n if (this.__initPromise) return this.__initPromise; // Test if we can create ImageData without canvas and memory copy\n\n if (typeof ImageData !== 'undefined' && typeof Uint8ClampedArray !== 'undefined') {\n try {\n /* eslint-disable no-new */\n new ImageData(new Uint8ClampedArray(400), 10, 10);\n CAN_NEW_IMAGE_DATA = true;\n } catch (__) {}\n } // ImageBitmap can be effective in 2 places:\n //\n // 1. Threaded jpeg unpack (basic)\n // 2. Built-in resize (blocked due problem in chrome, see issue #89)\n //\n // For basic use we also need ImageBitmap wo support .close() method,\n // see https://developer.mozilla.org/ru/docs/Web/API/ImageBitmap\n\n\n if (typeof ImageBitmap !== 'undefined') {\n if (ImageBitmap.prototype && ImageBitmap.prototype.close) {\n CAN_CREATE_IMAGE_BITMAP = true;\n } else {\n this.debug('ImageBitmap does not support .close(), disabled');\n }\n }\n\n var features = this.options.features.slice();\n\n if (features.indexOf('all') >= 0) {\n features = ['cib', 'wasm', 'js', 'ww'];\n }\n\n this.__requested_features = features;\n this.__mathlib = new MathLib(features); // Check WebWorker support if requested\n\n if (features.indexOf('ww') >= 0) {\n if (typeof window !== 'undefined' && 'Worker' in window) {\n // IE <= 11 don't allow to create webworkers from string. We should check it.\n // https://connect.microsoft.com/IE/feedback/details/801810/web-workers-from-blob-urls-in-ie-10-and-11\n try {\n var wkr = _dereq_('webworkify')(function () {});\n\n wkr.terminate();\n this.features.ww = true; // pool uniqueness depends on pool config + webworker config\n\n var wpool_key = \"wp_\".concat(JSON.stringify(this.options));\n\n if (singletones[wpool_key]) {\n this.__workersPool = singletones[wpool_key];\n } else {\n this.__workersPool = new Pool(workerFabric, this.options.idle);\n singletones[wpool_key] = this.__workersPool;\n }\n } catch (__) {}\n }\n }\n\n var initMath = this.__mathlib.init().then(function (mathlib) {\n // Copy detected features\n assign(_this.features, mathlib.features);\n });\n\n var checkCibResize;\n\n if (!CAN_CREATE_IMAGE_BITMAP) {\n checkCibResize = Promise.resolve(false);\n } else {\n checkCibResize = utils.cib_support(this.options.createCanvas).then(function (status) {\n if (_this.features.cib && features.indexOf('cib') < 0) {\n _this.debug('createImageBitmap() resize supported, but disabled by config');\n\n return;\n }\n\n if (features.indexOf('cib') >= 0) _this.features.cib = status;\n });\n }\n\n CAN_USE_CANVAS_GET_IMAGE_DATA = utils.can_use_canvas(this.options.createCanvas);\n var checkOffscreenCanvas;\n\n if (CAN_CREATE_IMAGE_BITMAP && CAN_NEW_IMAGE_DATA && features.indexOf('ww') !== -1) {\n checkOffscreenCanvas = utils.worker_offscreen_canvas_support();\n } else {\n checkOffscreenCanvas = Promise.resolve(false);\n }\n\n checkOffscreenCanvas = checkOffscreenCanvas.then(function (result) {\n CAN_USE_OFFSCREEN_CANVAS = result;\n }); // we use createImageBitmap to crop image data and pass it to workers,\n // so need to check whether function works correctly;\n // https://bugs.chromium.org/p/chromium/issues/detail?id=1220671\n\n var checkCibRegion = utils.cib_can_use_region().then(function (result) {\n CAN_USE_CIB_REGION_FOR_IMAGE = result;\n }); // Init math lib. That's async because can load some\n\n this.__initPromise = Promise.all([initMath, checkCibResize, checkOffscreenCanvas, checkCibRegion]).then(function () {\n return _this;\n });\n return this.__initPromise;\n}; // Call resizer in webworker or locally, depending on config\n\n\nPica.prototype.__invokeResize = function (tileOpts, opts) {\n var _this2 = this;\n\n // Share cache between calls:\n //\n // - wasm instance\n // - wasm memory object\n //\n opts.__mathCache = opts.__mathCache || {};\n return Promise.resolve().then(function () {\n if (!_this2.features.ww) {\n // not possible to have ImageBitmap here if user disabled WW\n return {\n data: _this2.__mathlib.resizeAndUnsharp(tileOpts, opts.__mathCache)\n };\n }\n\n return new Promise(function (resolve, reject) {\n var w = _this2.__workersPool.acquire();\n\n if (opts.cancelToken) opts.cancelToken[\"catch\"](function (err) {\n return reject(err);\n });\n\n w.value.onmessage = function (ev) {\n w.release();\n if (ev.data.err) reject(ev.data.err);else resolve(ev.data);\n };\n\n var transfer = [];\n if (tileOpts.src) transfer.push(tileOpts.src.buffer);\n if (tileOpts.srcBitmap) transfer.push(tileOpts.srcBitmap);\n w.value.postMessage({\n opts: tileOpts,\n features: _this2.__requested_features,\n preload: {\n wasm_nodule: _this2.__mathlib.__\n }\n }, transfer);\n });\n });\n}; // this function can return promise if createImageBitmap is used\n\n\nPica.prototype.__extractTileData = function (tile, from, opts, stageEnv, extractTo) {\n if (this.features.ww && CAN_USE_OFFSCREEN_CANVAS && ( // createImageBitmap doesn't work for images (Image, ImageBitmap) with Exif orientation in Chrome,\n // can use canvas because canvas doesn't have orientation;\n // see https://bugs.chromium.org/p/chromium/issues/detail?id=1220671\n utils.isCanvas(from) || CAN_USE_CIB_REGION_FOR_IMAGE)) {\n this.debug('Create tile for OffscreenCanvas');\n return createImageBitmap(stageEnv.srcImageBitmap || from, tile.x, tile.y, tile.width, tile.height).then(function (bitmap) {\n extractTo.srcBitmap = bitmap;\n return extractTo;\n });\n } // Extract tile RGBA buffer, depending on input type\n\n\n if (utils.isCanvas(from)) {\n if (!stageEnv.srcCtx) stageEnv.srcCtx = from.getContext('2d', {\n alpha: Boolean(opts.alpha)\n }); // If input is Canvas - extract region data directly\n\n this.debug('Get tile pixel data');\n extractTo.src = stageEnv.srcCtx.getImageData(tile.x, tile.y, tile.width, tile.height).data;\n return extractTo;\n } // If input is Image or decoded to ImageBitmap,\n // draw region to temporary canvas and extract data from it\n //\n // Note! Attempt to reuse this canvas causes significant slowdown in chrome\n //\n\n\n this.debug('Draw tile imageBitmap/image to temporary canvas');\n var tmpCanvas = this.options.createCanvas(tile.width, tile.height);\n var tmpCtx = tmpCanvas.getContext('2d', {\n alpha: Boolean(opts.alpha)\n });\n tmpCtx.globalCompositeOperation = 'copy';\n tmpCtx.drawImage(stageEnv.srcImageBitmap || from, tile.x, tile.y, tile.width, tile.height, 0, 0, tile.width, tile.height);\n this.debug('Get tile pixel data');\n extractTo.src = tmpCtx.getImageData(0, 0, tile.width, tile.height).data; // Safari 12 workaround\n // https://github.com/nodeca/pica/issues/199\n\n tmpCanvas.width = tmpCanvas.height = 0;\n return extractTo;\n};\n\nPica.prototype.__landTileData = function (tile, result, stageEnv) {\n var toImageData;\n this.debug('Convert raw rgba tile result to ImageData');\n\n if (result.bitmap) {\n stageEnv.toCtx.drawImage(result.bitmap, tile.toX, tile.toY);\n return null;\n }\n\n if (CAN_NEW_IMAGE_DATA) {\n // this branch is for modern browsers\n // If `new ImageData()` & Uint8ClampedArray suported\n toImageData = new ImageData(new Uint8ClampedArray(result.data), tile.toWidth, tile.toHeight);\n } else {\n // fallback for `node-canvas` and old browsers\n // (IE11 has ImageData but does not support `new ImageData()`)\n toImageData = stageEnv.toCtx.createImageData(tile.toWidth, tile.toHeight);\n\n if (toImageData.data.set) {\n toImageData.data.set(result.data);\n } else {\n // IE9 don't have `.set()`\n for (var i = toImageData.data.length - 1; i >= 0; i--) {\n toImageData.data[i] = result.data[i];\n }\n }\n }\n\n this.debug('Draw tile');\n\n if (NEED_SAFARI_FIX) {\n // Safari draws thin white stripes between tiles without this fix\n stageEnv.toCtx.putImageData(toImageData, tile.toX, tile.toY, tile.toInnerX - tile.toX, tile.toInnerY - tile.toY, tile.toInnerWidth + 1e-5, tile.toInnerHeight + 1e-5);\n } else {\n stageEnv.toCtx.putImageData(toImageData, tile.toX, tile.toY, tile.toInnerX - tile.toX, tile.toInnerY - tile.toY, tile.toInnerWidth, tile.toInnerHeight);\n }\n\n return null;\n};\n\nPica.prototype.__tileAndResize = function (from, to, opts) {\n var _this3 = this;\n\n var stageEnv = {\n srcCtx: null,\n srcImageBitmap: null,\n isImageBitmapReused: false,\n toCtx: null\n };\n\n var processTile = function processTile(tile) {\n return _this3.__limit(function () {\n if (opts.canceled) return opts.cancelToken;\n var tileOpts = {\n width: tile.width,\n height: tile.height,\n toWidth: tile.toWidth,\n toHeight: tile.toHeight,\n scaleX: tile.scaleX,\n scaleY: tile.scaleY,\n offsetX: tile.offsetX,\n offsetY: tile.offsetY,\n quality: opts.quality,\n alpha: opts.alpha,\n unsharpAmount: opts.unsharpAmount,\n unsharpRadius: opts.unsharpRadius,\n unsharpThreshold: opts.unsharpThreshold\n };\n\n _this3.debug('Invoke resize math');\n\n return Promise.resolve(tileOpts).then(function (tileOpts) {\n return _this3.__extractTileData(tile, from, opts, stageEnv, tileOpts);\n }).then(function (tileOpts) {\n _this3.debug('Invoke resize math');\n\n return _this3.__invokeResize(tileOpts, opts);\n }).then(function (result) {\n if (opts.canceled) return opts.cancelToken;\n stageEnv.srcImageData = null;\n return _this3.__landTileData(tile, result, stageEnv);\n });\n });\n }; // Need to normalize data source first. It can be canvas or image.\n // If image - try to decode in background if possible\n\n\n return Promise.resolve().then(function () {\n stageEnv.toCtx = to.getContext('2d', {\n alpha: Boolean(opts.alpha)\n });\n if (utils.isCanvas(from)) return null;\n\n if (utils.isImageBitmap(from)) {\n stageEnv.srcImageBitmap = from;\n stageEnv.isImageBitmapReused = true;\n return null;\n }\n\n if (utils.isImage(from)) {\n // try do decode image in background for faster next operations;\n // if we're using offscreen canvas, cib is called per tile, so not needed here\n if (!CAN_CREATE_IMAGE_BITMAP) return null;\n\n _this3.debug('Decode image via createImageBitmap');\n\n return createImageBitmap(from).then(function (imageBitmap) {\n stageEnv.srcImageBitmap = imageBitmap;\n }) // Suppress error to use fallback, if method fails\n // https://github.com/nodeca/pica/issues/190\n\n /* eslint-disable no-unused-vars */\n [\"catch\"](function (e) {\n return null;\n });\n }\n\n throw new Error('Pica: \".from\" should be Image, Canvas or ImageBitmap');\n }).then(function () {\n if (opts.canceled) return opts.cancelToken;\n\n _this3.debug('Calculate tiles'); //\n // Here we are with \"normalized\" source,\n // follow to tiling\n //\n\n\n var regions = createRegions({\n width: opts.width,\n height: opts.height,\n srcTileSize: _this3.options.tile,\n toWidth: opts.toWidth,\n toHeight: opts.toHeight,\n destTileBorder: opts.__destTileBorder\n });\n var jobs = regions.map(function (tile) {\n return processTile(tile);\n });\n\n function cleanup(stageEnv) {\n if (stageEnv.srcImageBitmap) {\n if (!stageEnv.isImageBitmapReused) stageEnv.srcImageBitmap.close();\n stageEnv.srcImageBitmap = null;\n }\n }\n\n _this3.debug('Process tiles');\n\n return Promise.all(jobs).then(function () {\n _this3.debug('Finished!');\n\n cleanup(stageEnv);\n return to;\n }, function (err) {\n cleanup(stageEnv);\n throw err;\n });\n });\n};\n\nPica.prototype.__processStages = function (stages, from, to, opts) {\n var _this4 = this;\n\n if (opts.canceled) return opts.cancelToken;\n\n var _stages$shift = stages.shift(),\n _stages$shift2 = _slicedToArray(_stages$shift, 2),\n toWidth = _stages$shift2[0],\n toHeight = _stages$shift2[1];\n\n var isLastStage = stages.length === 0;\n opts = assign({}, opts, {\n toWidth: toWidth,\n toHeight: toHeight,\n // only use user-defined quality for the last stage,\n // use simpler (Hamming) filter for the first stages where\n // scale factor is large enough (more than 2-3)\n quality: isLastStage ? opts.quality : Math.min(1, opts.quality)\n });\n var tmpCanvas;\n\n if (!isLastStage) {\n // create temporary canvas\n tmpCanvas = this.options.createCanvas(toWidth, toHeight);\n }\n\n return this.__tileAndResize(from, isLastStage ? to : tmpCanvas, opts).then(function () {\n if (isLastStage) return to;\n opts.width = toWidth;\n opts.height = toHeight;\n return _this4.__processStages(stages, tmpCanvas, to, opts);\n }).then(function (res) {\n if (tmpCanvas) {\n // Safari 12 workaround\n // https://github.com/nodeca/pica/issues/199\n tmpCanvas.width = tmpCanvas.height = 0;\n }\n\n return res;\n });\n};\n\nPica.prototype.__resizeViaCreateImageBitmap = function (from, to, opts) {\n var _this5 = this;\n\n var toCtx = to.getContext('2d', {\n alpha: Boolean(opts.alpha)\n });\n this.debug('Resize via createImageBitmap()');\n return createImageBitmap(from, {\n resizeWidth: opts.toWidth,\n resizeHeight: opts.toHeight,\n resizeQuality: utils.cib_quality_name(opts.quality)\n }).then(function (imageBitmap) {\n if (opts.canceled) return opts.cancelToken; // if no unsharp - draw directly to output canvas\n\n if (!opts.unsharpAmount) {\n toCtx.drawImage(imageBitmap, 0, 0);\n imageBitmap.close();\n toCtx = null;\n\n _this5.debug('Finished!');\n\n return to;\n }\n\n _this5.debug('Unsharp result');\n\n var tmpCanvas = _this5.options.createCanvas(opts.toWidth, opts.toHeight);\n\n var tmpCtx = tmpCanvas.getContext('2d', {\n alpha: Boolean(opts.alpha)\n });\n tmpCtx.drawImage(imageBitmap, 0, 0);\n imageBitmap.close();\n var iData = tmpCtx.getImageData(0, 0, opts.toWidth, opts.toHeight);\n\n _this5.__mathlib.unsharp_mask(iData.data, opts.toWidth, opts.toHeight, opts.unsharpAmount, opts.unsharpRadius, opts.unsharpThreshold);\n\n toCtx.putImageData(iData, 0, 0); // Safari 12 workaround\n // https://github.com/nodeca/pica/issues/199\n\n tmpCanvas.width = tmpCanvas.height = 0;\n iData = tmpCtx = tmpCanvas = toCtx = null;\n\n _this5.debug('Finished!');\n\n return to;\n });\n};\n\nPica.prototype.resize = function (from, to, options) {\n var _this6 = this;\n\n this.debug('Start resize...');\n var opts = assign({}, DEFAULT_RESIZE_OPTS);\n\n if (!isNaN(options)) {\n opts = assign(opts, {\n quality: options\n });\n } else if (options) {\n opts = assign(opts, options);\n }\n\n opts.toWidth = to.width;\n opts.toHeight = to.height;\n opts.width = from.naturalWidth || from.width;\n opts.height = from.naturalHeight || from.height; // Prevent stepper from infinite loop\n\n if (to.width === 0 || to.height === 0) {\n return Promise.reject(new Error(\"Invalid output size: \".concat(to.width, \"x\").concat(to.height)));\n }\n\n if (opts.unsharpRadius > 2) opts.unsharpRadius = 2;\n opts.canceled = false;\n\n if (opts.cancelToken) {\n // Wrap cancelToken to avoid successive resolve & set flag\n opts.cancelToken = opts.cancelToken.then(function (data) {\n opts.canceled = true;\n throw data;\n }, function (err) {\n opts.canceled = true;\n throw err;\n });\n }\n\n var DEST_TILE_BORDER = 3; // Max possible filter window size\n\n opts.__destTileBorder = Math.ceil(Math.max(DEST_TILE_BORDER, 2.5 * opts.unsharpRadius | 0));\n return this.init().then(function () {\n if (opts.canceled) return opts.cancelToken; // if createImageBitmap supports resize, just do it and return\n\n if (_this6.features.cib) {\n return _this6.__resizeViaCreateImageBitmap(from, to, opts);\n }\n\n if (!CAN_USE_CANVAS_GET_IMAGE_DATA) {\n var err = new Error('Pica: cannot use getImageData on canvas, ' + \"make sure fingerprinting protection isn't enabled\");\n err.code = 'ERR_GET_IMAGE_DATA';\n throw err;\n } //\n // No easy way, let's resize manually via arrays\n //\n\n\n var stages = createStages(opts.width, opts.height, opts.toWidth, opts.toHeight, _this6.options.tile, opts.__destTileBorder);\n return _this6.__processStages(stages, from, to, opts);\n });\n}; // RGBA buffer resize\n//\n\n\nPica.prototype.resizeBuffer = function (options) {\n var _this7 = this;\n\n var opts = assign({}, DEFAULT_RESIZE_OPTS, options);\n return this.init().then(function () {\n return _this7.__mathlib.resizeAndUnsharp(opts);\n });\n};\n\nPica.prototype.toBlob = function (canvas, mimeType, quality) {\n mimeType = mimeType || 'image/png';\n return new Promise(function (resolve) {\n if (canvas.toBlob) {\n canvas.toBlob(function (blob) {\n return resolve(blob);\n }, mimeType, quality);\n return;\n }\n\n if (canvas.convertToBlob) {\n resolve(canvas.convertToBlob({\n type: mimeType,\n quality: quality\n }));\n return;\n } // Fallback for old browsers\n\n\n var asString = atob(canvas.toDataURL(mimeType, quality).split(',')[1]);\n var len = asString.length;\n var asBuffer = new Uint8Array(len);\n\n for (var i = 0; i < len; i++) {\n asBuffer[i] = asString.charCodeAt(i);\n }\n\n resolve(new Blob([asBuffer], {\n type: mimeType\n }));\n });\n};\n\nPica.prototype.debug = function () {};\n\nmodule.exports = Pica;\n\n},{\"./lib/mathlib\":1,\"./lib/pool\":13,\"./lib/stepper\":14,\"./lib/tiler\":15,\"./lib/utils\":16,\"./lib/worker\":17,\"object-assign\":23,\"webworkify\":24}]},{},[])(\"/index.js\")\n});\n});\n\nvar image_traverse = createCommonjsModule(function (module) {\n\n//////////////////////////////////////////////////////////////////////////\n// Helpers\n//\nfunction error(message, code) {\n var err = new Error(message);\n err.code = code;\n return err;\n}\n\n\n// Convert number to 0xHH string\n//\nfunction to_hex(number) {\n var n = number.toString(16).toUpperCase();\n for (var i = 2 - n.length; i > 0; i--) n = '0' + n;\n return '0x' + n;\n}\n\n\nfunction utf8_encode(str) {\n try {\n return unescape(encodeURIComponent(str));\n } catch (_) {\n return str;\n }\n}\n\n\nfunction utf8_decode(str) {\n try {\n return decodeURIComponent(escape(str));\n } catch (_) {\n return str;\n }\n}\n\n\n// Check if input is a Uint8Array\n//\nfunction is_uint8array(bin) {\n return Object.prototype.toString.call(bin) === '[object Uint8Array]';\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n// Exif parser\n//\n// Input:\n// - jpeg_bin: Uint8Array - jpeg file\n// - exif_start: Number - start of TIFF header (after Exif\\0\\0)\n// - exif_end: Number - end of Exif segment\n// - on_entry: Number - callback\n//\nfunction ExifParser(jpeg_bin, exif_start, exif_end) {\n // Uint8Array, exif without signature (which isn't included in offsets)\n this.input = jpeg_bin.subarray(exif_start, exif_end);\n\n // offset correction for `on_entry` callback\n this.start = exif_start;\n\n // Check TIFF header (includes byte alignment and first IFD offset)\n var sig = String.fromCharCode.apply(null, this.input.subarray(0, 4));\n\n if (sig !== 'II\\x2A\\0' && sig !== 'MM\\0\\x2A') {\n throw error('invalid TIFF signature', 'EBADDATA');\n }\n\n // true if motorola (big endian) byte alignment, false if intel\n this.big_endian = sig[0] === 'M';\n}\n\n\nExifParser.prototype.each = function (on_entry) {\n // allow premature exit\n this.aborted = false;\n\n var offset = this.read_uint32(4);\n\n this.ifds_to_read = [ {\n id: 0,\n offset: offset\n } ];\n\n while (this.ifds_to_read.length > 0 && !this.aborted) {\n var i = this.ifds_to_read.shift();\n if (!i.offset) continue;\n this.scan_ifd(i.id, i.offset, on_entry);\n }\n};\n\n\nExifParser.prototype.filter = function (on_entry) {\n var ifds = {};\n\n // make sure IFD0 always exists\n ifds.ifd0 = { id: 0, entries: [] };\n\n this.each(function (entry) {\n if (on_entry(entry) === false && !entry.is_subifd_link) return;\n if (entry.is_subifd_link && entry.count !== 1 && entry.format !== 4) return; // filter out bogus links\n\n if (!ifds['ifd' + entry.ifd]) {\n ifds['ifd' + entry.ifd] = { id: entry.ifd, entries: [] };\n }\n\n ifds['ifd' + entry.ifd].entries.push(entry);\n });\n\n // thumbnails are not supported just yet, so delete all information related to it\n delete ifds.ifd1;\n\n // Calculate output size\n var length = 8;\n Object.keys(ifds).forEach(function (ifd_no) {\n length += 2;\n\n ifds[ifd_no].entries.forEach(function (entry) {\n length += 12 + (entry.data_length > 4 ? Math.ceil(entry.data_length / 2) * 2 : 0);\n });\n\n length += 4;\n });\n\n this.output = new Uint8Array(length);\n this.output[0] = this.output[1] = (this.big_endian ? 'M' : 'I').charCodeAt(0);\n this.write_uint16(2, 0x2A);\n\n var offset = 8;\n var self = this;\n this.write_uint32(4, offset);\n\n Object.keys(ifds).forEach(function (ifd_no) {\n ifds[ifd_no].written_offset = offset;\n\n var ifd_start = offset;\n var ifd_end = ifd_start + 2 + ifds[ifd_no].entries.length * 12 + 4;\n offset = ifd_end;\n\n self.write_uint16(ifd_start, ifds[ifd_no].entries.length);\n\n ifds[ifd_no].entries.sort(function (a, b) {\n // IFD entries must be in order of increasing tag IDs\n return a.tag - b.tag;\n }).forEach(function (entry, idx) {\n var entry_offset = ifd_start + 2 + idx * 12;\n\n self.write_uint16(entry_offset, entry.tag);\n self.write_uint16(entry_offset + 2, entry.format);\n self.write_uint32(entry_offset + 4, entry.count);\n\n if (entry.is_subifd_link) {\n // filled in later\n if (ifds['ifd' + entry.tag]) ifds['ifd' + entry.tag].link_offset = entry_offset + 8;\n } else if (entry.data_length <= 4) {\n self.output.set(\n self.input.subarray(entry.data_offset - self.start, entry.data_offset - self.start + 4),\n entry_offset + 8\n );\n } else {\n self.write_uint32(entry_offset + 8, offset);\n self.output.set(\n self.input.subarray(entry.data_offset - self.start, entry.data_offset - self.start + entry.data_length),\n offset\n );\n offset += Math.ceil(entry.data_length / 2) * 2;\n }\n });\n\n var next_ifd = ifds['ifd' + (ifds[ifd_no].id + 1)];\n if (next_ifd) next_ifd.link_offset = ifd_end - 4;\n });\n\n Object.keys(ifds).forEach(function (ifd_no) {\n if (ifds[ifd_no].written_offset && ifds[ifd_no].link_offset) {\n self.write_uint32(ifds[ifd_no].link_offset, ifds[ifd_no].written_offset);\n }\n });\n\n if (this.output.length !== offset) throw error('internal error: incorrect buffer size allocated');\n\n return this.output;\n};\n\n\nExifParser.prototype.read_uint16 = function (offset) {\n var d = this.input;\n if (offset + 2 > d.length) throw error('unexpected EOF', 'EBADDATA');\n\n return this.big_endian ?\n d[offset] * 0x100 + d[offset + 1] :\n d[offset] + d[offset + 1] * 0x100;\n};\n\n\nExifParser.prototype.read_uint32 = function (offset) {\n var d = this.input;\n if (offset + 4 > d.length) throw error('unexpected EOF', 'EBADDATA');\n\n return this.big_endian ?\n d[offset] * 0x1000000 + d[offset + 1] * 0x10000 + d[offset + 2] * 0x100 + d[offset + 3] :\n d[offset] + d[offset + 1] * 0x100 + d[offset + 2] * 0x10000 + d[offset + 3] * 0x1000000;\n};\n\n\nExifParser.prototype.write_uint16 = function (offset, value) {\n var d = this.output;\n\n if (this.big_endian) {\n d[offset] = (value >>> 8) & 0xFF;\n d[offset + 1] = value & 0xFF;\n } else {\n d[offset] = value & 0xFF;\n d[offset + 1] = (value >>> 8) & 0xFF;\n }\n};\n\n\nExifParser.prototype.write_uint32 = function (offset, value) {\n var d = this.output;\n\n if (this.big_endian) {\n d[offset] = (value >>> 24) & 0xFF;\n d[offset + 1] = (value >>> 16) & 0xFF;\n d[offset + 2] = (value >>> 8) & 0xFF;\n d[offset + 3] = value & 0xFF;\n } else {\n d[offset] = value & 0xFF;\n d[offset + 1] = (value >>> 8) & 0xFF;\n d[offset + 2] = (value >>> 16) & 0xFF;\n d[offset + 3] = (value >>> 24) & 0xFF;\n }\n};\n\n\nExifParser.prototype.is_subifd_link = function (ifd, tag) {\n return (ifd === 0 && tag === 0x8769) || // SubIFD\n (ifd === 0 && tag === 0x8825) || // GPS Info\n (ifd === 0x8769 && tag === 0xA005); // Interop IFD\n};\n\n\n// Returns byte length of a single component of a given format\n//\nExifParser.prototype.exif_format_length = function (format) {\n switch (format) {\n case 1: // byte\n case 2: // ascii\n case 6: // sbyte\n case 7: // undefined\n return 1;\n\n case 3: // short\n case 8: // sshort\n return 2;\n\n case 4: // long\n case 9: // slong\n case 11: // float\n return 4;\n\n case 5: // rational\n case 10: // srational\n case 12: // double\n return 8;\n\n default:\n // unknown type\n return 0;\n }\n};\n\n\n// Reads Exif data\n//\nExifParser.prototype.exif_format_read = function (format, offset) {\n var v;\n\n switch (format) {\n case 1: // byte\n case 2: // ascii\n v = this.input[offset];\n return v;\n\n case 6: // sbyte\n v = this.input[offset];\n return v | (v & 0x80) * 0x1fffffe;\n\n case 3: // short\n v = this.read_uint16(offset);\n return v;\n\n case 8: // sshort\n v = this.read_uint16(offset);\n return v | (v & 0x8000) * 0x1fffe;\n\n case 4: // long\n v = this.read_uint32(offset);\n return v;\n\n case 9: // slong\n v = this.read_uint32(offset);\n return v | 0;\n\n case 5: // rational\n case 10: // srational\n case 11: // float\n case 12: // double\n return null; // not implemented\n\n case 7: // undefined\n return null; // blob\n\n default:\n // unknown type\n return null;\n }\n};\n\n\nExifParser.prototype.scan_ifd = function (ifd_no, offset, on_entry) {\n var entry_count = this.read_uint16(offset);\n\n offset += 2;\n\n for (var i = 0; i < entry_count; i++) {\n var tag = this.read_uint16(offset);\n var format = this.read_uint16(offset + 2);\n var count = this.read_uint32(offset + 4);\n\n var comp_length = this.exif_format_length(format);\n var data_length = count * comp_length;\n var data_offset = data_length <= 4 ? offset + 8 : this.read_uint32(offset + 8);\n var is_subifd_link = false;\n\n if (data_offset + data_length > this.input.length) {\n throw error('unexpected EOF', 'EBADDATA');\n }\n\n var value = [];\n var comp_offset = data_offset;\n\n for (var j = 0; j < count; j++, comp_offset += comp_length) {\n var item = this.exif_format_read(format, comp_offset);\n if (item === null) {\n value = null;\n break;\n }\n value.push(item);\n }\n\n if (Array.isArray(value) && format === 2) {\n try {\n value = utf8_decode(String.fromCharCode.apply(null, value));\n } catch (_) {\n value = null;\n }\n\n if (value && value[value.length - 1] === '\\0') value = value.slice(0, -1);\n }\n\n if (this.is_subifd_link(ifd_no, tag)) {\n if (Array.isArray(value) && Number.isInteger(value[0]) && value[0] > 0) {\n this.ifds_to_read.push({\n id: tag,\n offset: value[0]\n });\n is_subifd_link = true;\n }\n }\n\n var entry = {\n is_big_endian: this.big_endian,\n ifd: ifd_no,\n tag: tag,\n format: format,\n count: count,\n entry_offset: offset + this.start,\n data_length: data_length,\n data_offset: data_offset + this.start,\n value: value,\n is_subifd_link: is_subifd_link\n };\n\n if (on_entry(entry) === false) {\n this.aborted = true;\n return;\n }\n\n offset += 12;\n }\n\n if (ifd_no === 0) {\n this.ifds_to_read.push({\n id: 1,\n offset: this.read_uint32(offset)\n });\n }\n};\n\n\n// Check whether input is a JPEG image\n//\n// Input:\n// - jpeg_bin: Uint8Array - jpeg file\n//\n// Returns true if it is and false otherwise\n//\nmodule.exports.is_jpeg = function (jpeg_bin) {\n return jpeg_bin.length >= 4 && jpeg_bin[0] === 0xFF && jpeg_bin[1] === 0xD8 && jpeg_bin[2] === 0xFF;\n};\n\n\n// Call an iterator on each segment in the given JPEG image\n//\n// Input:\n// - jpeg_bin: Uint8Array - jpeg file\n// - on_segment: Function - callback executed on each JPEG marker segment\n// - segment: Object\n// - code: Number - marker type (2nd byte, e.g. 0xE0 for APP0)\n// - offset: Number - offset of the first byte (0xFF) relative to `jpeg_bin` start\n// - length: Number - length of the entire marker segment including first two bytes and length\n// - 2 for standalone markers\n// - 4+length for markers with data\n//\n// Iteration stops when `EOI` (0xFFD9) marker is reached or if `on_segment`\n// function returns `false`.\n//\nmodule.exports.jpeg_segments_each = function (jpeg_bin, on_segment) {\n if (!is_uint8array(jpeg_bin)) {\n throw error('Invalid argument (jpeg_bin), Uint8Array expected', 'EINVAL');\n }\n\n if (typeof on_segment !== 'function') {\n throw error('Invalid argument (on_segment), Function expected', 'EINVAL');\n }\n\n if (!module.exports.is_jpeg(jpeg_bin)) {\n throw error('Unknown file format', 'ENOTJPEG');\n }\n\n var offset = 0, length = jpeg_bin.length, inside_scan = false;\n\n for (;;) {\n var segment_code, segment_length;\n\n if (offset + 1 >= length) throw error('Unexpected EOF', 'EBADDATA');\n var byte1 = jpeg_bin[offset];\n var byte2 = jpeg_bin[offset + 1];\n\n if (byte1 === 0xFF && byte2 === 0xFF) {\n // padding\n segment_code = 0xFF;\n segment_length = 1;\n\n } else if (byte1 === 0xFF && byte2 !== 0) {\n // marker\n segment_code = byte2;\n segment_length = 2;\n\n if ((0xD0 <= segment_code && segment_code <= 0xD9) || segment_code === 0x01) ; else {\n if (offset + 3 >= length) throw error('Unexpected EOF', 'EBADDATA');\n segment_length += jpeg_bin[offset + 2] * 0x100 + jpeg_bin[offset + 3];\n if (segment_length < 2) throw error('Invalid segment length', 'EBADDATA');\n if (offset + segment_length - 1 >= length) throw error('Unexpected EOF', 'EBADDATA');\n }\n\n if (inside_scan) {\n if (segment_code >= 0xD0 && segment_code <= 0xD7) ; else {\n inside_scan = false;\n }\n }\n\n if (segment_code === 0xDA /* SOS */) inside_scan = true;\n } else if (inside_scan) {\n // entropy-encoded segment\n for (var pos = offset + 1; ; pos++) {\n // scan until we find FF\n if (pos >= length) throw error('Unexpected EOF', 'EBADDATA');\n if (jpeg_bin[pos] === 0xFF) {\n if (pos + 1 >= length) throw error('Unexpected EOF', 'EBADDATA');\n if (jpeg_bin[pos + 1] !== 0) {\n segment_code = 0;\n segment_length = pos - offset;\n break;\n }\n }\n }\n } else {\n throw error('Unexpected byte at segment start: ' + to_hex(byte1) +\n ' (offset ' + to_hex(offset) + ')', 'EBADDATA');\n }\n\n if (on_segment({ code: segment_code, offset: offset, length: segment_length }) === false) break;\n if (segment_code === 0xD9 /* EOI */) break;\n offset += segment_length;\n }\n};\n\n\n// Replace or remove segments in the given JPEG image\n//\n// Input:\n// - jpeg_bin: Uint8Array - jpeg file\n// - on_segment: Function - callback executed on each JPEG marker segment\n// - segment: Object\n// - code: Number - marker type (2nd byte, e.g. 0xE0 for APP0)\n// - offset: Number - offset of the first byte (0xFF) relative to `jpeg_bin` start\n// - length: Number - length of the entire marker segment including first two bytes and length\n// - 2 for standalone markers\n// - 4+length for markers with data\n//\n// `on_segment` function should return one of the following:\n// - `false` - segment is removed from the output\n// - Uint8Array - segment is replaced with the new data\n// - [ Uint8Array ] - segment is replaced with the new data\n// - anything else - segment is copied to the output as is\n//\n// Any data after `EOI` (0xFFD9) marker is removed.\n//\nmodule.exports.jpeg_segments_filter = function (jpeg_bin, on_segment) {\n if (!is_uint8array(jpeg_bin)) {\n throw error('Invalid argument (jpeg_bin), Uint8Array expected', 'EINVAL');\n }\n\n if (typeof on_segment !== 'function') {\n throw error('Invalid argument (on_segment), Function expected', 'EINVAL');\n }\n\n var ranges = [];\n var out_length = 0;\n\n module.exports.jpeg_segments_each(jpeg_bin, function (segment) {\n var new_segment = on_segment(segment);\n\n if (is_uint8array(new_segment)) {\n ranges.push({ data: new_segment });\n out_length += new_segment.length;\n } else if (Array.isArray(new_segment)) {\n new_segment.filter(is_uint8array).forEach(function (s) {\n ranges.push({ data: s });\n out_length += s.length;\n });\n } else if (new_segment !== false) {\n var new_range = { start: segment.offset, end: segment.offset + segment.length };\n\n if (ranges.length > 0 && ranges[ranges.length - 1].end === new_range.start) {\n ranges[ranges.length - 1].end = new_range.end;\n } else {\n ranges.push(new_range);\n }\n\n out_length += segment.length;\n }\n });\n\n var result = new Uint8Array(out_length);\n var offset = 0;\n\n ranges.forEach(function (range) {\n var data = range.data || jpeg_bin.subarray(range.start, range.end);\n result.set(data, offset);\n offset += data.length;\n });\n\n return result;\n};\n\n\n// Call an iterator on each Exif entry in the given JPEG image\n//\n// Input:\n// - jpeg_bin: Uint8Array - jpeg file\n// - on_entry: Function - callback executed on each Exif entry\n// - entry: Object\n// - is_big_endian: Boolean - whether Exif uses big or little endian byte alignment\n// - ifd: Number - IFD identifier (0 for IFD0, 1 for IFD1, 0x8769 for SubIFD,\n// 0x8825 for GPS Info, 0xA005 for Interop IFD)\n// - tag: Number - exif entry tag (0x0110 - camera name, 0x0112 - orientation, etc. - see Exif spec)\n// - format: Number - exif entry format (1 - byte, 2 - ascii, 3 - short, etc. - see Exif spec)\n// - count: Number - number of components of the given format inside data\n// (usually 1, or string length for ascii format)\n// - entry_offset: Number - start of Exif entry (entry length is always 12, so not included)\n// - data_offset: Number - start of data attached to Exif entry (will overlap with entry if length <= 4)\n// - data_length: Number - length of data attached to Exif entry\n// - value: Array|String|Null - our best attempt at parsing data (not all formats supported right now)\n// - is_subifd_link: Boolean - whether this entry is recognized to be a link to subifd (can't filter these out)\n//\n// Iteration stops early if iterator returns `false`.\n//\n// If Exif wasn't found anywhere (before start of the image data, SOS),\n// iterator is never executed.\n//\nmodule.exports.jpeg_exif_tags_each = function (jpeg_bin, on_exif_entry) {\n if (!is_uint8array(jpeg_bin)) {\n throw error('Invalid argument (jpeg_bin), Uint8Array expected', 'EINVAL');\n }\n\n if (typeof on_exif_entry !== 'function') {\n throw error('Invalid argument (on_exif_entry), Function expected', 'EINVAL');\n }\n\n /* eslint-disable consistent-return */\n module.exports.jpeg_segments_each(jpeg_bin, function (segment) {\n if (segment.code === 0xDA /* SOS */) return false;\n\n // look for APP1 segment and compare header with 'Exif\\0\\0'\n if (segment.code === 0xE1 && segment.length >= 10 &&\n jpeg_bin[segment.offset + 4] === 0x45 && jpeg_bin[segment.offset + 5] === 0x78 &&\n jpeg_bin[segment.offset + 6] === 0x69 && jpeg_bin[segment.offset + 7] === 0x66 &&\n jpeg_bin[segment.offset + 8] === 0x00 && jpeg_bin[segment.offset + 9] === 0x00) {\n\n new ExifParser(jpeg_bin, segment.offset + 10, segment.offset + segment.length).each(on_exif_entry);\n return false;\n }\n });\n};\n\n\n// Remove Exif entries in the given JPEG image\n//\n// Input:\n// - jpeg_bin: Uint8Array - jpeg file\n// - on_entry: Function - callback executed on each Exif entry\n// - entry: Object\n// - is_big_endian: Boolean - whether Exif uses big or little endian byte alignment\n// - ifd: Number - IFD identifier (0 for IFD0, 1 for IFD1, 0x8769 for SubIFD,\n// 0x8825 for GPS Info, 0xA005 for Interop IFD)\n// - tag: Number - exif entry tag (0x0110 - camera name, 0x0112 - orientation, etc. - see Exif spec)\n// - format: Number - exif entry format (1 - byte, 2 - ascii, 3 - short, etc. - see Exif spec)\n// - count: Number - number of components of the given format inside data\n// (usually 1, or string length for ascii format)\n// - entry_offset: Number - start of Exif entry (entry length is always 12, so not included)\n// - data_offset: Number - start of data attached to Exif entry (will overlap with entry if length <= 4)\n// - data_length: Number - length of data attached to Exif entry\n// - value: Array|String|Null - our best attempt at parsing data (not all formats supported right now)\n// - is_subifd_link: Boolean - whether this entry is recognized to be a link to subifd (can't filter these out)\n//\n// This function removes following from Exif:\n// - all entries where iterator returned false (except subifd links which are mandatory)\n// - IFD1 and thumbnail image (the purpose of this function is to reduce file size,\n// so thumbnail is usually the first thing to go)\n// - all other data that isn't in IFD0, SubIFD, GPSIFD, InteropIFD\n// (theoretically possible proprietary extensions, I haven't seen any of these yet)\n//\n// Changing data inside Exif entries is NOT supported yet (modifying `entry` object inside callback may break stuff).\n//\n// If Exif wasn't found anywhere (before start of the image data, SOS),\n// iterator is never executed, and original JPEG is returned as is.\n//\nmodule.exports.jpeg_exif_tags_filter = function (jpeg_bin, on_exif_entry) {\n if (!is_uint8array(jpeg_bin)) {\n throw error('Invalid argument (jpeg_bin), Uint8Array expected', 'EINVAL');\n }\n\n if (typeof on_exif_entry !== 'function') {\n throw error('Invalid argument (on_exif_entry), Function expected', 'EINVAL');\n }\n\n var stop_search = false;\n\n return module.exports.jpeg_segments_filter(jpeg_bin, function (segment) {\n if (stop_search) return;\n if (segment.code === 0xDA /* SOS */) stop_search = true;\n\n // look for APP1 segment and compare header with 'Exif\\0\\0'\n if (segment.code === 0xE1 && segment.length >= 10 &&\n jpeg_bin[segment.offset + 4] === 0x45 && jpeg_bin[segment.offset + 5] === 0x78 &&\n jpeg_bin[segment.offset + 6] === 0x69 && jpeg_bin[segment.offset + 7] === 0x66 &&\n jpeg_bin[segment.offset + 8] === 0x00 && jpeg_bin[segment.offset + 9] === 0x00) {\n\n var new_exif = new ExifParser(jpeg_bin, segment.offset + 10, segment.offset + segment.length)\n .filter(on_exif_entry);\n if (!new_exif) return false;\n\n var header = new Uint8Array(10);\n\n header.set(jpeg_bin.slice(segment.offset, segment.offset + 10));\n header[2] = ((new_exif.length + 8) >>> 8) & 0xFF;\n header[3] = (new_exif.length + 8) & 0xFF;\n\n stop_search = true;\n return [ header, new_exif ];\n }\n });\n};\n\n\n// Inserts a custom comment marker segment into JPEG file.\n//\n// Input:\n// - jpeg_bin: Uint8Array - jpeg file\n// - comment: String\n//\n// Comment is inserted after first two bytes (FFD8, SOI).\n//\n// If JFIF (APP0) marker exists immediately after SOI (as mandated by the JFIF\n// spec), we insert comment after it instead.\n//\nmodule.exports.jpeg_add_comment = function (jpeg_bin, comment) {\n var comment_inserted = false, segment_count = 0;\n\n return module.exports.jpeg_segments_filter(jpeg_bin, function (segment) {\n segment_count++;\n if (segment_count === 1 && segment.code === 0xD8 /* SOI */) return;\n if (segment_count === 2 && segment.code === 0xE0 /* APP0 */) return;\n\n if (comment_inserted) return;\n comment = utf8_encode(comment);\n\n // comment segment\n var csegment = new Uint8Array(5 + comment.length);\n var offset = 0;\n\n csegment[offset++] = 0xFF;\n csegment[offset++] = 0xFE;\n csegment[offset++] = ((comment.length + 3) >>> 8) & 0xFF;\n csegment[offset++] = (comment.length + 3) & 0xFF;\n\n comment.split('').forEach(function (c) {\n csegment[offset++] = c.charCodeAt(0) & 0xFF;\n });\n\n csegment[offset++] = 0;\n comment_inserted = true;\n\n return [ csegment, jpeg_bin.subarray(segment.offset, segment.offset + segment.length) ];\n });\n};\n});\n\nfunction jpeg_patch_exif(env) {\n return this._getUint8Array(env.blob).then(function (data) {\n env.is_jpeg = image_traverse.is_jpeg(data);\n\n if (!env.is_jpeg) return Promise.resolve(env);\n\n env.orig_blob = env.blob;\n\n try {\n var exif_is_big_endian, orientation_offset;\n\n /* eslint-disable consistent-return */\n image_traverse.jpeg_exif_tags_each(data, function (entry) {\n if (entry.ifd === 0 && entry.tag === 0x112 && Array.isArray(entry.value)) {\n env.orientation = entry.value[0] || 1;\n exif_is_big_endian = entry.is_big_endian;\n orientation_offset = entry.data_offset;\n return false;\n }\n });\n\n if (orientation_offset) {\n var orientation_patch = exif_is_big_endian ?\n new Uint8Array([ 0, 1 ]) :\n new Uint8Array([ 1, 0 ]);\n\n env.blob = new Blob([\n data.slice(0, orientation_offset),\n orientation_patch,\n data.slice(orientation_offset + 2)\n ], { type: 'image/jpeg' });\n }\n } catch (_) {}\n\n return env;\n });\n}\n\n\nfunction jpeg_rotate_canvas(env) {\n if (!env.is_jpeg) return Promise.resolve(env);\n\n var orientation = env.orientation - 1;\n if (!orientation) return Promise.resolve(env);\n\n var canvas;\n\n if (orientation & 4) {\n canvas = this.pica.options.createCanvas(env.out_canvas.height, env.out_canvas.width);\n } else {\n canvas = this.pica.options.createCanvas(env.out_canvas.width, env.out_canvas.height);\n }\n\n var ctx = canvas.getContext('2d');\n\n ctx.save();\n\n if (orientation & 1) ctx.transform(-1, 0, 0, 1, canvas.width, 0);\n if (orientation & 2) ctx.transform(-1, 0, 0, -1, canvas.width, canvas.height);\n if (orientation & 4) ctx.transform(0, 1, 1, 0, 0, 0);\n\n ctx.drawImage(env.out_canvas, 0, 0);\n ctx.restore();\n\n // Safari 12 workaround\n // https://github.com/nodeca/pica/issues/199\n env.out_canvas.width = env.out_canvas.height = 0;\n\n env.out_canvas = canvas;\n\n return Promise.resolve(env);\n}\n\n\nfunction jpeg_attach_orig_segments(env) {\n if (!env.is_jpeg) return Promise.resolve(env);\n\n return Promise.all([\n this._getUint8Array(env.blob),\n this._getUint8Array(env.out_blob)\n ]).then(function (res) {\n var data = res[0];\n var data_out = res[1];\n\n if (!image_traverse.is_jpeg(data)) return Promise.resolve(env);\n\n var segments = [];\n\n image_traverse.jpeg_segments_each(data, function (segment) {\n if (segment.code === 0xDA /* SOS */) return false;\n segments.push(segment);\n });\n\n segments = segments\n .filter(function (segment) {\n // Drop ICC_PROFILE\n //\n if (segment.code === 0xE2) return false;\n\n // Keep all APPn segments excluding APP2 (ICC_PROFILE),\n // remove others because most of them depend on image data (DCT and such).\n //\n // APP0 - JFIF, APP1 - Exif, the rest are photoshop metadata and such\n //\n // See full list at https://www.w3.org/Graphics/JPEG/itu-t81.pdf (table B.1 on page 32)\n //\n if (segment.code >= 0xE0 && segment.code < 0xF0) return true;\n\n // Keep comments\n //\n if (segment.code === 0xFE) return true;\n\n return false;\n })\n .map(function (segment) {\n return data.slice(segment.offset, segment.offset + segment.length);\n });\n\n env.out_blob = new Blob(\n // intentionally omitting expected JFIF segment (offset 2 to 20)\n [ data_out.slice(0, 2) ].concat(segments).concat([ data_out.slice(20) ]),\n { type: 'image/jpeg' }\n );\n\n return env;\n });\n}\n\n\nfunction assign(reducer) {\n reducer.before('_blob_to_image', jpeg_patch_exif);\n reducer.after('_transform', jpeg_rotate_canvas);\n reducer.after('_create_blob', jpeg_attach_orig_segments);\n}\n\n\nvar jpeg_patch_exif_1 = jpeg_patch_exif;\nvar jpeg_rotate_canvas_1 = jpeg_rotate_canvas;\nvar jpeg_attach_orig_segments_1 = jpeg_attach_orig_segments;\nvar assign_1 = assign;\n\nvar jpeg_plugins = {\n\tjpeg_patch_exif: jpeg_patch_exif_1,\n\tjpeg_rotate_canvas: jpeg_rotate_canvas_1,\n\tjpeg_attach_orig_segments: jpeg_attach_orig_segments_1,\n\tassign: assign_1\n};\n\nfunction ImageBlobReduce(options) {\n if (!(this instanceof ImageBlobReduce)) return new ImageBlobReduce(options);\n\n options = options || {};\n\n this.pica = options.pica || pica({});\n this.initialized = false;\n\n this.utils = utils;\n}\n\n\nImageBlobReduce.prototype.use = function (plugin /*, params, ... */) {\n var args = [ this ].concat(Array.prototype.slice.call(arguments, 1));\n plugin.apply(plugin, args);\n return this;\n};\n\n\nImageBlobReduce.prototype.init = function () {\n this.use(jpeg_plugins.assign);\n};\n\n\nImageBlobReduce.prototype.toBlob = function (blob, options) {\n var opts = utils.assign({ max: Infinity }, options);\n var env = {\n blob: blob,\n opts: opts\n };\n\n if (!this.initialized) {\n this.init();\n this.initialized = true;\n }\n\n return Promise.resolve(env)\n .then(this._blob_to_image)\n .then(this._calculate_size)\n .then(this._transform)\n .then(this._cleanup)\n .then(this._create_blob)\n .then(function (_env) {\n // Safari 12 workaround\n // https://github.com/nodeca/pica/issues/199\n _env.out_canvas.width = _env.out_canvas.height = 0;\n\n return _env.out_blob;\n });\n};\n\n\nImageBlobReduce.prototype.toCanvas = function (blob, options) {\n var opts = utils.assign({ max: Infinity }, options);\n var env = {\n blob: blob,\n opts: opts\n };\n\n if (!this.initialized) {\n this.init();\n this.initialized = true;\n }\n\n return Promise.resolve(env)\n .then(this._blob_to_image)\n .then(this._calculate_size)\n .then(this._transform)\n .then(this._cleanup)\n .then(function (_env) { return _env.out_canvas; });\n};\n\n\nImageBlobReduce.prototype.before = function (method_name, fn) {\n if (!this[method_name]) throw new Error('Method \"' + method_name + '\" does not exist');\n if (typeof fn !== 'function') throw new Error('Invalid argument \"fn\", function expected');\n\n var old_fn = this[method_name];\n var self = this;\n\n this[method_name] = function (env) {\n return fn.call(self, env).then(function (_env) {\n return old_fn.call(self, _env);\n });\n };\n\n return this;\n};\n\n\nImageBlobReduce.prototype.after = function (method_name, fn) {\n if (!this[method_name]) throw new Error('Method \"' + method_name + '\" does not exist');\n if (typeof fn !== 'function') throw new Error('Invalid argument \"fn\", function expected');\n\n var old_fn = this[method_name];\n var self = this;\n\n this[method_name] = function (env) {\n return old_fn.call(self, env).then(function (_env) {\n return fn.call(self, _env);\n });\n };\n\n return this;\n};\n\n\nImageBlobReduce.prototype._blob_to_image = function (env) {\n var URL = window.URL || window.webkitURL || window.mozURL || window.msURL;\n\n env.image = document.createElement('img');\n env.image_url = URL.createObjectURL(env.blob);\n env.image.src = env.image_url;\n\n return new Promise(function (resolve, reject) {\n env.image.onerror = function () { reject(new Error('ImageBlobReduce: failed to create Image() from blob')); };\n env.image.onload = function () { resolve(env); };\n });\n};\n\n\nImageBlobReduce.prototype._calculate_size = function (env) {\n //\n // Note, if your need not \"symmetric\" resize logic, you MUST check\n // `env.orientation` (set by plugins) and swap width/height appropriately.\n //\n var scale_factor = env.opts.max / Math.max(env.image.width, env.image.height);\n\n if (scale_factor > 1) scale_factor = 1;\n\n env.transform_width = Math.max(Math.round(env.image.width * scale_factor), 1);\n env.transform_height = Math.max(Math.round(env.image.height * scale_factor), 1);\n\n // Info for user plugins, to check if scaling applied\n env.scale_factor = scale_factor;\n\n return Promise.resolve(env);\n};\n\n\nImageBlobReduce.prototype._transform = function (env) {\n env.out_canvas = this.pica.options.createCanvas(env.transform_width, env.transform_height);\n\n // Dim env temporary vars to prohibit use and avoid confusion when orientation\n // changed. You should take real size from canvas.\n env.transform_width = null;\n env.transform_height = null;\n\n // By default use alpha for png only\n var pica_opts = { alpha: env.blob.type === 'image/png' };\n\n // Extract pica options if been passed\n this.utils.assign(pica_opts, this.utils.pick_pica_resize_options(env.opts));\n\n return this.pica\n .resize(env.image, env.out_canvas, pica_opts)\n .then(function () { return env; });\n};\n\n\nImageBlobReduce.prototype._cleanup = function (env) {\n env.image.src = '';\n env.image = null;\n\n var URL = window.URL || window.webkitURL || window.mozURL || window.msURL;\n if (URL.revokeObjectURL) URL.revokeObjectURL(env.image_url);\n\n env.image_url = null;\n\n return Promise.resolve(env);\n};\n\n\nImageBlobReduce.prototype._create_blob = function (env) {\n return this.pica.toBlob(env.out_canvas, env.blob.type)\n .then(function (blob) {\n env.out_blob = blob;\n return env;\n });\n};\n\n\nImageBlobReduce.prototype._getUint8Array = function (blob) {\n if (blob.arrayBuffer) {\n return blob.arrayBuffer().then(function (buf) {\n return new Uint8Array(buf);\n });\n }\n\n return new Promise(function (resolve, reject) {\n var fr = new FileReader();\n\n fr.readAsArrayBuffer(blob);\n\n fr.onload = function () { resolve(new Uint8Array(fr.result)); };\n fr.onerror = function () {\n reject(new Error('ImageBlobReduce: failed to load data from input blob'));\n fr.abort();\n };\n fr.onabort = function () {\n reject(new Error('ImageBlobReduce: failed to load data from input blob (aborted)'));\n };\n });\n};\n\n\nImageBlobReduce.pica = pica;\n\nvar imageBlobReduce = ImageBlobReduce;\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (imageBlobReduce);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2ltYWdlLWJsb2ItcmVkdWNlL2Rpc3QvaW1hZ2UtYmxvYi1yZWR1Y2UuZXNtLm1qcy5qcyIsIm1hcHBpbmdzIjoiOzs7OztBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQkFBa0Isc0JBQXNCO0FBQ3hDOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLGNBQWMscUJBQXFCLGFBQWEsbUJBQW1CLGtCQUFrQixnQkFBZ0IsVUFBVSxVQUFVLDBEQUEwRCx3QkFBd0Isb0JBQW9CLDhDQUE4QyxrQ0FBa0MsWUFBWSxZQUFZLG1DQUFtQyxpQkFBaUIsZUFBZSx1QkFBdUIsb0JBQW9CLGtFQUFrRSxXQUFXLFlBQVksU0FBUyxTQUFTLEtBQUs7O0FBRXJpQjs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBLENBQUMsRUFBRSxtRUFBbUU7QUFDdEU7O0FBRUE7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCOztBQUV0QixpQkFBaUIsYUFBYTtBQUM5QixtQkFBbUI7O0FBRW5CLG9CQUFvQixlQUFlO0FBQ25DO0FBQ0E7QUFDQTtBQUNB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QTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUcsR0FBRztBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUcsR0FBRzs7QUFFTjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQSw2Q0FBNkM7QUFDN0M7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTCxHQUFHO0FBQ0gsR0FBRzs7O0FBR0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLElBQUk7OztBQUdKO0FBQ0E7QUFDQTtBQUNBLEtBQUssR0FBRzs7QUFFUjtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLDJFQUEyRTtBQUMzRTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsZ0RBQWdELFFBQVE7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztB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QUFHQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkM7QUFDN0M7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1COztBQUVuQjtBQUNBLG1CQUFtQjs7QUFFbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTs7QUFFQSxrQkFBa0IsaUJBQWlCO0FBQ25DO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxvQkFBb0IsV0FBVztBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQSxxRkFBcUY7QUFDckY7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDREQUE0RDtBQUM1RDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNO0FBQ047QUFDQSxtQ0FBbUM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUEscUJBQXFCLDREQUE0RDtBQUNqRjtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxvQkFBb0IsbUJBQW1CO0FBQ3ZDO0FBQ0EsTUFBTTtBQUNOO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0I7QUFDQSxPQUFPO0FBQ1AsTUFBTTtBQUNOLHdCQUF3Qjs7QUFFeEI7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsb0JBQW9CO0FBQ2pDO0FBQ0EsTUFBTTs7QUFFTjtBQUNBLEdBQUc7QUFDSDs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjs7QUFFQTtBQUNBLEdBQUc7QUFDSDs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUEscUNBQXFDO0FBQ3JDOztBQUVBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQSw0QkFBNEIsZUFBZTtBQUMzQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDs7O0FBR0E7QUFDQSw0QkFBNEIsZUFBZTtBQUMzQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLHlCQUF5QjtBQUNyRDs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHNDQUFzQztBQUN0QyxxQ0FBcUM7QUFDckMsR0FBRztBQUNIOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxvQkFBb0I7O0FBRXBCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHdCQUF3QixhQUFhO0FBQ3JDOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBOztBQUVBOztBQUVBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7O0FBR0E7O0FBRUE7O0FBRUEsaUVBQWUsZUFBZSxFQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9pbWFnZS1ibG9iLXJlZHVjZS9kaXN0L2ltYWdlLWJsb2ItcmVkdWNlLmVzbS5tanM/MGU1NiJdLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qISBpbWFnZS1ibG9iLXJlZHVjZSAzLjAuMSBodHRwczovL2dpdGh1Yi5jb20vbm9kZWNhL2ltYWdlLWJsb2ItcmVkdWNlIEBsaWNlbnNlIE1JVCAqL1xudmFyIGFzc2lnbiQxID0gZnVuY3Rpb24gYXNzaWduKHRvKSB7XG4gIHZhciBmcm9tO1xuXG4gIGZvciAodmFyIHMgPSAxOyBzIDwgYXJndW1lbnRzLmxlbmd0aDsgcysrKSB7XG4gICAgZnJvbSA9IE9iamVjdChhcmd1bWVudHNbc10pO1xuXG4gICAgZm9yICh2YXIga2V5IGluIGZyb20pIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZnJvbSwga2V5KSkgdG9ba2V5XSA9IGZyb21ba2V5XTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdG87XG59O1xuXG5cbmZ1bmN0aW9uIHBpY2soZnJvbSwgcHJvcHMpIHtcbiAgdmFyIHRvID0ge307XG5cbiAgcHJvcHMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChmcm9tLCBrZXkpKSB0b1trZXldID0gZnJvbVtrZXldO1xuICB9KTtcblxuICByZXR1cm4gdG87XG59XG5cblxuZnVuY3Rpb24gcGlja19waWNhX3Jlc2l6ZV9vcHRpb25zKGZyb20pIHtcbiAgcmV0dXJuIHBpY2soZnJvbSwgW1xuICAgICdhbHBoYScsXG4gICAgJ3Vuc2hhcnBBbW91bnQnLFxuICAgICd1bnNoYXJwUmFkaXVzJyxcbiAgICAndW5zaGFycFRocmVzaG9sZCcsXG4gICAgJ2NhbmNlbFRva2VuJ1xuICBdKTtcbn1cblxuXG52YXIgcGlja18xID0gcGljaztcbnZhciBwaWNrX3BpY2FfcmVzaXplX29wdGlvbnNfMSA9IHBpY2tfcGljYV9yZXNpemVfb3B0aW9ucztcblxudmFyIHV0aWxzID0ge1xuXHRhc3NpZ246IGFzc2lnbiQxLFxuXHRwaWNrOiBwaWNrXzEsXG5cdHBpY2tfcGljYV9yZXNpemVfb3B0aW9uczogcGlja19waWNhX3Jlc2l6ZV9vcHRpb25zXzFcbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZuKSB7XG4gIHZhciBtb2R1bGUgPSB7IGV4cG9ydHM6IHt9IH07XG5cdHJldHVybiBmbihtb2R1bGUsIG1vZHVsZS5leHBvcnRzKSwgbW9kdWxlLmV4cG9ydHM7XG59XG5cbmZ1bmN0aW9uIGNvbW1vbmpzUmVxdWlyZSAodGFyZ2V0KSB7XG5cdHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGR5bmFtaWNhbGx5IHJlcXVpcmUgXCInICsgdGFyZ2V0ICsgJ1wiLiBQbGVhc2UgY29uZmlndXJlIHRoZSBkeW5hbWljUmVxdWlyZVRhcmdldHMgb3B0aW9uIG9mIEByb2xsdXAvcGx1Z2luLWNvbW1vbmpzIGFwcHJvcHJpYXRlbHkgZm9yIHRoaXMgcmVxdWlyZSBjYWxsIHRvIGJlaGF2ZSBwcm9wZXJseS4nKTtcbn1cblxuLyohXG5cbnBpY2Fcbmh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlY2EvcGljYVxuXG4qL1xuXG52YXIgcGljYSA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHtcbihmdW5jdGlvbihmKXt7bW9kdWxlLmV4cG9ydHM9ZigpO319KShmdW5jdGlvbigpe3JldHVybiAoZnVuY3Rpb24oKXtmdW5jdGlvbiByKGUsbix0KXtmdW5jdGlvbiBvKGksZil7aWYoIW5baV0pe2lmKCFlW2ldKXt2YXIgYz1cImZ1bmN0aW9uXCI9PXR5cGVvZiBjb21tb25qc1JlcXVpcmUmJmNvbW1vbmpzUmVxdWlyZTtpZighZiYmYylyZXR1cm4gYyhpLCEwKTtpZih1KXJldHVybiB1KGksITApO3ZhciBhPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIraStcIidcIik7dGhyb3cgYS5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGF9dmFyIHA9bltpXT17ZXhwb3J0czp7fX07ZVtpXVswXS5jYWxsKHAuZXhwb3J0cyxmdW5jdGlvbihyKXt2YXIgbj1lW2ldWzFdW3JdO3JldHVybiBvKG58fHIpfSxwLHAuZXhwb3J0cyxyLGUsbix0KTt9cmV0dXJuIG5baV0uZXhwb3J0c31mb3IodmFyIHU9XCJmdW5jdGlvblwiPT10eXBlb2YgY29tbW9uanNSZXF1aXJlJiZjb21tb25qc1JlcXVpcmUsaT0wO2k8dC5sZW5ndGg7aSsrKW8odFtpXSk7cmV0dXJuIG99cmV0dXJuIHJ9KSgpKHsxOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblxudmFyIGluaGVyaXRzID0gX2RlcmVxXygnaW5oZXJpdHMnKTtcblxudmFyIE11bHRpbWF0aCA9IF9kZXJlcV8oJ211bHRpbWF0aCcpO1xuXG52YXIgbW1fdW5zaGFycF9tYXNrID0gX2RlcmVxXygnLi9tbV91bnNoYXJwX21hc2snKTtcblxudmFyIG1tX3Jlc2l6ZSA9IF9kZXJlcV8oJy4vbW1fcmVzaXplJyk7XG5cbmZ1bmN0aW9uIE1hdGhMaWIocmVxdWVzdGVkX2ZlYXR1cmVzKSB7XG4gIHZhciBfX3JlcXVlc3RlZF9mZWF0dXJlcyA9IHJlcXVlc3RlZF9mZWF0dXJlcyB8fCBbXTtcblxuICB2YXIgZmVhdHVyZXMgPSB7XG4gICAganM6IF9fcmVxdWVzdGVkX2ZlYXR1cmVzLmluZGV4T2YoJ2pzJykgPj0gMCxcbiAgICB3YXNtOiBfX3JlcXVlc3RlZF9mZWF0dXJlcy5pbmRleE9mKCd3YXNtJykgPj0gMFxuICB9O1xuICBNdWx0aW1hdGguY2FsbCh0aGlzLCBmZWF0dXJlcyk7XG4gIHRoaXMuZmVhdHVyZXMgPSB7XG4gICAganM6IGZlYXR1cmVzLmpzLFxuICAgIHdhc206IGZlYXR1cmVzLndhc20gJiYgdGhpcy5oYXNfd2FzbSgpXG4gIH07XG4gIHRoaXMudXNlKG1tX3Vuc2hhcnBfbWFzayk7XG4gIHRoaXMudXNlKG1tX3Jlc2l6ZSk7XG59XG5cbmluaGVyaXRzKE1hdGhMaWIsIE11bHRpbWF0aCk7XG5cbk1hdGhMaWIucHJvdG90eXBlLnJlc2l6ZUFuZFVuc2hhcnAgPSBmdW5jdGlvbiByZXNpemVBbmRVbnNoYXJwKG9wdGlvbnMsIGNhY2hlKSB7XG4gIHZhciByZXN1bHQgPSB0aGlzLnJlc2l6ZShvcHRpb25zLCBjYWNoZSk7XG5cbiAgaWYgKG9wdGlvbnMudW5zaGFycEFtb3VudCkge1xuICAgIHRoaXMudW5zaGFycF9tYXNrKHJlc3VsdCwgb3B0aW9ucy50b1dpZHRoLCBvcHRpb25zLnRvSGVpZ2h0LCBvcHRpb25zLnVuc2hhcnBBbW91bnQsIG9wdGlvbnMudW5zaGFycFJhZGl1cywgb3B0aW9ucy51bnNoYXJwVGhyZXNob2xkKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1hdGhMaWI7XG5cbn0se1wiLi9tbV9yZXNpemVcIjo0LFwiLi9tbV91bnNoYXJwX21hc2tcIjo5LFwiaW5oZXJpdHNcIjoxOSxcIm11bHRpbWF0aFwiOjIwfV0sMjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4vL3ZhciBGSVhFRF9GUkFDX0JJVFMgPSAxNDtcblxuZnVuY3Rpb24gY2xhbXBUbzgoaSkge1xuICByZXR1cm4gaSA8IDAgPyAwIDogaSA+IDI1NSA/IDI1NSA6IGk7XG59IC8vIENvbnZvbHZlIGltYWdlIGluIGhvcml6b250YWwgZGlyZWN0aW9ucyBhbmQgdHJhbnNwb3NlIG91dHB1dC4gSW4gdGhlb3J5LFxuLy8gdHJhbnNwb3NlIGFsbG93OlxuLy9cbi8vIC0gdXNlIHRoZSBzYW1lIGNvbnZvbHZlciBmb3IgYm90aCBwYXNzZXMgKHRoaXMgZmFpbHMgZHVlIGRpZmZlcmVudFxuLy8gICB0eXBlcyBvZiBpbnB1dCBhcnJheSBhbmQgdGVtcG9yYXJ5IGJ1ZmZlcilcbi8vIC0gbWFraW5nIHZlcnRpY2FsIHBhc3MgYnkgaG9yaXNvbmx0YWwgbGluZXMgaW5wcm92ZSBDUFUgY2FjaGUgdXNlLlxuLy9cbi8vIEJ1dCBpbiByZWFsIGxpZmUgdGhpcyBkb2Vzbid0IHdvcmsgOilcbi8vXG5cblxuZnVuY3Rpb24gY29udm9sdmVIb3Jpem9udGFsbHkoc3JjLCBkZXN0LCBzcmNXLCBzcmNILCBkZXN0VywgZmlsdGVycykge1xuICB2YXIgciwgZywgYiwgYTtcbiAgdmFyIGZpbHRlclB0ciwgZmlsdGVyU2hpZnQsIGZpbHRlclNpemU7XG4gIHZhciBzcmNQdHIsIHNyY1ksIGRlc3RYLCBmaWx0ZXJWYWw7XG4gIHZhciBzcmNPZmZzZXQgPSAwLFxuICAgICAgZGVzdE9mZnNldCA9IDA7IC8vIEZvciBlYWNoIHJvd1xuXG4gIGZvciAoc3JjWSA9IDA7IHNyY1kgPCBzcmNIOyBzcmNZKyspIHtcbiAgICBmaWx0ZXJQdHIgPSAwOyAvLyBBcHBseSBwcmVjb21wdXRlZCBmaWx0ZXJzIHRvIGVhY2ggZGVzdGluYXRpb24gcm93IHBvaW50XG5cbiAgICBmb3IgKGRlc3RYID0gMDsgZGVzdFggPCBkZXN0VzsgZGVzdFgrKykge1xuICAgICAgLy8gR2V0IHRoZSBmaWx0ZXIgdGhhdCBkZXRlcm1pbmVzIHRoZSBjdXJyZW50IG91dHB1dCBwaXhlbC5cbiAgICAgIGZpbHRlclNoaWZ0ID0gZmlsdGVyc1tmaWx0ZXJQdHIrK107XG4gICAgICBmaWx0ZXJTaXplID0gZmlsdGVyc1tmaWx0ZXJQdHIrK107XG4gICAgICBzcmNQdHIgPSBzcmNPZmZzZXQgKyBmaWx0ZXJTaGlmdCAqIDQgfCAwO1xuICAgICAgciA9IGcgPSBiID0gYSA9IDA7IC8vIEFwcGx5IHRoZSBmaWx0ZXIgdG8gdGhlIHJvdyB0byBnZXQgdGhlIGRlc3RpbmF0aW9uIHBpeGVsIHIsIGcsIGIsIGFcblxuICAgICAgZm9yICg7IGZpbHRlclNpemUgPiAwOyBmaWx0ZXJTaXplLS0pIHtcbiAgICAgICAgZmlsdGVyVmFsID0gZmlsdGVyc1tmaWx0ZXJQdHIrK107IC8vIFVzZSByZXZlcnNlIG9yZGVyIHRvIHdvcmthcm91bmQgZGVvcHRzIGluIG9sZCB2OCAobm9kZSB2LjEwKVxuICAgICAgICAvLyBCaWcgdGhhbmtzIHRvIEBtcmFsZXBoIChWeWFjaGVzbGF2IEVnb3JvdikgZm9yIHRoZSB0aXAuXG5cbiAgICAgICAgYSA9IGEgKyBmaWx0ZXJWYWwgKiBzcmNbc3JjUHRyICsgM10gfCAwO1xuICAgICAgICBiID0gYiArIGZpbHRlclZhbCAqIHNyY1tzcmNQdHIgKyAyXSB8IDA7XG4gICAgICAgIGcgPSBnICsgZmlsdGVyVmFsICogc3JjW3NyY1B0ciArIDFdIHwgMDtcbiAgICAgICAgciA9IHIgKyBmaWx0ZXJWYWwgKiBzcmNbc3JjUHRyXSB8IDA7XG4gICAgICAgIHNyY1B0ciA9IHNyY1B0ciArIDQgfCAwO1xuICAgICAgfSAvLyBCcmluZyB0aGlzIHZhbHVlIGJhY2sgaW4gcmFuZ2UuIEFsbCBvZiB0aGUgZmlsdGVyIHNjYWxpbmcgZmFjdG9yc1xuICAgICAgLy8gYXJlIGluIGZpeGVkIHBvaW50IHdpdGggRklYRURfRlJBQ19CSVRTIGJpdHMgb2YgZnJhY3Rpb25hbCBwYXJ0LlxuICAgICAgLy9cbiAgICAgIC8vICghKSBBZGQgMS8yIG9mIHZhbHVlIGJlZm9yZSBjbGFtcGluZyB0byBnZXQgcHJvcGVyIHJvdW5kaW5nLiBJbiBvdGhlclxuICAgICAgLy8gY2FzZSBicmlnaHRuZXNzIGxvc3Mgd2lsbCBiZSBub3RpY2VhYmxlIGlmIHlvdSByZXNpemUgaW1hZ2Ugd2l0aCB3aGl0ZVxuICAgICAgLy8gYm9yZGVyIGFuZCBwbGFjZSBpdCBvbiB3aGl0ZSBiYWNrZ3JvdW5kLlxuICAgICAgLy9cblxuXG4gICAgICBkZXN0W2Rlc3RPZmZzZXQgKyAzXSA9IGNsYW1wVG84KGEgKyAoMSA8PCAxMykgPj4gMTRcbiAgICAgIC8qRklYRURfRlJBQ19CSVRTKi9cbiAgICAgICk7XG4gICAgICBkZXN0W2Rlc3RPZmZzZXQgKyAyXSA9IGNsYW1wVG84KGIgKyAoMSA8PCAxMykgPj4gMTRcbiAgICAgIC8qRklYRURfRlJBQ19CSVRTKi9cbiAgICAgICk7XG4gICAgICBkZXN0W2Rlc3RPZmZzZXQgKyAxXSA9IGNsYW1wVG84KGcgKyAoMSA8PCAxMykgPj4gMTRcbiAgICAgIC8qRklYRURfRlJBQ19CSVRTKi9cbiAgICAgICk7XG4gICAgICBkZXN0W2Rlc3RPZmZzZXRdID0gY2xhbXBUbzgociArICgxIDw8IDEzKSA+PiAxNFxuICAgICAgLypGSVhFRF9GUkFDX0JJVFMqL1xuICAgICAgKTtcbiAgICAgIGRlc3RPZmZzZXQgPSBkZXN0T2Zmc2V0ICsgc3JjSCAqIDQgfCAwO1xuICAgIH1cblxuICAgIGRlc3RPZmZzZXQgPSAoc3JjWSArIDEpICogNCB8IDA7XG4gICAgc3JjT2Zmc2V0ID0gKHNyY1kgKyAxKSAqIHNyY1cgKiA0IHwgMDtcbiAgfVxufSAvLyBUZWNobmljYWxseSwgY29udm9sdmVycyBhcmUgdGhlIHNhbWUuIEJ1dCBpbnB1dCBhcnJheSBhbmQgdGVtcG9yYXJ5XG4vLyBidWZmZXIgY2FuIGJlIG9mIGRpZmZlcmVudCB0eXBlIChlc3BlY2lhbGx5LCBpbiBvbGQgYnJvd3NlcnMpLiBTbyxcbi8vIGtlZXAgY29kZSBpbiBzZXBhcmF0ZSBmdW5jdGlvbnMgdG8gYXZvaWQgZGVvcHRpbWl6YXRpb25zICYgc3BlZWQgbG9zcy5cblxuXG5mdW5jdGlvbiBjb252b2x2ZVZlcnRpY2FsbHkoc3JjLCBkZXN0LCBzcmNXLCBzcmNILCBkZXN0VywgZmlsdGVycykge1xuICB2YXIgciwgZywgYiwgYTtcbiAgdmFyIGZpbHRlclB0ciwgZmlsdGVyU2hpZnQsIGZpbHRlclNpemU7XG4gIHZhciBzcmNQdHIsIHNyY1ksIGRlc3RYLCBmaWx0ZXJWYWw7XG4gIHZhciBzcmNPZmZzZXQgPSAwLFxuICAgICAgZGVzdE9mZnNldCA9IDA7IC8vIEZvciBlYWNoIHJvd1xuXG4gIGZvciAoc3JjWSA9IDA7IHNyY1kgPCBzcmNIOyBzcmNZKyspIHtcbiAgICBmaWx0ZXJQdHIgPSAwOyAvLyBBcHBseSBwcmVjb21wdXRlZCBmaWx0ZXJzIHRvIGVhY2ggZGVzdGluYXRpb24gcm93IHBvaW50XG5cbiAgICBmb3IgKGRlc3RYID0gMDsgZGVzdFggPCBkZXN0VzsgZGVzdFgrKykge1xuICAgICAgLy8gR2V0IHRoZSBmaWx0ZXIgdGhhdCBkZXRlcm1pbmVzIHRoZSBjdXJyZW50IG91dHB1dCBwaXhlbC5cbiAgICAgIGZpbHRlclNoaWZ0ID0gZmlsdGVyc1tmaWx0ZXJQdHIrK107XG4gICAgICBmaWx0ZXJTaXplID0gZmlsdGVyc1tmaWx0ZXJQdHIrK107XG4gICAgICBzcmNQdHIgPSBzcmNPZmZzZXQgKyBmaWx0ZXJTaGlmdCAqIDQgfCAwO1xuICAgICAgciA9IGcgPSBiID0gYSA9IDA7IC8vIEFwcGx5IHRoZSBmaWx0ZXIgdG8gdGhlIHJvdyB0byBnZXQgdGhlIGRlc3RpbmF0aW9uIHBpeGVsIHIsIGcsIGIsIGFcblxuICAgICAgZm9yICg7IGZpbHRlclNpemUgPiAwOyBmaWx0ZXJTaXplLS0pIHtcbiAgICAgICAgZmlsdGVyVmFsID0gZmlsdGVyc1tmaWx0ZXJQdHIrK107IC8vIFVzZSByZXZlcnNlIG9yZGVyIHRvIHdvcmthcm91bmQgZGVvcHRzIGluIG9sZCB2OCAobm9kZSB2LjEwKVxuICAgICAgICAvLyBCaWcgdGhhbmtzIHRvIEBtcmFsZXBoIChWeWFjaGVzbGF2IEVnb3JvdikgZm9yIHRoZSB0aXAuXG5cbiAgICAgICAgYSA9IGEgKyBmaWx0ZXJWYWwgKiBzcmNbc3JjUHRyICsgM10gfCAwO1xuICAgICAgICBiID0gYiArIGZpbHRlclZhbCAqIHNyY1tzcmNQdHIgKyAyXSB8IDA7XG4gICAgICAgIGcgPSBnICsgZmlsdGVyVmFsICogc3JjW3NyY1B0ciArIDFdIHwgMDtcbiAgICAgICAgciA9IHIgKyBmaWx0ZXJWYWwgKiBzcmNbc3JjUHRyXSB8IDA7XG4gICAgICAgIHNyY1B0ciA9IHNyY1B0ciArIDQgfCAwO1xuICAgICAgfSAvLyBCcmluZyB0aGlzIHZhbHVlIGJhY2sgaW4gcmFuZ2UuIEFsbCBvZiB0aGUgZmlsdGVyIHNjYWxpbmcgZmFjdG9yc1xuICAgICAgLy8gYXJlIGluIGZpeGVkIHBvaW50IHdpdGggRklYRURfRlJBQ19CSVRTIGJpdHMgb2YgZnJhY3Rpb25hbCBwYXJ0LlxuICAgICAgLy9cbiAgICAgIC8vICghKSBBZGQgMS8yIG9mIHZhbHVlIGJlZm9yZSBjbGFtcGluZyB0byBnZXQgcHJvcGVyIHJvdW5kaW5nLiBJbiBvdGhlclxuICAgICAgLy8gY2FzZSBicmlnaHRuZXNzIGxvc3Mgd2lsbCBiZSBub3RpY2VhYmxlIGlmIHlvdSByZXNpemUgaW1hZ2Ugd2l0aCB3aGl0ZVxuICAgICAgLy8gYm9yZGVyIGFuZCBwbGFjZSBpdCBvbiB3aGl0ZSBiYWNrZ3JvdW5kLlxuICAgICAgLy9cblxuXG4gICAgICBkZXN0W2Rlc3RPZmZzZXQgKyAzXSA9IGNsYW1wVG84KGEgKyAoMSA8PCAxMykgPj4gMTRcbiAgICAgIC8qRklYRURfRlJBQ19CSVRTKi9cbiAgICAgICk7XG4gICAgICBkZXN0W2Rlc3RPZmZzZXQgKyAyXSA9IGNsYW1wVG84KGIgKyAoMSA8PCAxMykgPj4gMTRcbiAgICAgIC8qRklYRURfRlJBQ19CSVRTKi9cbiAgICAgICk7XG4gICAgICBkZXN0W2Rlc3RPZmZzZXQgKyAxXSA9IGNsYW1wVG84KGcgKyAoMSA8PCAxMykgPj4gMTRcbiAgICAgIC8qRklYRURfRlJBQ19CSVRTKi9cbiAgICAgICk7XG4gICAgICBkZXN0W2Rlc3RPZmZzZXRdID0gY2xhbXBUbzgociArICgxIDw8IDEzKSA+PiAxNFxuICAgICAgLypGSVhFRF9GUkFDX0JJVFMqL1xuICAgICAgKTtcbiAgICAgIGRlc3RPZmZzZXQgPSBkZXN0T2Zmc2V0ICsgc3JjSCAqIDQgfCAwO1xuICAgIH1cblxuICAgIGRlc3RPZmZzZXQgPSAoc3JjWSArIDEpICogNCB8IDA7XG4gICAgc3JjT2Zmc2V0ID0gKHNyY1kgKyAxKSAqIHNyY1cgKiA0IHwgMDtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgY29udm9sdmVIb3Jpem9udGFsbHk6IGNvbnZvbHZlSG9yaXpvbnRhbGx5LFxuICBjb252b2x2ZVZlcnRpY2FsbHk6IGNvbnZvbHZlVmVydGljYWxseVxufTtcblxufSx7fV0sMzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovXG5cbm1vZHVsZS5leHBvcnRzID0gJ0FHRnpiUUVBQUFBQURBWmtlV3hwYm1zQUFBQUFBQUVYQTJBQUFHQUdmMzkvZjM5L0FHQUhmMzkvZjM5L2Z3QUNEd0VEWlc1MkJtMWxiVzl5ZVFJQUFBTUVBd0FCQWdZR0FYOEFRUUFMQjFjRkVWOWZkMkZ6YlY5allXeHNYMk4wYjNKekFBQUlZMjl1ZG05c2RtVUFBUXBqYjI1MmIyeDJaVWhXQUFJTVgxOWtjMjlmYUdGdVpHeGxBd0FZWDE5M1lYTnRYMkZ3Y0d4NVgyUmhkR0ZmY21Wc2IyTnpBQUFLN0FNREF3QUJDOFlEQVE5L0FrQWdBMFVOQUNBRVJRMEFBMEFnRENFTlFRQWhFMEVBSVFjRFFDQUhRUUpxSVFZQ2Z5QUhRUUYwSUFWcUlnY3VBUUlpRkVVRVFFR0F3QUFoQ0VHQXdBQWhDVUdBd0FBaENrR0F3QUFoQ3lBR0RBRUxJQklnQnk0QkFHb2hDRUVBSVFzZ0ZDRUhRUUFoRGlBR0lRbEJBQ0VQUVFBaEVBTkFJQVVnQ1VFQmRHb3VBUUFpRVNBQUlBaEJBblJxS0FJQUlncEJHSFpzSUJCcUlSQWdDa0gvQVhFZ0VXd2dDMm9oQ3lBS1FSQjJRZjhCY1NBUmJDQVBhaUVQSUFwQkNIWkIvd0Z4SUJGc0lBNXFJUTRnQ0VFQmFpRUlJQWxCQVdvaENTQUhRUUZySWdjTkFBc2dDMEdBUUdzaENDQU9RWUJBYXlFSklBOUJnRUJySVFvZ0VFR0FRR3NoQ3lBR0lCUnFDeUVISUFFZ0RVRUNkR29nQ1VFT2RTSUdRZjhCSUFaQi93RklHeUlHUVFBZ0JrRUFTaHRCQ0hSQmdQNERjU0FLUVE1MUlnWkIvd0VnQmtIL0FVZ2JJZ1pCQUNBR1FRQktHMEVRZEVHQWdQd0hjU0FMUVE1MUlnWkIvd0VnQmtIL0FVZ2JJZ1pCQUNBR1FRQktHMEVZZEhKeUlBaEJEblVpQmtIL0FTQUdRZjhCU0JzaUJrRUFJQVpCQUVvYmNqWUNBQ0FESUExcUlRMGdFMEVCYWlJVElBUkhEUUFMSUF4QkFXb2lEQ0FDYkNFU0lBTWdERWNOQUFzTEN4NEFRUUFnQWlBRElBUWdCU0FBRUFFZ0FrRUFJQVFnQlNBR0lBRVFBUXM9JztcblxufSx7fV0sNDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBuYW1lOiAncmVzaXplJyxcbiAgZm46IF9kZXJlcV8oJy4vcmVzaXplJyksXG4gIHdhc21fZm46IF9kZXJlcV8oJy4vcmVzaXplX3dhc20nKSxcbiAgd2FzbV9zcmM6IF9kZXJlcV8oJy4vY29udm9sdmVfd2FzbV9iYXNlNjQnKVxufTtcblxufSx7XCIuL2NvbnZvbHZlX3dhc21fYmFzZTY0XCI6MyxcIi4vcmVzaXplXCI6NSxcIi4vcmVzaXplX3dhc21cIjo4fV0sNTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cbnZhciBjcmVhdGVGaWx0ZXJzID0gX2RlcmVxXygnLi9yZXNpemVfZmlsdGVyX2dlbicpO1xuXG52YXIgY29udm9sdmVIb3Jpem9udGFsbHkgPSBfZGVyZXFfKCcuL2NvbnZvbHZlJykuY29udm9sdmVIb3Jpem9udGFsbHk7XG5cbnZhciBjb252b2x2ZVZlcnRpY2FsbHkgPSBfZGVyZXFfKCcuL2NvbnZvbHZlJykuY29udm9sdmVWZXJ0aWNhbGx5O1xuXG5mdW5jdGlvbiByZXNldEFscGhhKGRzdCwgd2lkdGgsIGhlaWdodCkge1xuICB2YXIgcHRyID0gMyxcbiAgICAgIGxlbiA9IHdpZHRoICogaGVpZ2h0ICogNCB8IDA7XG5cbiAgd2hpbGUgKHB0ciA8IGxlbikge1xuICAgIGRzdFtwdHJdID0gMHhGRjtcbiAgICBwdHIgPSBwdHIgKyA0IHwgMDtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHJlc2l6ZShvcHRpb25zKSB7XG4gIHZhciBzcmMgPSBvcHRpb25zLnNyYztcbiAgdmFyIHNyY1cgPSBvcHRpb25zLndpZHRoO1xuICB2YXIgc3JjSCA9IG9wdGlvbnMuaGVpZ2h0O1xuICB2YXIgZGVzdFcgPSBvcHRpb25zLnRvV2lkdGg7XG4gIHZhciBkZXN0SCA9IG9wdGlvbnMudG9IZWlnaHQ7XG4gIHZhciBzY2FsZVggPSBvcHRpb25zLnNjYWxlWCB8fCBvcHRpb25zLnRvV2lkdGggLyBvcHRpb25zLndpZHRoO1xuICB2YXIgc2NhbGVZID0gb3B0aW9ucy5zY2FsZVkgfHwgb3B0aW9ucy50b0hlaWdodCAvIG9wdGlvbnMuaGVpZ2h0O1xuICB2YXIgb2Zmc2V0WCA9IG9wdGlvbnMub2Zmc2V0WCB8fCAwO1xuICB2YXIgb2Zmc2V0WSA9IG9wdGlvbnMub2Zmc2V0WSB8fCAwO1xuICB2YXIgZGVzdCA9IG9wdGlvbnMuZGVzdCB8fCBuZXcgVWludDhBcnJheShkZXN0VyAqIGRlc3RIICogNCk7XG4gIHZhciBxdWFsaXR5ID0gdHlwZW9mIG9wdGlvbnMucXVhbGl0eSA9PT0gJ3VuZGVmaW5lZCcgPyAzIDogb3B0aW9ucy5xdWFsaXR5O1xuICB2YXIgYWxwaGEgPSBvcHRpb25zLmFscGhhIHx8IGZhbHNlO1xuICB2YXIgZmlsdGVyc1ggPSBjcmVhdGVGaWx0ZXJzKHF1YWxpdHksIHNyY1csIGRlc3RXLCBzY2FsZVgsIG9mZnNldFgpLFxuICAgICAgZmlsdGVyc1kgPSBjcmVhdGVGaWx0ZXJzKHF1YWxpdHksIHNyY0gsIGRlc3RILCBzY2FsZVksIG9mZnNldFkpO1xuICB2YXIgdG1wID0gbmV3IFVpbnQ4QXJyYXkoZGVzdFcgKiBzcmNIICogNCk7IC8vIFRvIHVzZSBzaW5nbGUgZnVuY3Rpb24gd2UgbmVlZCBzcmMgJiB0bXAgb2YgdGhlIHNhbWUgdHlwZS5cbiAgLy8gQnV0IHNyYyBjYW4gYmUgQ2FudmFzUGl4ZWxBcnJheSwgYW5kIHRtcCAtIFVpbnQ4QXJyYXkuIFNvLCBrZWVwXG4gIC8vIHZlcnRpY2FsIGFuZCBob3Jpem9udGFsIHBhc3NlcyBzZXBhcmF0ZWx5IHRvIGF2b2lkIGRlb3B0aW1pemF0aW9uLlxuXG4gIGNvbnZvbHZlSG9yaXpvbnRhbGx5KHNyYywgdG1wLCBzcmNXLCBzcmNILCBkZXN0VywgZmlsdGVyc1gpO1xuICBjb252b2x2ZVZlcnRpY2FsbHkodG1wLCBkZXN0LCBzcmNILCBkZXN0VywgZGVzdEgsIGZpbHRlcnNZKTsgLy8gVGhhdCdzIGZhc3RlciB0aGFuIGRvaW5nIGNoZWNrcyBpbiBjb252b2x2ZXIuXG4gIC8vICEhISBOb3RlLCBjYW52YXMgZGF0YSBpcyBub3QgcHJlbXVsdGlwbGVkLiBXZSBkb24ndCBuZWVkIG90aGVyXG4gIC8vIGFscGhhIGNvcnJlY3Rpb25zLlxuXG4gIGlmICghYWxwaGEpIHJlc2V0QWxwaGEoZGVzdCwgZGVzdFcsIGRlc3RIKTtcbiAgcmV0dXJuIGRlc3Q7XG59O1xuXG59LHtcIi4vY29udm9sdmVcIjoyLFwiLi9yZXNpemVfZmlsdGVyX2dlblwiOjZ9XSw2OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblxudmFyIEZJTFRFUl9JTkZPID0gX2RlcmVxXygnLi9yZXNpemVfZmlsdGVyX2luZm8nKTsgLy8gUHJlY2lzaW9uIG9mIGZpeGVkIEZQIHZhbHVlc1xuXG5cbnZhciBGSVhFRF9GUkFDX0JJVFMgPSAxNDtcblxuZnVuY3Rpb24gdG9GaXhlZFBvaW50KG51bSkge1xuICByZXR1cm4gTWF0aC5yb3VuZChudW0gKiAoKDEgPDwgRklYRURfRlJBQ19CSVRTKSAtIDEpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiByZXNpemVGaWx0ZXJHZW4ocXVhbGl0eSwgc3JjU2l6ZSwgZGVzdFNpemUsIHNjYWxlLCBvZmZzZXQpIHtcbiAgdmFyIGZpbHRlckZ1bmN0aW9uID0gRklMVEVSX0lORk9bcXVhbGl0eV0uZmlsdGVyO1xuICB2YXIgc2NhbGVJbnZlcnRlZCA9IDEuMCAvIHNjYWxlO1xuICB2YXIgc2NhbGVDbGFtcGVkID0gTWF0aC5taW4oMS4wLCBzY2FsZSk7IC8vIEZvciB1cHNjYWxlXG4gIC8vIEZpbHRlciB3aW5kb3cgKGF2ZXJhZ2luZyBpbnRlcnZhbCksIHNjYWxlZCB0byBzcmMgaW1hZ2VcblxuICB2YXIgc3JjV2luZG93ID0gRklMVEVSX0lORk9bcXVhbGl0eV0ud2luIC8gc2NhbGVDbGFtcGVkO1xuICB2YXIgZGVzdFBpeGVsLCBzcmNQaXhlbCwgc3JjRmlyc3QsIHNyY0xhc3QsIGZpbHRlckVsZW1lbnRTaXplLCBmbG9hdEZpbHRlciwgZnhwRmlsdGVyLCB0b3RhbCwgcHhsLCBpZHgsIGZsb2F0VmFsLCBmaWx0ZXJUb3RhbCwgZmlsdGVyVmFsO1xuICB2YXIgbGVmdE5vdEVtcHR5LCByaWdodE5vdEVtcHR5LCBmaWx0ZXJTaGlmdCwgZmlsdGVyU2l6ZTtcbiAgdmFyIG1heEZpbHRlckVsZW1lbnRTaXplID0gTWF0aC5mbG9vcigoc3JjV2luZG93ICsgMSkgKiAyKTtcbiAgdmFyIHBhY2tlZEZpbHRlciA9IG5ldyBJbnQxNkFycmF5KChtYXhGaWx0ZXJFbGVtZW50U2l6ZSArIDIpICogZGVzdFNpemUpO1xuICB2YXIgcGFja2VkRmlsdGVyUHRyID0gMDtcbiAgdmFyIHNsb3dDb3B5ID0gIXBhY2tlZEZpbHRlci5zdWJhcnJheSB8fCAhcGFja2VkRmlsdGVyLnNldDsgLy8gRm9yIGVhY2ggZGVzdGluYXRpb24gcGl4ZWwgY2FsY3VsYXRlIHNvdXJjZSByYW5nZSBhbmQgYnVpbHQgZmlsdGVyIHZhbHVlc1xuXG4gIGZvciAoZGVzdFBpeGVsID0gMDsgZGVzdFBpeGVsIDwgZGVzdFNpemU7IGRlc3RQaXhlbCsrKSB7XG4gICAgLy8gU2NhbGluZyBzaG91bGQgYmUgZG9uZSByZWxhdGl2ZSB0byBjZW50cmFsIHBpeGVsIHBvaW50XG4gICAgc3JjUGl4ZWwgPSAoZGVzdFBpeGVsICsgMC41KSAqIHNjYWxlSW52ZXJ0ZWQgKyBvZmZzZXQ7XG4gICAgc3JjRmlyc3QgPSBNYXRoLm1heCgwLCBNYXRoLmZsb29yKHNyY1BpeGVsIC0gc3JjV2luZG93KSk7XG4gICAgc3JjTGFzdCA9IE1hdGgubWluKHNyY1NpemUgLSAxLCBNYXRoLmNlaWwoc3JjUGl4ZWwgKyBzcmNXaW5kb3cpKTtcbiAgICBmaWx0ZXJFbGVtZW50U2l6ZSA9IHNyY0xhc3QgLSBzcmNGaXJzdCArIDE7XG4gICAgZmxvYXRGaWx0ZXIgPSBuZXcgRmxvYXQzMkFycmF5KGZpbHRlckVsZW1lbnRTaXplKTtcbiAgICBmeHBGaWx0ZXIgPSBuZXcgSW50MTZBcnJheShmaWx0ZXJFbGVtZW50U2l6ZSk7XG4gICAgdG90YWwgPSAwLjA7IC8vIEZpbGwgZmlsdGVyIHZhbHVlcyBmb3IgY2FsY3VsYXRlZCByYW5nZVxuXG4gICAgZm9yIChweGwgPSBzcmNGaXJzdCwgaWR4ID0gMDsgcHhsIDw9IHNyY0xhc3Q7IHB4bCsrLCBpZHgrKykge1xuICAgICAgZmxvYXRWYWwgPSBmaWx0ZXJGdW5jdGlvbigocHhsICsgMC41IC0gc3JjUGl4ZWwpICogc2NhbGVDbGFtcGVkKTtcbiAgICAgIHRvdGFsICs9IGZsb2F0VmFsO1xuICAgICAgZmxvYXRGaWx0ZXJbaWR4XSA9IGZsb2F0VmFsO1xuICAgIH0gLy8gTm9ybWFsaXplIGZpbHRlciwgY29udmVydCB0byBmaXhlZCBwb2ludCBhbmQgYWNjdW11bGF0ZSBjb252ZXJzaW9uIGVycm9yXG5cblxuICAgIGZpbHRlclRvdGFsID0gMDtcblxuICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgZmxvYXRGaWx0ZXIubGVuZ3RoOyBpZHgrKykge1xuICAgICAgZmlsdGVyVmFsID0gZmxvYXRGaWx0ZXJbaWR4XSAvIHRvdGFsO1xuICAgICAgZmlsdGVyVG90YWwgKz0gZmlsdGVyVmFsO1xuICAgICAgZnhwRmlsdGVyW2lkeF0gPSB0b0ZpeGVkUG9pbnQoZmlsdGVyVmFsKTtcbiAgICB9IC8vIENvbXBlbnNhdGUgbm9ybWFsaXphdGlvbiBlcnJvciwgdG8gbWluaW1pemUgYnJpZ2h0bmVzcyBkcmlmdFxuXG5cbiAgICBmeHBGaWx0ZXJbZGVzdFNpemUgPj4gMV0gKz0gdG9GaXhlZFBvaW50KDEuMCAtIGZpbHRlclRvdGFsKTsgLy9cbiAgICAvLyBOb3cgcGFjayBmaWx0ZXIgdG8gdXNlYWJsZSBmb3JtXG4gICAgLy9cbiAgICAvLyAxLiBUcmltIGhlYWRpbmcgYW5kIHRhaWxpbmcgemVybyB2YWx1ZXMsIGFuZCBjb21wZW5zYXRlIHNoaXRmL2xlbmd0aFxuICAgIC8vIDIuIFB1dCBhbGwgdG8gc2luZ2xlIGFycmF5IGluIHRoaXMgZm9ybWF0OlxuICAgIC8vXG4gICAgLy8gICAgWyBwb3Mgc2hpZnQsIGRhdGEgbGVuZ3RoLCB2YWx1ZTEsIHZhbHVlMiwgdmFsdWUzLCAuLi4gXVxuICAgIC8vXG5cbiAgICBsZWZ0Tm90RW1wdHkgPSAwO1xuXG4gICAgd2hpbGUgKGxlZnROb3RFbXB0eSA8IGZ4cEZpbHRlci5sZW5ndGggJiYgZnhwRmlsdGVyW2xlZnROb3RFbXB0eV0gPT09IDApIHtcbiAgICAgIGxlZnROb3RFbXB0eSsrO1xuICAgIH1cblxuICAgIGlmIChsZWZ0Tm90RW1wdHkgPCBmeHBGaWx0ZXIubGVuZ3RoKSB7XG4gICAgICByaWdodE5vdEVtcHR5ID0gZnhwRmlsdGVyLmxlbmd0aCAtIDE7XG5cbiAgICAgIHdoaWxlIChyaWdodE5vdEVtcHR5ID4gMCAmJiBmeHBGaWx0ZXJbcmlnaHROb3RFbXB0eV0gPT09IDApIHtcbiAgICAgICAgcmlnaHROb3RFbXB0eS0tO1xuICAgICAgfVxuXG4gICAgICBmaWx0ZXJTaGlmdCA9IHNyY0ZpcnN0ICsgbGVmdE5vdEVtcHR5O1xuICAgICAgZmlsdGVyU2l6ZSA9IHJpZ2h0Tm90RW1wdHkgLSBsZWZ0Tm90RW1wdHkgKyAxO1xuICAgICAgcGFja2VkRmlsdGVyW3BhY2tlZEZpbHRlclB0cisrXSA9IGZpbHRlclNoaWZ0OyAvLyBzaGlmdFxuXG4gICAgICBwYWNrZWRGaWx0ZXJbcGFja2VkRmlsdGVyUHRyKytdID0gZmlsdGVyU2l6ZTsgLy8gc2l6ZVxuXG4gICAgICBpZiAoIXNsb3dDb3B5KSB7XG4gICAgICAgIHBhY2tlZEZpbHRlci5zZXQoZnhwRmlsdGVyLnN1YmFycmF5KGxlZnROb3RFbXB0eSwgcmlnaHROb3RFbXB0eSArIDEpLCBwYWNrZWRGaWx0ZXJQdHIpO1xuICAgICAgICBwYWNrZWRGaWx0ZXJQdHIgKz0gZmlsdGVyU2l6ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGZhbGxiYWNrIGZvciBvbGQgSUUgPCAxMSwgd2l0aG91dCBzdWJhcnJheS9zZXQgbWV0aG9kc1xuICAgICAgICBmb3IgKGlkeCA9IGxlZnROb3RFbXB0eTsgaWR4IDw9IHJpZ2h0Tm90RW1wdHk7IGlkeCsrKSB7XG4gICAgICAgICAgcGFja2VkRmlsdGVyW3BhY2tlZEZpbHRlclB0cisrXSA9IGZ4cEZpbHRlcltpZHhdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHplcm8gZGF0YSwgd3JpdGUgaGVhZGVyIG9ubHlcbiAgICAgIHBhY2tlZEZpbHRlcltwYWNrZWRGaWx0ZXJQdHIrK10gPSAwOyAvLyBzaGlmdFxuXG4gICAgICBwYWNrZWRGaWx0ZXJbcGFja2VkRmlsdGVyUHRyKytdID0gMDsgLy8gc2l6ZVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwYWNrZWRGaWx0ZXI7XG59O1xuXG59LHtcIi4vcmVzaXplX2ZpbHRlcl9pbmZvXCI6N31dLDc6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXG5tb2R1bGUuZXhwb3J0cyA9IFt7XG4gIC8vIE5lYXJlc3QgbmVpYm9yIChCb3gpXG4gIHdpbjogMC41LFxuICBmaWx0ZXI6IGZ1bmN0aW9uIGZpbHRlcih4KSB7XG4gICAgcmV0dXJuIHggPj0gLTAuNSAmJiB4IDwgMC41ID8gMS4wIDogMC4wO1xuICB9XG59LCB7XG4gIC8vIEhhbW1pbmdcbiAgd2luOiAxLjAsXG4gIGZpbHRlcjogZnVuY3Rpb24gZmlsdGVyKHgpIHtcbiAgICBpZiAoeCA8PSAtMS4wIHx8IHggPj0gMS4wKSB7XG4gICAgICByZXR1cm4gMC4wO1xuICAgIH1cblxuICAgIGlmICh4ID4gLTEuMTkyMDkyOTBFLTA3ICYmIHggPCAxLjE5MjA5MjkwRS0wNykge1xuICAgICAgcmV0dXJuIDEuMDtcbiAgICB9XG5cbiAgICB2YXIgeHBpID0geCAqIE1hdGguUEk7XG4gICAgcmV0dXJuIE1hdGguc2luKHhwaSkgLyB4cGkgKiAoMC41NCArIDAuNDYgKiBNYXRoLmNvcyh4cGkgLyAxLjApKTtcbiAgfVxufSwge1xuICAvLyBMYW5jem9zLCB3aW4gPSAyXG4gIHdpbjogMi4wLFxuICBmaWx0ZXI6IGZ1bmN0aW9uIGZpbHRlcih4KSB7XG4gICAgaWYgKHggPD0gLTIuMCB8fCB4ID49IDIuMCkge1xuICAgICAgcmV0dXJuIDAuMDtcbiAgICB9XG5cbiAgICBpZiAoeCA+IC0xLjE5MjA5MjkwRS0wNyAmJiB4IDwgMS4xOTIwOTI5MEUtMDcpIHtcbiAgICAgIHJldHVybiAxLjA7XG4gICAgfVxuXG4gICAgdmFyIHhwaSA9IHggKiBNYXRoLlBJO1xuICAgIHJldHVybiBNYXRoLnNpbih4cGkpIC8geHBpICogTWF0aC5zaW4oeHBpIC8gMi4wKSAvICh4cGkgLyAyLjApO1xuICB9XG59LCB7XG4gIC8vIExhbmN6b3MsIHdpbiA9IDNcbiAgd2luOiAzLjAsXG4gIGZpbHRlcjogZnVuY3Rpb24gZmlsdGVyKHgpIHtcbiAgICBpZiAoeCA8PSAtMy4wIHx8IHggPj0gMy4wKSB7XG4gICAgICByZXR1cm4gMC4wO1xuICAgIH1cblxuICAgIGlmICh4ID4gLTEuMTkyMDkyOTBFLTA3ICYmIHggPCAxLjE5MjA5MjkwRS0wNykge1xuICAgICAgcmV0dXJuIDEuMDtcbiAgICB9XG5cbiAgICB2YXIgeHBpID0geCAqIE1hdGguUEk7XG4gICAgcmV0dXJuIE1hdGguc2luKHhwaSkgLyB4cGkgKiBNYXRoLnNpbih4cGkgLyAzLjApIC8gKHhwaSAvIDMuMCk7XG4gIH1cbn1dO1xuXG59LHt9XSw4OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblxudmFyIGNyZWF0ZUZpbHRlcnMgPSBfZGVyZXFfKCcuL3Jlc2l6ZV9maWx0ZXJfZ2VuJyk7XG5cbmZ1bmN0aW9uIHJlc2V0QWxwaGEoZHN0LCB3aWR0aCwgaGVpZ2h0KSB7XG4gIHZhciBwdHIgPSAzLFxuICAgICAgbGVuID0gd2lkdGggKiBoZWlnaHQgKiA0IHwgMDtcblxuICB3aGlsZSAocHRyIDwgbGVuKSB7XG4gICAgZHN0W3B0cl0gPSAweEZGO1xuICAgIHB0ciA9IHB0ciArIDQgfCAwO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFzVWludDhBcnJheShzcmMpIHtcbiAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHNyYy5idWZmZXIsIDAsIHNyYy5ieXRlTGVuZ3RoKTtcbn1cblxudmFyIElTX0xFID0gdHJ1ZTsgLy8gc2hvdWxkIG5vdCBjcmFzaCBldmVyeXRoaW5nIG9uIG1vZHVsZSBsb2FkIGluIG9sZCBicm93c2Vyc1xuXG50cnkge1xuICBJU19MRSA9IG5ldyBVaW50MzJBcnJheShuZXcgVWludDhBcnJheShbMSwgMCwgMCwgMF0pLmJ1ZmZlcilbMF0gPT09IDE7XG59IGNhdGNoIChfXykge31cblxuZnVuY3Rpb24gY29weUludDE2YXNMRShzcmMsIHRhcmdldCwgdGFyZ2V0X29mZnNldCkge1xuICBpZiAoSVNfTEUpIHtcbiAgICB0YXJnZXQuc2V0KGFzVWludDhBcnJheShzcmMpLCB0YXJnZXRfb2Zmc2V0KTtcbiAgICByZXR1cm47XG4gIH1cblxuICBmb3IgKHZhciBwdHIgPSB0YXJnZXRfb2Zmc2V0LCBpID0gMDsgaSA8IHNyYy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkYXRhID0gc3JjW2ldO1xuICAgIHRhcmdldFtwdHIrK10gPSBkYXRhICYgMHhGRjtcbiAgICB0YXJnZXRbcHRyKytdID0gZGF0YSA+PiA4ICYgMHhGRjtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHJlc2l6ZV93YXNtKG9wdGlvbnMpIHtcbiAgdmFyIHNyYyA9IG9wdGlvbnMuc3JjO1xuICB2YXIgc3JjVyA9IG9wdGlvbnMud2lkdGg7XG4gIHZhciBzcmNIID0gb3B0aW9ucy5oZWlnaHQ7XG4gIHZhciBkZXN0VyA9IG9wdGlvbnMudG9XaWR0aDtcbiAgdmFyIGRlc3RIID0gb3B0aW9ucy50b0hlaWdodDtcbiAgdmFyIHNjYWxlWCA9IG9wdGlvbnMuc2NhbGVYIHx8IG9wdGlvbnMudG9XaWR0aCAvIG9wdGlvbnMud2lkdGg7XG4gIHZhciBzY2FsZVkgPSBvcHRpb25zLnNjYWxlWSB8fCBvcHRpb25zLnRvSGVpZ2h0IC8gb3B0aW9ucy5oZWlnaHQ7XG4gIHZhciBvZmZzZXRYID0gb3B0aW9ucy5vZmZzZXRYIHx8IDAuMDtcbiAgdmFyIG9mZnNldFkgPSBvcHRpb25zLm9mZnNldFkgfHwgMC4wO1xuICB2YXIgZGVzdCA9IG9wdGlvbnMuZGVzdCB8fCBuZXcgVWludDhBcnJheShkZXN0VyAqIGRlc3RIICogNCk7XG4gIHZhciBxdWFsaXR5ID0gdHlwZW9mIG9wdGlvbnMucXVhbGl0eSA9PT0gJ3VuZGVmaW5lZCcgPyAzIDogb3B0aW9ucy5xdWFsaXR5O1xuICB2YXIgYWxwaGEgPSBvcHRpb25zLmFscGhhIHx8IGZhbHNlO1xuICB2YXIgZmlsdGVyc1ggPSBjcmVhdGVGaWx0ZXJzKHF1YWxpdHksIHNyY1csIGRlc3RXLCBzY2FsZVgsIG9mZnNldFgpLFxuICAgICAgZmlsdGVyc1kgPSBjcmVhdGVGaWx0ZXJzKHF1YWxpdHksIHNyY0gsIGRlc3RILCBzY2FsZVksIG9mZnNldFkpOyAvLyBkZXN0aW5hdGlvbiBpcyAwIHRvby5cblxuICB2YXIgc3JjX29mZnNldCA9IDA7IC8vIGJ1ZmZlciBiZXR3ZWVuIGNvbnZvbHZlIHBhc3Nlc1xuXG4gIHZhciB0bXBfb2Zmc2V0ID0gdGhpcy5fX2FsaWduKHNyY19vZmZzZXQgKyBNYXRoLm1heChzcmMuYnl0ZUxlbmd0aCwgZGVzdC5ieXRlTGVuZ3RoKSk7XG5cbiAgdmFyIGZpbHRlcnNYX29mZnNldCA9IHRoaXMuX19hbGlnbih0bXBfb2Zmc2V0ICsgc3JjSCAqIGRlc3RXICogNCk7XG5cbiAgdmFyIGZpbHRlcnNZX29mZnNldCA9IHRoaXMuX19hbGlnbihmaWx0ZXJzWF9vZmZzZXQgKyBmaWx0ZXJzWC5ieXRlTGVuZ3RoKTtcblxuICB2YXIgYWxsb2NfYnl0ZXMgPSBmaWx0ZXJzWV9vZmZzZXQgKyBmaWx0ZXJzWS5ieXRlTGVuZ3RoO1xuXG4gIHZhciBpbnN0YW5jZSA9IHRoaXMuX19pbnN0YW5jZSgncmVzaXplJywgYWxsb2NfYnl0ZXMpOyAvL1xuICAvLyBGaWxsIG1lbW9yeSBibG9jayB3aXRoIGRhdGEgdG8gcHJvY2Vzc1xuICAvL1xuXG5cbiAgdmFyIG1lbSA9IG5ldyBVaW50OEFycmF5KHRoaXMuX19tZW1vcnkuYnVmZmVyKTtcbiAgdmFyIG1lbTMyID0gbmV3IFVpbnQzMkFycmF5KHRoaXMuX19tZW1vcnkuYnVmZmVyKTsgLy8gMzItYml0IGNvcHkgaXMgbXVjaCBmYXN0ZXIgaW4gY2hyb21lXG5cbiAgdmFyIHNyYzMyID0gbmV3IFVpbnQzMkFycmF5KHNyYy5idWZmZXIpO1xuICBtZW0zMi5zZXQoc3JjMzIpOyAvLyBXZSBzaG91bGQgZ3VhcmFudGVlIExFIGJ5dGVzIG9yZGVyLiBGaWx0ZXJzIGFyZSBub3QgYmlnLCBzb1xuICAvLyBzcGVlZCBkaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCB2cyBkaXJlY3QgLnNldCgpXG5cbiAgY29weUludDE2YXNMRShmaWx0ZXJzWCwgbWVtLCBmaWx0ZXJzWF9vZmZzZXQpO1xuICBjb3B5SW50MTZhc0xFKGZpbHRlcnNZLCBtZW0sIGZpbHRlcnNZX29mZnNldCk7IC8vXG4gIC8vIE5vdyBjYWxsIHdlYmFzc2VtYmx5IG1ldGhvZFxuICAvLyBlbXNkayBkb2VzIG1ldGhvZCBuYW1lcyB3aXRoICdfJ1xuXG4gIHZhciBmbiA9IGluc3RhbmNlLmV4cG9ydHMuY29udm9sdmVIViB8fCBpbnN0YW5jZS5leHBvcnRzLl9jb252b2x2ZUhWO1xuICBmbihmaWx0ZXJzWF9vZmZzZXQsIGZpbHRlcnNZX29mZnNldCwgdG1wX29mZnNldCwgc3JjVywgc3JjSCwgZGVzdFcsIGRlc3RIKTsgLy9cbiAgLy8gQ29weSBkYXRhIGJhY2sgdG8gdHlwZWQgYXJyYXlcbiAgLy9cbiAgLy8gMzItYml0IGNvcHkgaXMgbXVjaCBmYXN0ZXIgaW4gY2hyb21lXG5cbiAgdmFyIGRlc3QzMiA9IG5ldyBVaW50MzJBcnJheShkZXN0LmJ1ZmZlcik7XG4gIGRlc3QzMi5zZXQobmV3IFVpbnQzMkFycmF5KHRoaXMuX19tZW1vcnkuYnVmZmVyLCAwLCBkZXN0SCAqIGRlc3RXKSk7IC8vIFRoYXQncyBmYXN0ZXIgdGhhbiBkb2luZyBjaGVja3MgaW4gY29udm9sdmVyLlxuICAvLyAhISEgTm90ZSwgY2FudmFzIGRhdGEgaXMgbm90IHByZW11bHRpcGxlZC4gV2UgZG9uJ3QgbmVlZCBvdGhlclxuICAvLyBhbHBoYSBjb3JyZWN0aW9ucy5cblxuICBpZiAoIWFscGhhKSByZXNldEFscGhhKGRlc3QsIGRlc3RXLCBkZXN0SCk7XG4gIHJldHVybiBkZXN0O1xufTtcblxufSx7XCIuL3Jlc2l6ZV9maWx0ZXJfZ2VuXCI6Nn1dLDk6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgbmFtZTogJ3Vuc2hhcnBfbWFzaycsXG4gIGZuOiBfZGVyZXFfKCcuL3Vuc2hhcnBfbWFzaycpLFxuICB3YXNtX2ZuOiBfZGVyZXFfKCcuL3Vuc2hhcnBfbWFza193YXNtJyksXG4gIHdhc21fc3JjOiBfZGVyZXFfKCcuL3Vuc2hhcnBfbWFza193YXNtX2Jhc2U2NCcpXG59O1xuXG59LHtcIi4vdW5zaGFycF9tYXNrXCI6MTAsXCIuL3Vuc2hhcnBfbWFza193YXNtXCI6MTEsXCIuL3Vuc2hhcnBfbWFza193YXNtX2Jhc2U2NFwiOjEyfV0sMTA6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXG52YXIgZ2x1cl9tb25vMTYgPSBfZGVyZXFfKCdnbHVyL21vbm8xNicpO1xuXG5mdW5jdGlvbiBoc3ZfdjE2KGltZywgd2lkdGgsIGhlaWdodCkge1xuICB2YXIgc2l6ZSA9IHdpZHRoICogaGVpZ2h0O1xuICB2YXIgb3V0ID0gbmV3IFVpbnQxNkFycmF5KHNpemUpO1xuICB2YXIgciwgZywgYiwgbWF4O1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgciA9IGltZ1s0ICogaV07XG4gICAgZyA9IGltZ1s0ICogaSArIDFdO1xuICAgIGIgPSBpbWdbNCAqIGkgKyAyXTtcbiAgICBtYXggPSByID49IGcgJiYgciA+PSBiID8gciA6IGcgPj0gYiAmJiBnID49IHIgPyBnIDogYjtcbiAgICBvdXRbaV0gPSBtYXggPDwgODtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gdW5zaGFycChpbWcsIHdpZHRoLCBoZWlnaHQsIGFtb3VudCwgcmFkaXVzLCB0aHJlc2hvbGQpIHtcbiAgdmFyIHYxLCB2Miwgdm11bDtcbiAgdmFyIGRpZmYsIGlUaW1lczQ7XG5cbiAgaWYgKGFtb3VudCA9PT0gMCB8fCByYWRpdXMgPCAwLjUpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAocmFkaXVzID4gMi4wKSB7XG4gICAgcmFkaXVzID0gMi4wO1xuICB9XG5cbiAgdmFyIGJyaWdodG5lc3MgPSBoc3ZfdjE2KGltZywgd2lkdGgsIGhlaWdodCk7XG4gIHZhciBibHVyZWQgPSBuZXcgVWludDE2QXJyYXkoYnJpZ2h0bmVzcyk7IC8vIGNvcHksIGJlY2F1c2UgYmx1ciBtb2RpZnkgc3JjXG5cbiAgZ2x1cl9tb25vMTYoYmx1cmVkLCB3aWR0aCwgaGVpZ2h0LCByYWRpdXMpO1xuICB2YXIgYW1vdW50RnAgPSBhbW91bnQgLyAxMDAgKiAweDEwMDAgKyAwLjUgfCAwO1xuICB2YXIgdGhyZXNob2xkRnAgPSB0aHJlc2hvbGQgPDwgODtcbiAgdmFyIHNpemUgPSB3aWR0aCAqIGhlaWdodDtcbiAgLyogZXNsaW50LWRpc2FibGUgaW5kZW50ICovXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcbiAgICB2MSA9IGJyaWdodG5lc3NbaV07XG4gICAgZGlmZiA9IHYxIC0gYmx1cmVkW2ldO1xuXG4gICAgaWYgKE1hdGguYWJzKGRpZmYpID49IHRocmVzaG9sZEZwKSB7XG4gICAgICAvLyBhZGQgdW5zaGFycCBtYXNrIHRvIHRoZSBicmlnaHRuZXNzIGNoYW5uZWxcbiAgICAgIHYyID0gdjEgKyAoYW1vdW50RnAgKiBkaWZmICsgMHg4MDAgPj4gMTIpOyAvLyBCb3RoIHYxIGFuZCB2MiBhcmUgd2l0aGluIFswLjAgLi4gMjU1LjBdICgwMDAwLUZGMDApIHJhbmdlLCBuZXZlciBnb2luZyBpbnRvXG4gICAgICAvLyBbMjU1LjAwMyAuLiAyNTUuOTk2XSAoRkYwMS1GRkZGKS4gVGhpcyBhbGxvd3MgdG8gcm91bmQgdGhpcyB2YWx1ZSBhcyAoeCsuNSl8MFxuICAgICAgLy8gbGF0ZXIgd2l0aG91dCBvdmVyZmxvd2luZy5cblxuICAgICAgdjIgPSB2MiA+IDB4ZmYwMCA/IDB4ZmYwMCA6IHYyO1xuICAgICAgdjIgPSB2MiA8IDB4MDAwMCA/IDB4MDAwMCA6IHYyOyAvLyBBdm9pZCBkaXZpc2lvbiBieSAwLiBWPTAgbWVhbnMgcmdiKDAsMCwwKSwgdW5zaGFycCB3aXRoIHVuc2hhcnBBbW91bnQ+MCBjYW5ub3RcbiAgICAgIC8vIGNoYW5nZSB0aGlzIHZhbHVlIChiZWNhdXNlIGRpZmYgYmV0d2VlbiBjb2xvcnMgZ2V0cyBpbmZsYXRlZCksIHNvIG5vIG5lZWQgdG8gdmVyaWZ5IGNvcnJlY3RuZXNzLlxuXG4gICAgICB2MSA9IHYxICE9PSAwID8gdjEgOiAxOyAvLyBNdWx0aXBseWluZyBWIGluIEhTViBtb2RlbCBieSBhIGNvbnN0YW50IGlzIGVxdWl2YWxlbnQgdG8gbXVsdGlwbHlpbmcgZWFjaCBjb21wb25lbnRcbiAgICAgIC8vIGluIFJHQiBieSB0aGUgc2FtZSBjb25zdGFudCAoc2FtZSBmb3IgSFNMKSwgc2VlIGFsc286XG4gICAgICAvLyBodHRwczovL2JlZXNidXp6LmJpei9jb2RlLzE2LWhzdi1jb2xvci10cmFuc2Zvcm1zXG5cbiAgICAgIHZtdWwgPSAodjIgPDwgMTIpIC8gdjEgfCAwOyAvLyBSZXN1bHQgd2lsbCBiZSBpbiBbMC4uMjU1XSByYW5nZSBiZWNhdXNlOlxuICAgICAgLy8gIC0gYWxsIG51bWJlcnMgYXJlIHBvc2l0aXZlXG4gICAgICAvLyAgLSByLGcsYiA8PSAodjEvMjU2KVxuICAgICAgLy8gIC0gcixnLGIsKHYxLzI1NiksKHYyLzI1NikgPD0gMjU1XG4gICAgICAvLyBTbyBoaWdoZXN0IHRoaXMgbnVtYmVyIGNhbiBnZXQgaXMgWCoyNTUvWCswLjU9MjU1LjUgd2hpY2ggaXMgPCAyNTYgYW5kIHJvdW5kcyBkb3duLlxuXG4gICAgICBpVGltZXM0ID0gaSAqIDQ7XG4gICAgICBpbWdbaVRpbWVzNF0gPSBpbWdbaVRpbWVzNF0gKiB2bXVsICsgMHg4MDAgPj4gMTI7IC8vIFJcblxuICAgICAgaW1nW2lUaW1lczQgKyAxXSA9IGltZ1tpVGltZXM0ICsgMV0gKiB2bXVsICsgMHg4MDAgPj4gMTI7IC8vIEdcblxuICAgICAgaW1nW2lUaW1lczQgKyAyXSA9IGltZ1tpVGltZXM0ICsgMl0gKiB2bXVsICsgMHg4MDAgPj4gMTI7IC8vIEJcbiAgICB9XG4gIH1cbn07XG5cbn0se1wiZ2x1ci9tb25vMTZcIjoxOH1dLDExOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB1bnNoYXJwKGltZywgd2lkdGgsIGhlaWdodCwgYW1vdW50LCByYWRpdXMsIHRocmVzaG9sZCkge1xuICBpZiAoYW1vdW50ID09PSAwIHx8IHJhZGl1cyA8IDAuNSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChyYWRpdXMgPiAyLjApIHtcbiAgICByYWRpdXMgPSAyLjA7XG4gIH1cblxuICB2YXIgcGl4ZWxzID0gd2lkdGggKiBoZWlnaHQ7XG4gIHZhciBpbWdfYnl0ZXNfY250ID0gcGl4ZWxzICogNDtcbiAgdmFyIGhzdl9ieXRlc19jbnQgPSBwaXhlbHMgKiAyO1xuICB2YXIgYmx1cl9ieXRlc19jbnQgPSBwaXhlbHMgKiAyO1xuICB2YXIgYmx1cl9saW5lX2J5dGVfY250ID0gTWF0aC5tYXgod2lkdGgsIGhlaWdodCkgKiA0OyAvLyBmbG9hdDMyIGFycmF5XG5cbiAgdmFyIGJsdXJfY29lZmZzX2J5dGVfY250ID0gOCAqIDQ7IC8vIGZsb2F0MzIgYXJyYXlcblxuICB2YXIgaW1nX29mZnNldCA9IDA7XG4gIHZhciBoc3Zfb2Zmc2V0ID0gaW1nX2J5dGVzX2NudDtcbiAgdmFyIGJsdXJfb2Zmc2V0ID0gaHN2X29mZnNldCArIGhzdl9ieXRlc19jbnQ7XG4gIHZhciBibHVyX3RtcF9vZmZzZXQgPSBibHVyX29mZnNldCArIGJsdXJfYnl0ZXNfY250O1xuICB2YXIgYmx1cl9saW5lX29mZnNldCA9IGJsdXJfdG1wX29mZnNldCArIGJsdXJfYnl0ZXNfY250O1xuICB2YXIgYmx1cl9jb2VmZnNfb2Zmc2V0ID0gYmx1cl9saW5lX29mZnNldCArIGJsdXJfbGluZV9ieXRlX2NudDtcblxuICB2YXIgaW5zdGFuY2UgPSB0aGlzLl9faW5zdGFuY2UoJ3Vuc2hhcnBfbWFzaycsIGltZ19ieXRlc19jbnQgKyBoc3ZfYnl0ZXNfY250ICsgYmx1cl9ieXRlc19jbnQgKiAyICsgYmx1cl9saW5lX2J5dGVfY250ICsgYmx1cl9jb2VmZnNfYnl0ZV9jbnQsIHtcbiAgICBleHA6IE1hdGguZXhwXG4gIH0pOyAvLyAzMi1iaXQgY29weSBpcyBtdWNoIGZhc3RlciBpbiBjaHJvbWVcblxuXG4gIHZhciBpbWczMiA9IG5ldyBVaW50MzJBcnJheShpbWcuYnVmZmVyKTtcbiAgdmFyIG1lbTMyID0gbmV3IFVpbnQzMkFycmF5KHRoaXMuX19tZW1vcnkuYnVmZmVyKTtcbiAgbWVtMzIuc2V0KGltZzMyKTsgLy8gSFNMXG5cbiAgdmFyIGZuID0gaW5zdGFuY2UuZXhwb3J0cy5oc3ZfdjE2IHx8IGluc3RhbmNlLmV4cG9ydHMuX2hzdl92MTY7XG4gIGZuKGltZ19vZmZzZXQsIGhzdl9vZmZzZXQsIHdpZHRoLCBoZWlnaHQpOyAvLyBCTFVSXG5cbiAgZm4gPSBpbnN0YW5jZS5leHBvcnRzLmJsdXJNb25vMTYgfHwgaW5zdGFuY2UuZXhwb3J0cy5fYmx1ck1vbm8xNjtcbiAgZm4oaHN2X29mZnNldCwgYmx1cl9vZmZzZXQsIGJsdXJfdG1wX29mZnNldCwgYmx1cl9saW5lX29mZnNldCwgYmx1cl9jb2VmZnNfb2Zmc2V0LCB3aWR0aCwgaGVpZ2h0LCByYWRpdXMpOyAvLyBVTlNIQVJQXG5cbiAgZm4gPSBpbnN0YW5jZS5leHBvcnRzLnVuc2hhcnAgfHwgaW5zdGFuY2UuZXhwb3J0cy5fdW5zaGFycDtcbiAgZm4oaW1nX29mZnNldCwgaW1nX29mZnNldCwgaHN2X29mZnNldCwgYmx1cl9vZmZzZXQsIHdpZHRoLCBoZWlnaHQsIGFtb3VudCwgdGhyZXNob2xkKTsgLy8gMzItYml0IGNvcHkgaXMgbXVjaCBmYXN0ZXIgaW4gY2hyb21lXG5cbiAgaW1nMzIuc2V0KG5ldyBVaW50MzJBcnJheSh0aGlzLl9fbWVtb3J5LmJ1ZmZlciwgMCwgcGl4ZWxzKSk7XG59O1xuXG59LHt9XSwxMjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovXG5cbm1vZHVsZS5leHBvcnRzID0gJ0FHRnpiUUVBQUFBQURBWmtlV3hwYm1zQUFBQUFBQUUwQjJBQUFHQUVmMzkvZndCZ0JuOS9mMzkvZndCZ0NIOS9mMzkvZjM5L0FHQUlmMzkvZjM5L2YzMEFZQUo5ZndCZ0FYd0JmQUlaQWdObGJuWURaWGh3QUFZRFpXNTJCbTFsYlc5eWVRSUFBQU1IQmdBRkFnUUJBd1lHQVg4QVFRQUxCNG9CQ0JGZlgzZGhjMjFmWTJGc2JGOWpkRzl5Y3dBQkZsOWZZblZwYkdSZloyRjFjM05wWVc1ZlkyOWxabk1BQWc1ZlgyZGhkWE56TVRaZmJHbHVaUUFEQ21Kc2RYSk5iMjV2TVRZQUJBZG9jM1pmZGpFMkFBVUhkVzV6YUdGeWNBQUdERjlmWkhOdlgyaGhibVJzWlFNQUdGOWZkMkZ6YlY5aGNIQnNlVjlrWVhSaFgzSmxiRzlqY3dBQkNzVU1CZ01BQVF2V0FRRUhmQ0FCUk51R3VrT0NHdnMvSUFDN295SUNSQUFBQUFBQUFBREFvaEFBSWdXMmpEZ0NGQ0FCSUFLYUVBQWlBeUFEb0NJR3RqZ0NFQ0FCUkFBQUFBQUFBUEEvSUFPaElnUWdCS0lnQXlBQ0lBS2dva1FBQUFBQUFBRHdQNkFnQmFHaklnUzJPQUlBSUFFZ0JTQUVtcUlpQjdZNEFnd2dBU0FESUFKRUFBQUFBQUFBOEQrZ0lBU2lvaUlJdGpnQ0NDQUJJQU1nQWtRQUFBQUFBQUR3djZBZ0JLS2lJZ0syT0FJRUlBRWdCeUFJb0NBRlJBQUFBQUFBQVBBL0lBYWhvQ0lEbzdZNEFod2dBU0FFSUFLZ0lBT2p0amdDR0F1R0JRTUdmd2w4QW4wZ0F5b0NEQ0VWSUFNcUFnZ2hGaUFES2dJVXV5RVJJQU1xQWhDN0lSQUNRQ0FFUVFGcklnaEJBRWdpQ1FSQUlBSWhCeUFBSVFZTUFRc2dBaUFBTHdFQXVDSVBJQU1xQWhpN29pSU1JQkdpSWcwZ0RDQVFvaUFQSUFNcUFnUzdJaE9pSWhRZ0F5b0NBTHNpRWlBUG9xQ2dvQ0lPdGpnQ0FDQUNRUVJxSVFjZ0FFRUNhaUVHSUFoRkRRQWdDRUVCSUFoQkFVZ2JJZ3BCZjNNaEN3Si9JQVFnQ210QkFYRkZCRUFnRGlFTklBZ01BUXNnQWlBTklBNGdFS0lnRkNBU0lBQXZBUUs0SWcraW9LQ2dJZzIyT0FJRUlBSkJDR29oQnlBQVFRUnFJUVlnRGlFTUlBUkJBbXNMSVFJZ0MwRUFJQVJyUmcwQUEwQWdCeUFNSUJHaUlBMGdFS0lnRHlBVG9pQVNJQVl2QVFDNElnNmlvS0NnSWd5Mk9BSUFJQWNnRFNBUm9pQU1JQkNpSUE0Z0U2SWdFaUFHTHdFQ3VDSVBvcUNnb0NJTnRqZ0NCQ0FIUVFocUlRY2dCa0VFYWlFR0lBSkJBa29oQUNBQ1FRSnJJUUlnQUEwQUN3c0NRQ0FKRFFBZ0FTQUZJQWhzUVFGMGFpSUFBbjhnQmtFQ2F5OEJBQ0lDdUNJTklCVzdJaEtpSUEwZ0Zyc2lFNktnSUEwZ0F5b0NITHVpSWd3Z0VLS2dJQXdnRWFLZ0lnOGdCMEVFYXlJSEtnSUF1NkFpRGtRQUFBQUFBQUR3UVdNZ0RrUUFBQUFBQUFBQUFHWnhCRUFnRHFzTUFRdEJBQXM3QVFBZ0NFVU5BQ0FHUVFScklRWkJBQ0FGYTBFQmRDRUJBMEFDZnlBTklCS2lJQUpCLy84RGNiZ2lEU0FUb3FBZ0R5SU9JQkNpb0NBTUlCR2lvQ0lQSUFkQkJHc2lCeW9DQUx1Z0lneEVBQUFBQUFBQThFRmpJQXhFQUFBQUFBQUFBQUJtY1FSQUlBeXJEQUVMUVFBTElRTWdCaThCQUNFQ0lBQWdBV29pQUNBRE93RUFJQVpCQW1zaEJpQUlRUUZLSVFNZ0RpRU1JQWhCQVdzaENDQUREUUFMQ3d2UkFnSUJmd2Q4QWtBZ0IwTUFBQUFBV3cwQUlBUkUyNGE2UTRJYSt6OGdCME1BQUFBL2w3dWpJZ2xFQUFBQUFBQUFBTUNpRUFBaURMYU1PQUlVSUFRZ0Nab1FBQ0lLSUFxZ0lnMjJPQUlRSUFSRUFBQUFBQUFBOEQ4Z0NxRWlDeUFMb2lBS0lBa2dDYUNpUkFBQUFBQUFBUEEvb0NBTW9hTWlDN1k0QWdBZ0JDQU1JQXVhb2lJT3RqZ0NEQ0FFSUFvZ0NVUUFBQUFBQUFEd1A2QWdDNktpSWcrMk9BSUlJQVFnQ2lBSlJBQUFBQUFBQVBDL29DQUxvcUlpQ2JZNEFnUWdCQ0FPSUErZ0lBeEVBQUFBQUFBQThEOGdEYUdnSWdxanRqZ0NIQ0FFSUFzZ0NhQWdDcU8yT0FJWUlBWUVRQU5BSUFBZ0JTQUliRUVCZEdvZ0FpQUlRUUYwYWlBRElBUWdCU0FHRUFNZ0NFRUJhaUlJSUFaSERRQUxDeUFGUlEwQVFRQWhDQU5BSUFJZ0JpQUliRUVCZEdvZ0FTQUlRUUYwYWlBRElBUWdCaUFGRUFNZ0NFRUJhaUlJSUFWSERRQUxDd3R4QVFOL0lBSWdBMndpQlFSQUEwQWdBU0FBS0FJQUlnUkJFSFpCL3dGeElnSWdBaUFFUVFoMlFmOEJjU0lESUFNZ0JFSC9BWEVpQkVrYklBSWdBMHNiSWdZZ0JpQUVJQUlnQkVzYklBTWdCRXNiUVFoME93RUFJQUZCQW1vaEFTQUFRUVJxSVFBZ0JVRUJheUlGRFFBTEN3dVpBZ0lEZndGOElBUWdCV3doQkFKL0lBYXpRd0FBZ0VXVVF3QUF5RUtWdTBRQUFBQUFBQURnUDZBaUM1bEVBQUFBQUFBQTRFRmpCRUFnQzZvTUFRdEJnSUNBZ0hnTElRVWdCQVJBSUFkQkNIUWhDVUVBSVFZRFFDQUpJQUlnQmtFQmRDSUhhaThCQUNJQklBTWdCMm92QVFCcklnY2dCMEVmZFNJSWFpQUljMDBFUUNBQUlBWkJBblFpQ0dvaUNpQUZJQWRzUVlBUWFrRU1kU0FCYWlJSFFZRCtBeUFIUVlEK0EwZ2JJZ2RCQUNBSFFRQktHMEVNZENBQlFRRWdBUnR1SWdFZ0NpMEFBR3hCZ0JCcVFReDJPZ0FBSUFBZ0NFRUJjbW9pQnlBQklBY3RBQUJzUVlBUWFrRU1kam9BQUNBQUlBaEJBbkpxSWdjZ0FTQUhMUUFBYkVHQUVHcEJESFk2QUFBTElBWkJBV29pQmlBRVJ3MEFDd3NMJztcblxufSx7fV0sMTM6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXG52YXIgR0NfSU5URVJWQUwgPSAxMDA7XG5cbmZ1bmN0aW9uIFBvb2woY3JlYXRlLCBpZGxlKSB7XG4gIHRoaXMuY3JlYXRlID0gY3JlYXRlO1xuICB0aGlzLmF2YWlsYWJsZSA9IFtdO1xuICB0aGlzLmFjcXVpcmVkID0ge307XG4gIHRoaXMubGFzdElkID0gMTtcbiAgdGhpcy50aW1lb3V0SWQgPSAwO1xuICB0aGlzLmlkbGUgPSBpZGxlIHx8IDIwMDA7XG59XG5cblBvb2wucHJvdG90eXBlLmFjcXVpcmUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgdmFyIHJlc291cmNlO1xuXG4gIGlmICh0aGlzLmF2YWlsYWJsZS5sZW5ndGggIT09IDApIHtcbiAgICByZXNvdXJjZSA9IHRoaXMuYXZhaWxhYmxlLnBvcCgpO1xuICB9IGVsc2Uge1xuICAgIHJlc291cmNlID0gdGhpcy5jcmVhdGUoKTtcbiAgICByZXNvdXJjZS5pZCA9IHRoaXMubGFzdElkKys7XG5cbiAgICByZXNvdXJjZS5yZWxlYXNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF90aGlzLnJlbGVhc2UocmVzb3VyY2UpO1xuICAgIH07XG4gIH1cblxuICB0aGlzLmFjcXVpcmVkW3Jlc291cmNlLmlkXSA9IHJlc291cmNlO1xuICByZXR1cm4gcmVzb3VyY2U7XG59O1xuXG5Qb29sLnByb3RvdHlwZS5yZWxlYXNlID0gZnVuY3Rpb24gKHJlc291cmNlKSB7XG4gIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gIGRlbGV0ZSB0aGlzLmFjcXVpcmVkW3Jlc291cmNlLmlkXTtcbiAgcmVzb3VyY2UubGFzdFVzZWQgPSBEYXRlLm5vdygpO1xuICB0aGlzLmF2YWlsYWJsZS5wdXNoKHJlc291cmNlKTtcblxuICBpZiAodGhpcy50aW1lb3V0SWQgPT09IDApIHtcbiAgICB0aGlzLnRpbWVvdXRJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF90aGlzMi5nYygpO1xuICAgIH0sIEdDX0lOVEVSVkFMKTtcbiAgfVxufTtcblxuUG9vbC5wcm90b3R5cGUuZ2MgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gIHZhciBub3cgPSBEYXRlLm5vdygpO1xuICB0aGlzLmF2YWlsYWJsZSA9IHRoaXMuYXZhaWxhYmxlLmZpbHRlcihmdW5jdGlvbiAocmVzb3VyY2UpIHtcbiAgICBpZiAobm93IC0gcmVzb3VyY2UubGFzdFVzZWQgPiBfdGhpczMuaWRsZSkge1xuICAgICAgcmVzb3VyY2UuZGVzdHJveSgpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9KTtcblxuICBpZiAodGhpcy5hdmFpbGFibGUubGVuZ3RoICE9PSAwKSB7XG4gICAgdGhpcy50aW1lb3V0SWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBfdGhpczMuZ2MoKTtcbiAgICB9LCBHQ19JTlRFUlZBTCk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy50aW1lb3V0SWQgPSAwO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFBvb2w7XG5cbn0se31dLDE0OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbi8vIG1pbiBzaXplID0gMSBjYW4gY29uc3VtZSBsYXJnZSBhbW91bnQgb2YgbWVtb3J5XG5cbnZhciBNSU5fSU5ORVJfVElMRV9TSVpFID0gMjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjcmVhdGVTdGFnZXMoZnJvbVdpZHRoLCBmcm9tSGVpZ2h0LCB0b1dpZHRoLCB0b0hlaWdodCwgc3JjVGlsZVNpemUsIGRlc3RUaWxlQm9yZGVyKSB7XG4gIHZhciBzY2FsZVggPSB0b1dpZHRoIC8gZnJvbVdpZHRoO1xuICB2YXIgc2NhbGVZID0gdG9IZWlnaHQgLyBmcm9tSGVpZ2h0OyAvLyBkZXJpdmVkIGZyb20gY3JlYXRlUmVnaW9ucyBlcXVhdGlvbjpcbiAgLy8gaW5uZXJUaWxlV2lkdGggPSBwaXhlbEZsb29yKHNyY1RpbGVTaXplICogc2NhbGVYKSAtIDIgKiBkZXN0VGlsZUJvcmRlcjtcblxuICB2YXIgbWluU2NhbGUgPSAoMiAqIGRlc3RUaWxlQm9yZGVyICsgTUlOX0lOTkVSX1RJTEVfU0laRSArIDEpIC8gc3JjVGlsZVNpemU7IC8vIHJlZnVzZSB0byBzY2FsZSBpbWFnZSBtdWx0aXBsZSB0aW1lcyBieSBsZXNzIHRoYW4gdHdpY2UgZWFjaCB0aW1lLFxuICAvLyBpdCBjb3VsZCBvbmx5IGhhcHBlbiBiZWNhdXNlIG9mIGludmFsaWQgb3B0aW9uc1xuXG4gIGlmIChtaW5TY2FsZSA+IDAuNSkgcmV0dXJuIFtbdG9XaWR0aCwgdG9IZWlnaHRdXTtcbiAgdmFyIHN0YWdlQ291bnQgPSBNYXRoLmNlaWwoTWF0aC5sb2coTWF0aC5taW4oc2NhbGVYLCBzY2FsZVkpKSAvIE1hdGgubG9nKG1pblNjYWxlKSk7IC8vIG5vIGFkZGl0aW9uYWwgcmVzaXplcyBhcmUgbmVjZXNzYXJ5LFxuICAvLyBzdGFnZUNvdW50IGNhbiBiZSB6ZXJvIG9yIGJlIG5lZ2F0aXZlIHdoZW4gZW5sYXJnaW5nIHRoZSBpbWFnZVxuXG4gIGlmIChzdGFnZUNvdW50IDw9IDEpIHJldHVybiBbW3RvV2lkdGgsIHRvSGVpZ2h0XV07XG4gIHZhciByZXN1bHQgPSBbXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0YWdlQ291bnQ7IGkrKykge1xuICAgIHZhciB3aWR0aCA9IE1hdGgucm91bmQoTWF0aC5wb3coTWF0aC5wb3coZnJvbVdpZHRoLCBzdGFnZUNvdW50IC0gaSAtIDEpICogTWF0aC5wb3codG9XaWR0aCwgaSArIDEpLCAxIC8gc3RhZ2VDb3VudCkpO1xuICAgIHZhciBoZWlnaHQgPSBNYXRoLnJvdW5kKE1hdGgucG93KE1hdGgucG93KGZyb21IZWlnaHQsIHN0YWdlQ291bnQgLSBpIC0gMSkgKiBNYXRoLnBvdyh0b0hlaWdodCwgaSArIDEpLCAxIC8gc3RhZ2VDb3VudCkpO1xuICAgIHJlc3VsdC5wdXNoKFt3aWR0aCwgaGVpZ2h0XSk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxufSx7fV0sMTU6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuLypcbiAqIHBpeGVsRmxvb3IgYW5kIHBpeGVsQ2VpbCBhcmUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgTWF0aC5mbG9vciBhbmQgTWF0aC5jZWlsXG4gKiBmdW5jdGlvbnMgd2hpY2ggdGFrZSBpbnRvIGFjY291bnQgZmxvYXRpbmcgcG9pbnQgYXJpdGhtZXRpYyBlcnJvcnMuXG4gKiBUaG9zZSBlcnJvcnMgY2FuIGNhdXNlIHVuZGVzaXJlZCBpbmNyZW1lbnRzL2RlY3JlbWVudHMgb2Ygc2l6ZXMgYW5kIG9mZnNldHM6XG4gKiBNYXRoLmNlaWwoMzYgLyAoMzYgLyA1MDApKSA9IDUwMVxuICogcGl4ZWxDZWlsKDM2IC8gKDM2IC8gNTAwKSkgPSA1MDBcbiAqL1xuXG52YXIgUElYRUxfRVBTSUxPTiA9IDFlLTU7XG5cbmZ1bmN0aW9uIHBpeGVsRmxvb3IoeCkge1xuICB2YXIgbmVhcmVzdCA9IE1hdGgucm91bmQoeCk7XG5cbiAgaWYgKE1hdGguYWJzKHggLSBuZWFyZXN0KSA8IFBJWEVMX0VQU0lMT04pIHtcbiAgICByZXR1cm4gbmVhcmVzdDtcbiAgfVxuXG4gIHJldHVybiBNYXRoLmZsb29yKHgpO1xufVxuXG5mdW5jdGlvbiBwaXhlbENlaWwoeCkge1xuICB2YXIgbmVhcmVzdCA9IE1hdGgucm91bmQoeCk7XG5cbiAgaWYgKE1hdGguYWJzKHggLSBuZWFyZXN0KSA8IFBJWEVMX0VQU0lMT04pIHtcbiAgICByZXR1cm4gbmVhcmVzdDtcbiAgfVxuXG4gIHJldHVybiBNYXRoLmNlaWwoeCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY3JlYXRlUmVnaW9ucyhvcHRpb25zKSB7XG4gIHZhciBzY2FsZVggPSBvcHRpb25zLnRvV2lkdGggLyBvcHRpb25zLndpZHRoO1xuICB2YXIgc2NhbGVZID0gb3B0aW9ucy50b0hlaWdodCAvIG9wdGlvbnMuaGVpZ2h0O1xuICB2YXIgaW5uZXJUaWxlV2lkdGggPSBwaXhlbEZsb29yKG9wdGlvbnMuc3JjVGlsZVNpemUgKiBzY2FsZVgpIC0gMiAqIG9wdGlvbnMuZGVzdFRpbGVCb3JkZXI7XG4gIHZhciBpbm5lclRpbGVIZWlnaHQgPSBwaXhlbEZsb29yKG9wdGlvbnMuc3JjVGlsZVNpemUgKiBzY2FsZVkpIC0gMiAqIG9wdGlvbnMuZGVzdFRpbGVCb3JkZXI7IC8vIHByZXZlbnQgaW5maW5pdGUgbG9vcCwgdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuXG5cbiAgaWYgKGlubmVyVGlsZVdpZHRoIDwgMSB8fCBpbm5lclRpbGVIZWlnaHQgPCAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnRlcm5hbCBlcnJvciBpbiBwaWNhOiB0YXJnZXQgdGlsZSB3aWR0aC9oZWlnaHQgaXMgdG9vIHNtYWxsLicpO1xuICB9XG5cbiAgdmFyIHgsIHk7XG4gIHZhciBpbm5lclgsIGlubmVyWSwgdG9UaWxlV2lkdGgsIHRvVGlsZUhlaWdodDtcbiAgdmFyIHRpbGVzID0gW107XG4gIHZhciB0aWxlOyAvLyB3ZSBnbyB0b3AtdG8tZG93biBpbnN0ZWFkIG9mIGxlZnQtdG8tcmlnaHQgdG8gbWFrZSBpbWFnZSBkaXNwbGF5ZWQgZnJvbSB0b3AgdG9cbiAgLy8gZG9lc24gaW4gdGhlIGJyb3dzZXJcblxuICBmb3IgKGlubmVyWSA9IDA7IGlubmVyWSA8IG9wdGlvbnMudG9IZWlnaHQ7IGlubmVyWSArPSBpbm5lclRpbGVIZWlnaHQpIHtcbiAgICBmb3IgKGlubmVyWCA9IDA7IGlubmVyWCA8IG9wdGlvbnMudG9XaWR0aDsgaW5uZXJYICs9IGlubmVyVGlsZVdpZHRoKSB7XG4gICAgICB4ID0gaW5uZXJYIC0gb3B0aW9ucy5kZXN0VGlsZUJvcmRlcjtcblxuICAgICAgaWYgKHggPCAwKSB7XG4gICAgICAgIHggPSAwO1xuICAgICAgfVxuXG4gICAgICB0b1RpbGVXaWR0aCA9IGlubmVyWCArIGlubmVyVGlsZVdpZHRoICsgb3B0aW9ucy5kZXN0VGlsZUJvcmRlciAtIHg7XG5cbiAgICAgIGlmICh4ICsgdG9UaWxlV2lkdGggPj0gb3B0aW9ucy50b1dpZHRoKSB7XG4gICAgICAgIHRvVGlsZVdpZHRoID0gb3B0aW9ucy50b1dpZHRoIC0geDtcbiAgICAgIH1cblxuICAgICAgeSA9IGlubmVyWSAtIG9wdGlvbnMuZGVzdFRpbGVCb3JkZXI7XG5cbiAgICAgIGlmICh5IDwgMCkge1xuICAgICAgICB5ID0gMDtcbiAgICAgIH1cblxuICAgICAgdG9UaWxlSGVpZ2h0ID0gaW5uZXJZICsgaW5uZXJUaWxlSGVpZ2h0ICsgb3B0aW9ucy5kZXN0VGlsZUJvcmRlciAtIHk7XG5cbiAgICAgIGlmICh5ICsgdG9UaWxlSGVpZ2h0ID49IG9wdGlvbnMudG9IZWlnaHQpIHtcbiAgICAgICAgdG9UaWxlSGVpZ2h0ID0gb3B0aW9ucy50b0hlaWdodCAtIHk7XG4gICAgICB9XG5cbiAgICAgIHRpbGUgPSB7XG4gICAgICAgIHRvWDogeCxcbiAgICAgICAgdG9ZOiB5LFxuICAgICAgICB0b1dpZHRoOiB0b1RpbGVXaWR0aCxcbiAgICAgICAgdG9IZWlnaHQ6IHRvVGlsZUhlaWdodCxcbiAgICAgICAgdG9Jbm5lclg6IGlubmVyWCxcbiAgICAgICAgdG9Jbm5lclk6IGlubmVyWSxcbiAgICAgICAgdG9Jbm5lcldpZHRoOiBpbm5lclRpbGVXaWR0aCxcbiAgICAgICAgdG9Jbm5lckhlaWdodDogaW5uZXJUaWxlSGVpZ2h0LFxuICAgICAgICBvZmZzZXRYOiB4IC8gc2NhbGVYIC0gcGl4ZWxGbG9vcih4IC8gc2NhbGVYKSxcbiAgICAgICAgb2Zmc2V0WTogeSAvIHNjYWxlWSAtIHBpeGVsRmxvb3IoeSAvIHNjYWxlWSksXG4gICAgICAgIHNjYWxlWDogc2NhbGVYLFxuICAgICAgICBzY2FsZVk6IHNjYWxlWSxcbiAgICAgICAgeDogcGl4ZWxGbG9vcih4IC8gc2NhbGVYKSxcbiAgICAgICAgeTogcGl4ZWxGbG9vcih5IC8gc2NhbGVZKSxcbiAgICAgICAgd2lkdGg6IHBpeGVsQ2VpbCh0b1RpbGVXaWR0aCAvIHNjYWxlWCksXG4gICAgICAgIGhlaWdodDogcGl4ZWxDZWlsKHRvVGlsZUhlaWdodCAvIHNjYWxlWSlcbiAgICAgIH07XG4gICAgICB0aWxlcy5wdXNoKHRpbGUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aWxlcztcbn07XG5cbn0se31dLDE2OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblxuZnVuY3Rpb24gb2JqQ2xhc3Mob2JqKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKTtcbn1cblxubW9kdWxlLmV4cG9ydHMuaXNDYW52YXMgPSBmdW5jdGlvbiBpc0NhbnZhcyhlbGVtZW50KSB7XG4gIHZhciBjbmFtZSA9IG9iakNsYXNzKGVsZW1lbnQpO1xuICByZXR1cm4gY25hbWUgPT09ICdbb2JqZWN0IEhUTUxDYW52YXNFbGVtZW50XSdcbiAgLyogYnJvd3NlciAqL1xuICB8fCBjbmFtZSA9PT0gJ1tvYmplY3QgT2Zmc2NyZWVuQ2FudmFzXScgfHwgY25hbWUgPT09ICdbb2JqZWN0IENhbnZhc10nXG4gIC8qIG5vZGUtY2FudmFzICovXG4gIDtcbn07XG5cbm1vZHVsZS5leHBvcnRzLmlzSW1hZ2UgPSBmdW5jdGlvbiBpc0ltYWdlKGVsZW1lbnQpIHtcbiAgcmV0dXJuIG9iakNsYXNzKGVsZW1lbnQpID09PSAnW29iamVjdCBIVE1MSW1hZ2VFbGVtZW50XSc7XG59O1xuXG5tb2R1bGUuZXhwb3J0cy5pc0ltYWdlQml0bWFwID0gZnVuY3Rpb24gaXNJbWFnZUJpdG1hcChlbGVtZW50KSB7XG4gIHJldHVybiBvYmpDbGFzcyhlbGVtZW50KSA9PT0gJ1tvYmplY3QgSW1hZ2VCaXRtYXBdJztcbn07XG5cbm1vZHVsZS5leHBvcnRzLmxpbWl0ZXIgPSBmdW5jdGlvbiBsaW1pdGVyKGNvbmN1cnJlbmN5KSB7XG4gIHZhciBhY3RpdmUgPSAwLFxuICAgICAgcXVldWUgPSBbXTtcblxuICBmdW5jdGlvbiByb2xsKCkge1xuICAgIGlmIChhY3RpdmUgPCBjb25jdXJyZW5jeSAmJiBxdWV1ZS5sZW5ndGgpIHtcbiAgICAgIGFjdGl2ZSsrO1xuICAgICAgcXVldWUuc2hpZnQoKSgpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiBsaW1pdChmbikge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBxdWV1ZS5wdXNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZm4oKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgICAgYWN0aXZlLS07XG4gICAgICAgICAgcm9sbCgpO1xuICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgYWN0aXZlLS07XG4gICAgICAgICAgcm9sbCgpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgcm9sbCgpO1xuICAgIH0pO1xuICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMuY2liX3F1YWxpdHlfbmFtZSA9IGZ1bmN0aW9uIGNpYl9xdWFsaXR5X25hbWUobnVtKSB7XG4gIHN3aXRjaCAobnVtKSB7XG4gICAgY2FzZSAwOlxuICAgICAgcmV0dXJuICdwaXhlbGF0ZWQnO1xuXG4gICAgY2FzZSAxOlxuICAgICAgcmV0dXJuICdsb3cnO1xuXG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuICdtZWRpdW0nO1xuICB9XG5cbiAgcmV0dXJuICdoaWdoJztcbn07XG5cbm1vZHVsZS5leHBvcnRzLmNpYl9zdXBwb3J0ID0gZnVuY3Rpb24gY2liX3N1cHBvcnQoY3JlYXRlQ2FudmFzKSB7XG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodHlwZW9mIGNyZWF0ZUltYWdlQml0bWFwID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHZhciBjID0gY3JlYXRlQ2FudmFzKDEwMCwgMTAwKTtcbiAgICByZXR1cm4gY3JlYXRlSW1hZ2VCaXRtYXAoYywgMCwgMCwgMTAwLCAxMDAsIHtcbiAgICAgIHJlc2l6ZVdpZHRoOiAxMCxcbiAgICAgIHJlc2l6ZUhlaWdodDogMTAsXG4gICAgICByZXNpemVRdWFsaXR5OiAnaGlnaCdcbiAgICB9KS50aGVuKGZ1bmN0aW9uIChiaXRtYXApIHtcbiAgICAgIHZhciBzdGF0dXMgPSBiaXRtYXAud2lkdGggPT09IDEwOyAvLyBCcmFuY2ggYmVsb3cgaXMgZmlsdGVyZWQgb24gdXBwZXIgbGV2ZWwuIFdlIGRvIG5vdCBjYWxsIHJlc2l6ZVxuICAgICAgLy8gZGV0ZWN0aW9uIGZvciBiYXNpYyBJbWFnZUJpdG1hcC5cbiAgICAgIC8vXG4gICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSW1hZ2VCaXRtYXBcbiAgICAgIC8vIG9sZCBDcm9tZSA1MSBoYXMgSW1hZ2VCaXRtYXAgd2l0aG91dCAuY2xvc2UoKS4gVGhlbiB0aGlzIGNvZGVcbiAgICAgIC8vIHdpbGwgdGhyb3cgYW5kIHJldHVybiAnZmFsc2UnIGFzIGV4cGVjdGVkLlxuICAgICAgLy9cblxuICAgICAgYml0bWFwLmNsb3NlKCk7XG4gICAgICBjID0gbnVsbDtcbiAgICAgIHJldHVybiBzdGF0dXM7XG4gICAgfSk7XG4gIH0pW1wiY2F0Y2hcIl0oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cy53b3JrZXJfb2Zmc2NyZWVuX2NhbnZhc19zdXBwb3J0ID0gZnVuY3Rpb24gd29ya2VyX29mZnNjcmVlbl9jYW52YXNfc3VwcG9ydCgpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICBpZiAodHlwZW9mIE9mZnNjcmVlbkNhbnZhcyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIC8vIGlmIE9mZnNjcmVlbkNhbnZhcyBpcyBwcmVzZW50LCB3ZSBhc3N1bWUgYnJvd3NlciBzdXBwb3J0cyBXb3JrZXIgYW5kIGJ1aWx0LWluIFByb21pc2UgYXMgd2VsbFxuICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gd29ya2VyUGF5bG9hZChzZWxmKSB7XG4gICAgICBpZiAodHlwZW9mIGNyZWF0ZUltYWdlQml0bWFwID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKGZhbHNlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNhbnZhcyA9IG5ldyBPZmZzY3JlZW5DYW52YXMoMTAsIDEwKTsgLy8gdGVzdCB0aGF0IDJkIGNvbnRleHQgY2FuIGJlIHVzZWQgaW4gd29ya2VyXG5cbiAgICAgICAgdmFyIGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgICBjdHgucmVjdCgwLCAwLCAxLCAxKTsgLy8gdGVzdCB0aGF0IGNpYiBjYW4gYmUgdXNlZCB0byByZXR1cm4gaW1hZ2UgYml0bWFwIGZyb20gd29ya2VyXG5cbiAgICAgICAgcmV0dXJuIGNyZWF0ZUltYWdlQml0bWFwKGNhbnZhcywgMCwgMCwgMSwgMSk7XG4gICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHNlbGYucG9zdE1lc3NhZ2UodHJ1ZSk7XG4gICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBzZWxmLnBvc3RNZXNzYWdlKGZhbHNlKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHZhciBjb2RlID0gYnRvYShcIihcIi5jb25jYXQod29ya2VyUGF5bG9hZC50b1N0cmluZygpLCBcIikoc2VsZik7XCIpKTtcbiAgICB2YXIgdyA9IG5ldyBXb3JrZXIoXCJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsXCIuY29uY2F0KGNvZGUpKTtcblxuICAgIHcub25tZXNzYWdlID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZShldi5kYXRhKTtcbiAgICB9O1xuXG4gICAgdy5vbmVycm9yID0gcmVqZWN0O1xuICB9KS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9KTtcbn07IC8vIENoZWNrIGlmIGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpLmdldEltYWdlRGF0YSBjYW4gYmUgdXNlZCxcbi8vIEZpcmVGb3ggcmFuZG9taXplcyB0aGUgb3V0cHV0IG9mIHRoYXQgZnVuY3Rpb24gaW4gYHByaXZhY3kucmVzaXN0RmluZ2VycHJpbnRpbmdgIG1vZGVcblxuXG5tb2R1bGUuZXhwb3J0cy5jYW5fdXNlX2NhbnZhcyA9IGZ1bmN0aW9uIGNhbl91c2VfY2FudmFzKGNyZWF0ZUNhbnZhcykge1xuICB2YXIgdXNhYmxlID0gZmFsc2U7XG5cbiAgdHJ5IHtcbiAgICB2YXIgY2FudmFzID0gY3JlYXRlQ2FudmFzKDIsIDEpO1xuICAgIHZhciBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICB2YXIgZCA9IGN0eC5jcmVhdGVJbWFnZURhdGEoMiwgMSk7XG4gICAgZC5kYXRhWzBdID0gMTI7XG4gICAgZC5kYXRhWzFdID0gMjM7XG4gICAgZC5kYXRhWzJdID0gMzQ7XG4gICAgZC5kYXRhWzNdID0gMjU1O1xuICAgIGQuZGF0YVs0XSA9IDQ1O1xuICAgIGQuZGF0YVs1XSA9IDU2O1xuICAgIGQuZGF0YVs2XSA9IDY3O1xuICAgIGQuZGF0YVs3XSA9IDI1NTtcbiAgICBjdHgucHV0SW1hZ2VEYXRhKGQsIDAsIDApO1xuICAgIGQgPSBudWxsO1xuICAgIGQgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIDIsIDEpO1xuXG4gICAgaWYgKGQuZGF0YVswXSA9PT0gMTIgJiYgZC5kYXRhWzFdID09PSAyMyAmJiBkLmRhdGFbMl0gPT09IDM0ICYmIGQuZGF0YVszXSA9PT0gMjU1ICYmIGQuZGF0YVs0XSA9PT0gNDUgJiYgZC5kYXRhWzVdID09PSA1NiAmJiBkLmRhdGFbNl0gPT09IDY3ICYmIGQuZGF0YVs3XSA9PT0gMjU1KSB7XG4gICAgICB1c2FibGUgPSB0cnVlO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7fVxuXG4gIHJldHVybiB1c2FibGU7XG59OyAvLyBDaGVjayBpZiBjcmVhdGVJbWFnZUJpdG1hcChpbWcsIHN4LCBzeSwgc3csIHNoKSBzaWduYXR1cmUgd29ya3MgY29ycmVjdGx5XG4vLyB3aXRoIEpQRUcgaW1hZ2VzIG9yaWVudGVkIHdpdGggRXhpZjtcbi8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTEyMjA2NzFcbi8vIFRPRE86IHJlbW92ZSBhZnRlciBpdCdzIGZpeGVkIGluIGNocm9tZSBmb3IgYXQgbGVhc3QgMiByZWxlYXNlc1xuXG5cbm1vZHVsZS5leHBvcnRzLmNpYl9jYW5fdXNlX3JlZ2lvbiA9IGZ1bmN0aW9uIGNpYl9jYW5fdXNlX3JlZ2lvbigpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgaWYgKHR5cGVvZiBjcmVhdGVJbWFnZUJpdG1hcCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBpbWFnZSA9IG5ldyBJbWFnZSgpO1xuICAgIGltYWdlLnNyYyA9ICdkYXRhOmltYWdlL2pwZWc7YmFzZTY0LCcgKyAnLzlqLzRRQmlSWGhwWmdBQVRVMEFLZ0FBQUFnQUJRRVNBQU1BQUFBQkFBWUFBQUVhQUFVQUFBQUJBQUFBU2dFYkFBVUFBJyArICdBQUJBQUFBVWdFb0FBTUFBQUFCQUFJQUFBSVRBQU1BQUFBQkFBRUFBQUFBQUFBQUFBQklBQUFBQVFBQUFFZ0FBQUFCLzknICsgJ3NBUXdBRUF3TUVBd01FQkFNRUJRUUVCUVlLQndZR0JnWU5DUW9JQ2c4TkVCQVBEUThPRVJNWUZCRVNGeElPRHhVY0ZSYycgKyAnWkdSc2JHeEFVSFI4ZEdoOFlHaHNhLzlzQVF3RUVCUVVHQlFZTUJ3Y01HaEVQRVJvYUdob2FHaG9hR2hvYUdob2FHaG9hJyArICdHaG9hR2hvYUdob2FHaG9hR2hvYUdob2FHaG9hR2hvYUdob2FHaG9hR2hvYS84SUFFUWdBQVFBQ0F3RVJBQUlSQVFNUkEnICsgJ2YvRUFCUUFBUUFBQUFBQUFBQUFBQUFBQUFBQUFBZi94QUFVQVFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBLzlvQURBTUJBQScgKyAnSVFBeEFBQUFGL1AvL0VBQlFRQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUQvMmdBSUFRRUFBUVVDZi8vRUFCUVJBUUFBQUFBJyArICdBQUFBQUFBQUFBQUFBQUFELzJnQUlBUU1CQVQ4QmYvL0VBQlFSQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUQvMmdBSUFRSUInICsgJ0FUOEJmLy9FQUJRUUFRQUFBQUFBQUFBQUFBQUFBQUFBQUFELzJnQUlBUUVBQmo4Q2YvL0VBQlFRQVFBQUFBQUFBQUFBQScgKyAnQUFBQUFBQUFBRC8yZ0FJQVFFQUFUOGhmLy9hQUF3REFRQUNBQU1BQUFBUUgvL0VBQlFSQVFBQUFBQUFBQUFBQUFBQUFBJyArICdBQUFBRC8yZ0FJQVFNQkFUOFFmLy9FQUJRUkFRQUFBQUFBQUFBQUFBQUFBQUFBQUFELzJnQUlBUUlCQVQ4UWYvL0VBQlEnICsgJ1FBUUFBQUFBQUFBQUFBQUFBQUFBQUFBRC8yZ0FJQVFFQUFUOFFmLy9aJztcblxuICAgIGltYWdlLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGNyZWF0ZUltYWdlQml0bWFwKGltYWdlLCAwLCAwLCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0KS50aGVuKGZ1bmN0aW9uIChiaXRtYXApIHtcbiAgICAgICAgaWYgKGJpdG1hcC53aWR0aCA9PT0gaW1hZ2Uud2lkdGggJiYgYml0bWFwLmhlaWdodCA9PT0gaW1hZ2UuaGVpZ2h0KSB7XG4gICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZShmYWxzZSk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgaW1hZ2Uub25lcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiByZXNvbHZlKGZhbHNlKTtcbiAgICB9O1xuICB9KTtcbn07XG5cbn0se31dLDE3OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBNYXRoTGliID0gX2RlcmVxXygnLi9tYXRobGliJyk7XG5cbiAgdmFyIG1hdGhMaWI7XG4gIC8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVmICovXG5cbiAgb25tZXNzYWdlID0gZnVuY3Rpb24gb25tZXNzYWdlKGV2KSB7XG4gICAgdmFyIHRpbGVPcHRzID0gZXYuZGF0YS5vcHRzO1xuICAgIHZhciByZXR1cm5CaXRtYXAgPSBmYWxzZTtcblxuICAgIGlmICghdGlsZU9wdHMuc3JjICYmIHRpbGVPcHRzLnNyY0JpdG1hcCkge1xuICAgICAgdmFyIGNhbnZhcyA9IG5ldyBPZmZzY3JlZW5DYW52YXModGlsZU9wdHMud2lkdGgsIHRpbGVPcHRzLmhlaWdodCk7XG4gICAgICB2YXIgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJywge1xuICAgICAgICBhbHBoYTogQm9vbGVhbih0aWxlT3B0cy5hbHBoYSlcbiAgICAgIH0pO1xuICAgICAgY3R4LmRyYXdJbWFnZSh0aWxlT3B0cy5zcmNCaXRtYXAsIDAsIDApO1xuICAgICAgdGlsZU9wdHMuc3JjID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCB0aWxlT3B0cy53aWR0aCwgdGlsZU9wdHMuaGVpZ2h0KS5kYXRhO1xuICAgICAgY2FudmFzLndpZHRoID0gY2FudmFzLmhlaWdodCA9IDA7XG4gICAgICBjYW52YXMgPSBudWxsO1xuICAgICAgdGlsZU9wdHMuc3JjQml0bWFwLmNsb3NlKCk7XG4gICAgICB0aWxlT3B0cy5zcmNCaXRtYXAgPSBudWxsO1xuICAgICAgcmV0dXJuQml0bWFwID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoIW1hdGhMaWIpIG1hdGhMaWIgPSBuZXcgTWF0aExpYihldi5kYXRhLmZlYXR1cmVzKTsgLy8gVXNlIG11bHRpbWF0aCdzIHN5bmMgYXV0by1pbml0LiBBdm9pZCBQcm9taXNlIHVzZSBpbiBvbGQgYnJvd3NlcnMsXG4gICAgLy8gYmVjYXVzZSBwb2x5ZmlsbHMgYXJlIG5vdCBwcm9wYWdhdGVkIHRvIHdlYndvcmtlci5cblxuICAgIHZhciBkYXRhID0gbWF0aExpYi5yZXNpemVBbmRVbnNoYXJwKHRpbGVPcHRzKTtcblxuICAgIGlmIChyZXR1cm5CaXRtYXApIHtcbiAgICAgIHZhciB0b0ltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEobmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGRhdGEpLCB0aWxlT3B0cy50b1dpZHRoLCB0aWxlT3B0cy50b0hlaWdodCk7XG5cbiAgICAgIHZhciBfY2FudmFzID0gbmV3IE9mZnNjcmVlbkNhbnZhcyh0aWxlT3B0cy50b1dpZHRoLCB0aWxlT3B0cy50b0hlaWdodCk7XG5cbiAgICAgIHZhciBfY3R4ID0gX2NhbnZhcy5nZXRDb250ZXh0KCcyZCcsIHtcbiAgICAgICAgYWxwaGE6IEJvb2xlYW4odGlsZU9wdHMuYWxwaGEpXG4gICAgICB9KTtcblxuICAgICAgX2N0eC5wdXRJbWFnZURhdGEodG9JbWFnZURhdGEsIDAsIDApO1xuXG4gICAgICBjcmVhdGVJbWFnZUJpdG1hcChfY2FudmFzKS50aGVuKGZ1bmN0aW9uIChiaXRtYXApIHtcbiAgICAgICAgcG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgIGJpdG1hcDogYml0bWFwXG4gICAgICAgIH0sIFtiaXRtYXBdKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBwb3N0TWVzc2FnZSh7XG4gICAgICAgIGRhdGE6IGRhdGFcbiAgICAgIH0sIFtkYXRhLmJ1ZmZlcl0pO1xuICAgIH1cbiAgfTtcbn07XG5cbn0se1wiLi9tYXRobGliXCI6MX1dLDE4OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbi8vIENhbGN1bGF0ZSBHYXVzc2lhbiBibHVyIG9mIGFuIGltYWdlIHVzaW5nIElJUiBmaWx0ZXJcbi8vIFRoZSBtZXRob2QgaXMgdGFrZW4gZnJvbSBJbnRlbCdzIHdoaXRlIHBhcGVyIGFuZCBjb2RlIGV4YW1wbGUgYXR0YWNoZWQgdG8gaXQ6XG4vLyBodHRwczovL3NvZnR3YXJlLmludGVsLmNvbS9lbi11cy9hcnRpY2xlcy9paXItZ2F1c3NpYW4tYmx1ci1maWx0ZXJcbi8vIC1pbXBsZW1lbnRhdGlvbi11c2luZy1pbnRlbC1hZHZhbmNlZC12ZWN0b3ItZXh0ZW5zaW9uc1xuXG52YXIgYTAsIGExLCBhMiwgYTMsIGIxLCBiMiwgbGVmdF9jb3JuZXIsIHJpZ2h0X2Nvcm5lcjtcblxuZnVuY3Rpb24gZ2F1c3NDb2VmKHNpZ21hKSB7XG4gIGlmIChzaWdtYSA8IDAuNSkge1xuICAgIHNpZ21hID0gMC41O1xuICB9XG5cbiAgdmFyIGEgPSBNYXRoLmV4cCgwLjcyNiAqIDAuNzI2KSAvIHNpZ21hLFxuICAgICAgZzEgPSBNYXRoLmV4cCgtYSksXG4gICAgICBnMiA9IE1hdGguZXhwKC0yICogYSksXG4gICAgICBrID0gKDEgLSBnMSkgKiAoMSAtIGcxKSAvICgxICsgMiAqIGEgKiBnMSAtIGcyKTtcblxuICBhMCA9IGs7XG4gIGExID0gayAqIChhIC0gMSkgKiBnMTtcbiAgYTIgPSBrICogKGEgKyAxKSAqIGcxO1xuICBhMyA9IC1rICogZzI7XG4gIGIxID0gMiAqIGcxO1xuICBiMiA9IC1nMjtcbiAgbGVmdF9jb3JuZXIgPSAoYTAgKyBhMSkgLyAoMSAtIGIxIC0gYjIpO1xuICByaWdodF9jb3JuZXIgPSAoYTIgKyBhMykgLyAoMSAtIGIxIC0gYjIpO1xuXG4gIC8vIEF0dGVtcHQgdG8gZm9yY2UgdHlwZSB0byBGUDMyLlxuICByZXR1cm4gbmV3IEZsb2F0MzJBcnJheShbIGEwLCBhMSwgYTIsIGEzLCBiMSwgYjIsIGxlZnRfY29ybmVyLCByaWdodF9jb3JuZXIgXSk7XG59XG5cbmZ1bmN0aW9uIGNvbnZvbHZlTW9ubzE2KHNyYywgb3V0LCBsaW5lLCBjb2VmZiwgd2lkdGgsIGhlaWdodCkge1xuICAvLyB0YWtlcyBzcmMgaW1hZ2UgYW5kIHdyaXRlcyB0aGUgYmx1cnJlZCBhbmQgdHJhbnNwb3NlZCByZXN1bHQgaW50byBvdXRcblxuICB2YXIgcHJldl9zcmMsIGN1cnJfc3JjLCBjdXJyX291dCwgcHJldl9vdXQsIHByZXZfcHJldl9vdXQ7XG4gIHZhciBzcmNfaW5kZXgsIG91dF9pbmRleCwgbGluZV9pbmRleDtcbiAgdmFyIGksIGo7XG4gIHZhciBjb2VmZl9hMCwgY29lZmZfYTEsIGNvZWZmX2IxLCBjb2VmZl9iMjtcblxuICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHtcbiAgICBzcmNfaW5kZXggPSBpICogd2lkdGg7XG4gICAgb3V0X2luZGV4ID0gaTtcbiAgICBsaW5lX2luZGV4ID0gMDtcblxuICAgIC8vIGxlZnQgdG8gcmlnaHRcbiAgICBwcmV2X3NyYyA9IHNyY1tzcmNfaW5kZXhdO1xuICAgIHByZXZfcHJldl9vdXQgPSBwcmV2X3NyYyAqIGNvZWZmWzZdO1xuICAgIHByZXZfb3V0ID0gcHJldl9wcmV2X291dDtcblxuICAgIGNvZWZmX2EwID0gY29lZmZbMF07XG4gICAgY29lZmZfYTEgPSBjb2VmZlsxXTtcbiAgICBjb2VmZl9iMSA9IGNvZWZmWzRdO1xuICAgIGNvZWZmX2IyID0gY29lZmZbNV07XG5cbiAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykge1xuICAgICAgY3Vycl9zcmMgPSBzcmNbc3JjX2luZGV4XTtcblxuICAgICAgY3Vycl9vdXQgPSBjdXJyX3NyYyAqIGNvZWZmX2EwICtcbiAgICAgICAgICAgICAgICAgcHJldl9zcmMgKiBjb2VmZl9hMSArXG4gICAgICAgICAgICAgICAgIHByZXZfb3V0ICogY29lZmZfYjEgK1xuICAgICAgICAgICAgICAgICBwcmV2X3ByZXZfb3V0ICogY29lZmZfYjI7XG5cbiAgICAgIHByZXZfcHJldl9vdXQgPSBwcmV2X291dDtcbiAgICAgIHByZXZfb3V0ID0gY3Vycl9vdXQ7XG4gICAgICBwcmV2X3NyYyA9IGN1cnJfc3JjO1xuXG4gICAgICBsaW5lW2xpbmVfaW5kZXhdID0gcHJldl9vdXQ7XG4gICAgICBsaW5lX2luZGV4Kys7XG4gICAgICBzcmNfaW5kZXgrKztcbiAgICB9XG5cbiAgICBzcmNfaW5kZXgtLTtcbiAgICBsaW5lX2luZGV4LS07XG4gICAgb3V0X2luZGV4ICs9IGhlaWdodCAqICh3aWR0aCAtIDEpO1xuXG4gICAgLy8gcmlnaHQgdG8gbGVmdFxuICAgIHByZXZfc3JjID0gc3JjW3NyY19pbmRleF07XG4gICAgcHJldl9wcmV2X291dCA9IHByZXZfc3JjICogY29lZmZbN107XG4gICAgcHJldl9vdXQgPSBwcmV2X3ByZXZfb3V0O1xuICAgIGN1cnJfc3JjID0gcHJldl9zcmM7XG5cbiAgICBjb2VmZl9hMCA9IGNvZWZmWzJdO1xuICAgIGNvZWZmX2ExID0gY29lZmZbM107XG5cbiAgICBmb3IgKGogPSB3aWR0aCAtIDE7IGogPj0gMDsgai0tKSB7XG4gICAgICBjdXJyX291dCA9IGN1cnJfc3JjICogY29lZmZfYTAgK1xuICAgICAgICAgICAgICAgICBwcmV2X3NyYyAqIGNvZWZmX2ExICtcbiAgICAgICAgICAgICAgICAgcHJldl9vdXQgKiBjb2VmZl9iMSArXG4gICAgICAgICAgICAgICAgIHByZXZfcHJldl9vdXQgKiBjb2VmZl9iMjtcblxuICAgICAgcHJldl9wcmV2X291dCA9IHByZXZfb3V0O1xuICAgICAgcHJldl9vdXQgPSBjdXJyX291dDtcblxuICAgICAgcHJldl9zcmMgPSBjdXJyX3NyYztcbiAgICAgIGN1cnJfc3JjID0gc3JjW3NyY19pbmRleF07XG5cbiAgICAgIG91dFtvdXRfaW5kZXhdID0gbGluZVtsaW5lX2luZGV4XSArIHByZXZfb3V0O1xuXG4gICAgICBzcmNfaW5kZXgtLTtcbiAgICAgIGxpbmVfaW5kZXgtLTtcbiAgICAgIG91dF9pbmRleCAtPSBoZWlnaHQ7XG4gICAgfVxuICB9XG59XG5cblxuZnVuY3Rpb24gYmx1ck1vbm8xNihzcmMsIHdpZHRoLCBoZWlnaHQsIHJhZGl1cykge1xuICAvLyBRdWljayBleGl0IG9uIHplcm8gcmFkaXVzXG4gIGlmICghcmFkaXVzKSB7IHJldHVybjsgfVxuXG4gIHZhciBvdXQgICAgICA9IG5ldyBVaW50MTZBcnJheShzcmMubGVuZ3RoKSxcbiAgICAgIHRtcF9saW5lID0gbmV3IEZsb2F0MzJBcnJheShNYXRoLm1heCh3aWR0aCwgaGVpZ2h0KSk7XG5cbiAgdmFyIGNvZWZmID0gZ2F1c3NDb2VmKHJhZGl1cyk7XG5cbiAgY29udm9sdmVNb25vMTYoc3JjLCBvdXQsIHRtcF9saW5lLCBjb2VmZiwgd2lkdGgsIGhlaWdodCk7XG4gIGNvbnZvbHZlTW9ubzE2KG91dCwgc3JjLCB0bXBfbGluZSwgY29lZmYsIGhlaWdodCwgd2lkdGgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJsdXJNb25vMTY7XG5cbn0se31dLDE5OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbmlmICh0eXBlb2YgT2JqZWN0LmNyZWF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAvLyBpbXBsZW1lbnRhdGlvbiBmcm9tIHN0YW5kYXJkIG5vZGUuanMgJ3V0aWwnIG1vZHVsZVxuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGlmIChzdXBlckN0b3IpIHtcbiAgICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yO1xuICAgICAgY3Rvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ3Rvci5wcm90b3R5cGUsIHtcbiAgICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgICB2YWx1ZTogY3RvcixcbiAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9O1xufSBlbHNlIHtcbiAgLy8gb2xkIHNjaG9vbCBzaGltIGZvciBvbGQgYnJvd3NlcnNcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBpZiAoc3VwZXJDdG9yKSB7XG4gICAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvcjtcbiAgICAgIHZhciBUZW1wQ3RvciA9IGZ1bmN0aW9uICgpIHt9O1xuICAgICAgVGVtcEN0b3IucHJvdG90eXBlID0gc3VwZXJDdG9yLnByb3RvdHlwZTtcbiAgICAgIGN0b3IucHJvdG90eXBlID0gbmV3IFRlbXBDdG9yKCk7XG4gICAgICBjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGN0b3I7XG4gICAgfVxuICB9O1xufVxuXG59LHt9XSwyMDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cblxudmFyIGFzc2lnbiAgICAgICAgID0gX2RlcmVxXygnb2JqZWN0LWFzc2lnbicpO1xudmFyIGJhc2U2NGRlY29kZSAgID0gX2RlcmVxXygnLi9saWIvYmFzZTY0ZGVjb2RlJyk7XG52YXIgaGFzV2ViQXNzZW1ibHkgPSBfZGVyZXFfKCcuL2xpYi93YV9kZXRlY3QnKTtcblxuXG52YXIgREVGQVVMVF9PUFRJT05TID0ge1xuICBqczogdHJ1ZSxcbiAgd2FzbTogdHJ1ZVxufTtcblxuXG5mdW5jdGlvbiBNdWx0aU1hdGgob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgTXVsdGlNYXRoKSkgcmV0dXJuIG5ldyBNdWx0aU1hdGgob3B0aW9ucyk7XG5cbiAgdmFyIG9wdHMgPSBhc3NpZ24oe30sIERFRkFVTFRfT1BUSU9OUywgb3B0aW9ucyB8fCB7fSk7XG5cbiAgdGhpcy5vcHRpb25zICAgICAgICAgPSBvcHRzO1xuXG4gIHRoaXMuX19jYWNoZSAgICAgICAgID0ge307XG5cbiAgdGhpcy5fX2luaXRfcHJvbWlzZSAgPSBudWxsO1xuICB0aGlzLl9fbW9kdWxlcyAgICAgICA9IG9wdHMubW9kdWxlcyB8fCB7fTtcbiAgdGhpcy5fX21lbW9yeSAgICAgICAgPSBudWxsO1xuICB0aGlzLl9fd2FzbSAgICAgICAgICA9IHt9O1xuXG4gIHRoaXMuX19pc0xFID0gKChuZXcgVWludDMyQXJyYXkoKG5ldyBVaW50OEFycmF5KFsgMSwgMCwgMCwgMCBdKSkuYnVmZmVyKSlbMF0gPT09IDEpO1xuXG4gIGlmICghdGhpcy5vcHRpb25zLmpzICYmICF0aGlzLm9wdGlvbnMud2FzbSkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWF0aGxpYjogYXQgbGVhc3QgXCJqc1wiIG9yIFwid2FzbVwiIHNob3VsZCBiZSBlbmFibGVkJyk7XG4gIH1cbn1cblxuXG5NdWx0aU1hdGgucHJvdG90eXBlLmhhc193YXNtID0gaGFzV2ViQXNzZW1ibHk7XG5cblxuTXVsdGlNYXRoLnByb3RvdHlwZS51c2UgPSBmdW5jdGlvbiAobW9kdWxlKSB7XG4gIHRoaXMuX19tb2R1bGVzW21vZHVsZS5uYW1lXSA9IG1vZHVsZTtcblxuICAvLyBQaW4gdGhlIGJlc3QgcG9zc2libGUgaW1wbGVtZW50YXRpb25cbiAgaWYgKHRoaXMub3B0aW9ucy53YXNtICYmIHRoaXMuaGFzX3dhc20oKSAmJiBtb2R1bGUud2FzbV9mbikge1xuICAgIHRoaXNbbW9kdWxlLm5hbWVdID0gbW9kdWxlLndhc21fZm47XG4gIH0gZWxzZSB7XG4gICAgdGhpc1ttb2R1bGUubmFtZV0gPSBtb2R1bGUuZm47XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cblxuTXVsdGlNYXRoLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5fX2luaXRfcHJvbWlzZSkgcmV0dXJuIHRoaXMuX19pbml0X3Byb21pc2U7XG5cbiAgaWYgKCF0aGlzLm9wdGlvbnMuanMgJiYgdGhpcy5vcHRpb25zLndhc20gJiYgIXRoaXMuaGFzX3dhc20oKSkge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ21hdGhsaWI6IG9ubHkgXCJ3YXNtXCIgd2FzIGVuYWJsZWQsIGJ1dCBpdFxcJ3Mgbm90IHN1cHBvcnRlZCcpKTtcbiAgfVxuXG4gIHZhciBzZWxmID0gdGhpcztcblxuICB0aGlzLl9faW5pdF9wcm9taXNlID0gUHJvbWlzZS5hbGwoT2JqZWN0LmtleXMoc2VsZi5fX21vZHVsZXMpLm1hcChmdW5jdGlvbiAobmFtZSkge1xuICAgIHZhciBtb2R1bGUgPSBzZWxmLl9fbW9kdWxlc1tuYW1lXTtcblxuICAgIGlmICghc2VsZi5vcHRpb25zLndhc20gfHwgIXNlbGYuaGFzX3dhc20oKSB8fCAhbW9kdWxlLndhc21fZm4pIHJldHVybiBudWxsO1xuXG4gICAgLy8gSWYgYWxyZWFkeSBjb21waWxlZCAtIGV4aXRcbiAgICBpZiAoc2VsZi5fX3dhc21bbmFtZV0pIHJldHVybiBudWxsO1xuXG4gICAgLy8gQ29tcGlsZSB3YXNtIHNvdXJjZVxuICAgIHJldHVybiBXZWJBc3NlbWJseS5jb21waWxlKHNlbGYuX19iYXNlNjRkZWNvZGUobW9kdWxlLndhc21fc3JjKSlcbiAgICAgIC50aGVuKGZ1bmN0aW9uIChtKSB7IHNlbGYuX193YXNtW25hbWVdID0gbTsgfSk7XG4gIH0pKVxuICAgIC50aGVuKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHNlbGY7IH0pO1xuXG4gIHJldHVybiB0aGlzLl9faW5pdF9wcm9taXNlO1xufTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gTWV0aG9kcyBiZWxvdyBhcmUgZm9yIGludGVybmFsIHVzZSBmcm9tIHBsdWdpbnNcblxuXG4vLyBTaW1wbGUgZGVjb2RlIGJhc2U2NCB0byB0eXBlZCBhcnJheS4gVXNlZnVsIHRvIGxvYWQgZW1iZWRkZWQgd2ViYXNzZW1ibHlcbi8vIGNvZGUuIFlvdSBwcm9iYWJseSBkb24ndCBuZWVkIHRvIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuXG4vL1xuTXVsdGlNYXRoLnByb3RvdHlwZS5fX2Jhc2U2NGRlY29kZSA9IGJhc2U2NGRlY29kZTtcblxuXG4vLyBJbmNyZWFzZSBjdXJyZW50IG1lbW9yeSB0byBpbmNsdWRlIHNwZWNpZmllZCBudW1iZXIgb2YgYnl0ZXMuIERvIG5vdGhpbmcgaWZcbi8vIHNpemUgaXMgYWxyZWFkeSBvay4gWW91IHByb2JhYmx5IGRvbid0IG5lZWQgdG8gY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseSxcbi8vIGJlY2F1c2UgaXQgd2lsbCBiZSBpbnZva2VkIGZyb20gYC5fX2luc3RhbmNlKClgLlxuLy9cbk11bHRpTWF0aC5wcm90b3R5cGUuX19yZWFsbG9jYXRlID0gZnVuY3Rpb24gbWVtX2dyb3dfdG8oYnl0ZXMpIHtcbiAgaWYgKCF0aGlzLl9fbWVtb3J5KSB7XG4gICAgdGhpcy5fX21lbW9yeSA9IG5ldyBXZWJBc3NlbWJseS5NZW1vcnkoe1xuICAgICAgaW5pdGlhbDogTWF0aC5jZWlsKGJ5dGVzIC8gKDY0ICogMTAyNCkpXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuX19tZW1vcnk7XG4gIH1cblxuICB2YXIgbWVtX3NpemUgPSB0aGlzLl9fbWVtb3J5LmJ1ZmZlci5ieXRlTGVuZ3RoO1xuXG4gIGlmIChtZW1fc2l6ZSA8IGJ5dGVzKSB7XG4gICAgdGhpcy5fX21lbW9yeS5ncm93KE1hdGguY2VpbCgoYnl0ZXMgLSBtZW1fc2l6ZSkgLyAoNjQgKiAxMDI0KSkpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuX19tZW1vcnk7XG59O1xuXG5cbi8vIFJldHVybnMgaW5zdGFudGluYXRlZCB3ZWJhc3NlbWJseSBpdGVtIGJ5IG5hbWUsIHdpdGggc3BlY2lmaWVkIG1lbW9yeSBzaXplXG4vLyBhbmQgZW52aXJvbm1lbnQuXG4vLyAtIHVzZSBjYWNoZSBpZiBhdmFpbGFibGVcbi8vIC0gZG8gc3luYyBtb2R1bGUgaW5pdCwgaWYgYXN5bmMgaW5pdCB3YXMgbm90IGNhbGxlZCBlYXJsaWVyXG4vLyAtIGFsbG9jYXRlIG1lbW9yeSBpZiBub3QgZW5vdWd0aFxuLy8gLSBjYW4gZXhwb3J0IGZ1bmN0aW9ucyB0byB3ZWJhc3NlbWJseSB2aWEgXCJlbnZfZXh0cmFcIixcbi8vICAgZm9yIGV4YW1wbGUsIHsgZXhwOiBNYXRoLmV4cCB9XG4vL1xuTXVsdGlNYXRoLnByb3RvdHlwZS5fX2luc3RhbmNlID0gZnVuY3Rpb24gaW5zdGFuY2UobmFtZSwgbWVtc2l6ZSwgZW52X2V4dHJhKSB7XG4gIGlmIChtZW1zaXplKSB0aGlzLl9fcmVhbGxvY2F0ZShtZW1zaXplKTtcblxuICAvLyBJZiAuaW5pdCgpIHdhcyBub3QgY2FsbGVkLCBkbyBzeW5jIGNvbXBpbGVcbiAgaWYgKCF0aGlzLl9fd2FzbVtuYW1lXSkge1xuICAgIHZhciBtb2R1bGUgPSB0aGlzLl9fbW9kdWxlc1tuYW1lXTtcbiAgICB0aGlzLl9fd2FzbVtuYW1lXSA9IG5ldyBXZWJBc3NlbWJseS5Nb2R1bGUodGhpcy5fX2Jhc2U2NGRlY29kZShtb2R1bGUud2FzbV9zcmMpKTtcbiAgfVxuXG4gIGlmICghdGhpcy5fX2NhY2hlW25hbWVdKSB7XG4gICAgdmFyIGVudl9iYXNlID0ge1xuICAgICAgbWVtb3J5QmFzZTogMCxcbiAgICAgIG1lbW9yeTogdGhpcy5fX21lbW9yeSxcbiAgICAgIHRhYmxlQmFzZTogMCxcbiAgICAgIHRhYmxlOiBuZXcgV2ViQXNzZW1ibHkuVGFibGUoeyBpbml0aWFsOiAwLCBlbGVtZW50OiAnYW55ZnVuYycgfSlcbiAgICB9O1xuXG4gICAgdGhpcy5fX2NhY2hlW25hbWVdID0gbmV3IFdlYkFzc2VtYmx5Lkluc3RhbmNlKHRoaXMuX193YXNtW25hbWVdLCB7XG4gICAgICBlbnY6IGFzc2lnbihlbnZfYmFzZSwgZW52X2V4dHJhIHx8IHt9KVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuX19jYWNoZVtuYW1lXTtcbn07XG5cblxuLy8gSGVscGVyIHRvIGNhbGN1bGF0ZSBtZW1vcnkgYWxpZ2ggZm9yIHBvaW50ZXJzLiBXZWJhc3NlbWJseSBkb2VzIG5vdCByZXF1aXJlXG4vLyB0aGlzLCBidXQgeW91IG1heSB3aXNoIHRvIGV4cGVyaW1lbnQuIERlZmF1bHQgYmFzZSA9IDg7XG4vL1xuTXVsdGlNYXRoLnByb3RvdHlwZS5fX2FsaWduID0gZnVuY3Rpb24gYWxpZ24obnVtYmVyLCBiYXNlKSB7XG4gIGJhc2UgPSBiYXNlIHx8IDg7XG4gIHZhciByZW1pbmRlciA9IG51bWJlciAlIGJhc2U7XG4gIHJldHVybiBudW1iZXIgKyAocmVtaW5kZXIgPyBiYXNlIC0gcmVtaW5kZXIgOiAwKTtcbn07XG5cblxubW9kdWxlLmV4cG9ydHMgPSBNdWx0aU1hdGg7XG5cbn0se1wiLi9saWIvYmFzZTY0ZGVjb2RlXCI6MjEsXCIuL2xpYi93YV9kZXRlY3RcIjoyMixcIm9iamVjdC1hc3NpZ25cIjoyM31dLDIxOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblxuXG52YXIgQkFTRTY0X01BUCA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJztcblxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGJhc2U2NGRlY29kZShzdHIpIHtcbiAgdmFyIGlucHV0ID0gc3RyLnJlcGxhY2UoL1tcXHJcXG49XS9nLCAnJyksIC8vIHJlbW92ZSBDUi9MRiAmIHBhZGRpbmcgdG8gc2ltcGxpZnkgc2NhblxuICAgICAgbWF4ICAgPSBpbnB1dC5sZW5ndGg7XG5cbiAgdmFyIG91dCA9IG5ldyBVaW50OEFycmF5KChtYXggKiAzKSA+PiAyKTtcblxuICAvLyBDb2xsZWN0IGJ5IDYqNCBiaXRzICgzIGJ5dGVzKVxuXG4gIHZhciBiaXRzID0gMDtcbiAgdmFyIHB0ciAgPSAwO1xuXG4gIGZvciAodmFyIGlkeCA9IDA7IGlkeCA8IG1heDsgaWR4KyspIHtcbiAgICBpZiAoKGlkeCAlIDQgPT09IDApICYmIGlkeCkge1xuICAgICAgb3V0W3B0cisrXSA9IChiaXRzID4+IDE2KSAmIDB4RkY7XG4gICAgICBvdXRbcHRyKytdID0gKGJpdHMgPj4gOCkgJiAweEZGO1xuICAgICAgb3V0W3B0cisrXSA9IGJpdHMgJiAweEZGO1xuICAgIH1cblxuICAgIGJpdHMgPSAoYml0cyA8PCA2KSB8IEJBU0U2NF9NQVAuaW5kZXhPZihpbnB1dC5jaGFyQXQoaWR4KSk7XG4gIH1cblxuICAvLyBEdW1wIHRhaWxcblxuICB2YXIgdGFpbGJpdHMgPSAobWF4ICUgNCkgKiA2O1xuXG4gIGlmICh0YWlsYml0cyA9PT0gMCkge1xuICAgIG91dFtwdHIrK10gPSAoYml0cyA+PiAxNikgJiAweEZGO1xuICAgIG91dFtwdHIrK10gPSAoYml0cyA+PiA4KSAmIDB4RkY7XG4gICAgb3V0W3B0cisrXSA9IGJpdHMgJiAweEZGO1xuICB9IGVsc2UgaWYgKHRhaWxiaXRzID09PSAxOCkge1xuICAgIG91dFtwdHIrK10gPSAoYml0cyA+PiAxMCkgJiAweEZGO1xuICAgIG91dFtwdHIrK10gPSAoYml0cyA+PiAyKSAmIDB4RkY7XG4gIH0gZWxzZSBpZiAodGFpbGJpdHMgPT09IDEyKSB7XG4gICAgb3V0W3B0cisrXSA9IChiaXRzID4+IDQpICYgMHhGRjtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59O1xuXG59LHt9XSwyMjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cblxudmFyIHdhO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaGFzV2ViQXNzZW1ibHkoKSB7XG4gIC8vIHVzZSBjYWNoZSBpZiBjYWxsZWQgYmVmb3JlO1xuICBpZiAodHlwZW9mIHdhICE9PSAndW5kZWZpbmVkJykgcmV0dXJuIHdhO1xuXG4gIHdhID0gZmFsc2U7XG5cbiAgaWYgKHR5cGVvZiBXZWJBc3NlbWJseSA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybiB3YTtcblxuICAvLyBJZiBXZWJBc3NlbmJseSBpcyBkaXNhYmxlZCwgY29kZSBjYW4gdGhyb3cgb24gY29tcGlsZVxuICB0cnkge1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9icmlvbi9taW4td2FzbS1mYWlsL2Jsb2IvbWFzdGVyL21pbi13YXNtLWZhaWwuaW4uanNcbiAgICAvLyBBZGRpdGlvbmFsIGNoZWNrIHRoYXQgV0EgaW50ZXJuYWxzIGFyZSBjb3JyZWN0XG5cbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBjb21tYS1zcGFjaW5nLCBtYXgtbGVuICovXG4gICAgdmFyIGJpbiAgICAgID0gbmV3IFVpbnQ4QXJyYXkoWyAwLDk3LDExNSwxMDksMSwwLDAsMCwxLDYsMSw5NiwxLDEyNywxLDEyNywzLDIsMSwwLDUsMywxLDAsMSw3LDgsMSw0LDExNiwxMDEsMTE1LDExNiwwLDAsMTAsMTYsMSwxNCwwLDMyLDAsNjUsMSw1NCwyLDAsMzIsMCw0MCwyLDAsMTEgXSk7XG4gICAgdmFyIG1vZHVsZSAgID0gbmV3IFdlYkFzc2VtYmx5Lk1vZHVsZShiaW4pO1xuICAgIHZhciBpbnN0YW5jZSA9IG5ldyBXZWJBc3NlbWJseS5JbnN0YW5jZShtb2R1bGUsIHt9KTtcblxuICAgIC8vIHRlc3Qgc3RvcmluZyB0byBhbmQgbG9hZGluZyBmcm9tIGEgbm9uLXplcm8gbG9jYXRpb24gdmlhIGEgcGFyYW1ldGVyLlxuICAgIC8vIFNhZmFyaSBvbiBpT1MgMTEuMi41IHJldHVybnMgMCB1bmV4cGVjdGVkbHkgYXQgbm9uLXplcm8gbG9jYXRpb25zXG4gICAgaWYgKGluc3RhbmNlLmV4cG9ydHMudGVzdCg0KSAhPT0gMCkgd2EgPSB0cnVlO1xuXG4gICAgcmV0dXJuIHdhO1xuICB9IGNhdGNoIChfXykge31cblxuICByZXR1cm4gd2E7XG59O1xuXG59LHt9XSwyMzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xudmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIHByb3BJc0VudW1lcmFibGUgPSBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXG5mdW5jdGlvbiB0b09iamVjdCh2YWwpIHtcblx0aWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ09iamVjdC5hc3NpZ24gY2Fubm90IGJlIGNhbGxlZCB3aXRoIG51bGwgb3IgdW5kZWZpbmVkJyk7XG5cdH1cblxuXHRyZXR1cm4gT2JqZWN0KHZhbCk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFVzZU5hdGl2ZSgpIHtcblx0dHJ5IHtcblx0XHRpZiAoIU9iamVjdC5hc3NpZ24pIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBEZXRlY3QgYnVnZ3kgcHJvcGVydHkgZW51bWVyYXRpb24gb3JkZXIgaW4gb2xkZXIgVjggdmVyc2lvbnMuXG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD00MTE4XG5cdFx0dmFyIHRlc3QxID0gbmV3IFN0cmluZygnYWJjJyk7ICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ldy13cmFwcGVyc1xuXHRcdHRlc3QxWzVdID0gJ2RlJztcblx0XHRpZiAoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGVzdDEpWzBdID09PSAnNScpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zMDU2XG5cdFx0dmFyIHRlc3QyID0ge307XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XG5cdFx0XHR0ZXN0MlsnXycgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpXSA9IGk7XG5cdFx0fVxuXHRcdHZhciBvcmRlcjIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0ZXN0MikubWFwKGZ1bmN0aW9uIChuKSB7XG5cdFx0XHRyZXR1cm4gdGVzdDJbbl07XG5cdFx0fSk7XG5cdFx0aWYgKG9yZGVyMi5qb2luKCcnKSAhPT0gJzAxMjM0NTY3ODknKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzA1NlxuXHRcdHZhciB0ZXN0MyA9IHt9O1xuXHRcdCdhYmNkZWZnaGlqa2xtbm9wcXJzdCcuc3BsaXQoJycpLmZvckVhY2goZnVuY3Rpb24gKGxldHRlcikge1xuXHRcdFx0dGVzdDNbbGV0dGVyXSA9IGxldHRlcjtcblx0XHR9KTtcblx0XHRpZiAoT2JqZWN0LmtleXMoT2JqZWN0LmFzc2lnbih7fSwgdGVzdDMpKS5qb2luKCcnKSAhPT1cblx0XHRcdFx0J2FiY2RlZmdoaWprbG1ub3BxcnN0Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9IGNhdGNoIChlcnIpIHtcblx0XHQvLyBXZSBkb24ndCBleHBlY3QgYW55IG9mIHRoZSBhYm92ZSB0byB0aHJvdywgYnV0IGJldHRlciB0byBiZSBzYWZlLlxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNob3VsZFVzZU5hdGl2ZSgpID8gT2JqZWN0LmFzc2lnbiA6IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSkge1xuXHR2YXIgZnJvbTtcblx0dmFyIHRvID0gdG9PYmplY3QodGFyZ2V0KTtcblx0dmFyIHN5bWJvbHM7XG5cblx0Zm9yICh2YXIgcyA9IDE7IHMgPCBhcmd1bWVudHMubGVuZ3RoOyBzKyspIHtcblx0XHRmcm9tID0gT2JqZWN0KGFyZ3VtZW50c1tzXSk7XG5cblx0XHRmb3IgKHZhciBrZXkgaW4gZnJvbSkge1xuXHRcdFx0aWYgKGhhc093blByb3BlcnR5LmNhbGwoZnJvbSwga2V5KSkge1xuXHRcdFx0XHR0b1trZXldID0gZnJvbVtrZXldO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcblx0XHRcdHN5bWJvbHMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZnJvbSk7XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHN5bWJvbHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0aWYgKHByb3BJc0VudW1lcmFibGUuY2FsbChmcm9tLCBzeW1ib2xzW2ldKSkge1xuXHRcdFx0XHRcdHRvW3N5bWJvbHNbaV1dID0gZnJvbVtzeW1ib2xzW2ldXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiB0bztcbn07XG5cbn0se31dLDI0OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbnZhciBidW5kbGVGbiA9IGFyZ3VtZW50c1szXTtcbnZhciBzb3VyY2VzID0gYXJndW1lbnRzWzRdO1xudmFyIGNhY2hlID0gYXJndW1lbnRzWzVdO1xuXG52YXIgc3RyaW5naWZ5ID0gSlNPTi5zdHJpbmdpZnk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGZuLCBvcHRpb25zKSB7XG4gICAgdmFyIHdrZXk7XG4gICAgdmFyIGNhY2hlS2V5cyA9IE9iamVjdC5rZXlzKGNhY2hlKTtcblxuICAgIGZvciAodmFyIGkgPSAwLCBsID0gY2FjaGVLZXlzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICB2YXIga2V5ID0gY2FjaGVLZXlzW2ldO1xuICAgICAgICB2YXIgZXhwID0gY2FjaGVba2V5XS5leHBvcnRzO1xuICAgICAgICAvLyBVc2luZyBiYWJlbCBhcyBhIHRyYW5zcGlsZXIgdG8gdXNlIGVzbW9kdWxlLCB0aGUgZXhwb3J0IHdpbGwgYWx3YXlzXG4gICAgICAgIC8vIGJlIGFuIG9iamVjdCB3aXRoIHRoZSBkZWZhdWx0IGV4cG9ydCBhcyBhIHByb3BlcnR5IG9mIGl0LiBUbyBlbnN1cmVcbiAgICAgICAgLy8gdGhlIGV4aXN0aW5nIGFwaSBhbmQgYmFiZWwgZXNtb2R1bGUgZXhwb3J0cyBhcmUgYm90aCBzdXBwb3J0ZWQgd2VcbiAgICAgICAgLy8gY2hlY2sgZm9yIGJvdGhcbiAgICAgICAgaWYgKGV4cCA9PT0gZm4gfHwgZXhwICYmIGV4cC5kZWZhdWx0ID09PSBmbikge1xuICAgICAgICAgICAgd2tleSA9IGtleTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF3a2V5KSB7XG4gICAgICAgIHdrZXkgPSBNYXRoLmZsb29yKE1hdGgucG93KDE2LCA4KSAqIE1hdGgucmFuZG9tKCkpLnRvU3RyaW5nKDE2KTtcbiAgICAgICAgdmFyIHdjYWNoZSA9IHt9O1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGNhY2hlS2V5cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBrZXkgPSBjYWNoZUtleXNbaV07XG4gICAgICAgICAgICB3Y2FjaGVba2V5XSA9IGtleTtcbiAgICAgICAgfVxuICAgICAgICBzb3VyY2VzW3drZXldID0gW1xuICAgICAgICAgICAgJ2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeycgKyBmbiArICcoc2VsZik7IH0nLFxuICAgICAgICAgICAgd2NhY2hlXG4gICAgICAgIF07XG4gICAgfVxuICAgIHZhciBza2V5ID0gTWF0aC5mbG9vcihNYXRoLnBvdygxNiwgOCkgKiBNYXRoLnJhbmRvbSgpKS50b1N0cmluZygxNik7XG5cbiAgICB2YXIgc2NhY2hlID0ge307IHNjYWNoZVt3a2V5XSA9IHdrZXk7XG4gICAgc291cmNlc1tza2V5XSA9IFtcbiAgICAgICAgJ2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeycgK1xuICAgICAgICAgICAgLy8gdHJ5IHRvIGNhbGwgZGVmYXVsdCBpZiBkZWZpbmVkIHRvIGFsc28gc3VwcG9ydCBiYWJlbCBlc21vZHVsZSBleHBvcnRzXG4gICAgICAgICAgICAndmFyIGYgPSByZXF1aXJlKCcgKyBzdHJpbmdpZnkod2tleSkgKyAnKTsnICtcbiAgICAgICAgICAgICcoZi5kZWZhdWx0ID8gZi5kZWZhdWx0IDogZikoc2VsZik7JyArXG4gICAgICAgICd9JyxcbiAgICAgICAgc2NhY2hlXG4gICAgXTtcblxuICAgIHZhciB3b3JrZXJTb3VyY2VzID0ge307XG4gICAgcmVzb2x2ZVNvdXJjZXMoc2tleSk7XG5cbiAgICBmdW5jdGlvbiByZXNvbHZlU291cmNlcyhrZXkpIHtcbiAgICAgICAgd29ya2VyU291cmNlc1trZXldID0gdHJ1ZTtcblxuICAgICAgICBmb3IgKHZhciBkZXBQYXRoIGluIHNvdXJjZXNba2V5XVsxXSkge1xuICAgICAgICAgICAgdmFyIGRlcEtleSA9IHNvdXJjZXNba2V5XVsxXVtkZXBQYXRoXTtcbiAgICAgICAgICAgIGlmICghd29ya2VyU291cmNlc1tkZXBLZXldKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZVNvdXJjZXMoZGVwS2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBzcmMgPSAnKCcgKyBidW5kbGVGbiArICcpKHsnXG4gICAgICAgICsgT2JqZWN0LmtleXMod29ya2VyU291cmNlcykubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmdpZnkoa2V5KSArICc6WydcbiAgICAgICAgICAgICAgICArIHNvdXJjZXNba2V5XVswXVxuICAgICAgICAgICAgICAgICsgJywnICsgc3RyaW5naWZ5KHNvdXJjZXNba2V5XVsxXSkgKyAnXSdcbiAgICAgICAgICAgIDtcbiAgICAgICAgfSkuam9pbignLCcpXG4gICAgICAgICsgJ30se30sWycgKyBzdHJpbmdpZnkoc2tleSkgKyAnXSknXG4gICAgO1xuXG4gICAgdmFyIFVSTCA9IHdpbmRvdy5VUkwgfHwgd2luZG93LndlYmtpdFVSTCB8fCB3aW5kb3cubW96VVJMIHx8IHdpbmRvdy5tc1VSTDtcblxuICAgIHZhciBibG9iID0gbmV3IEJsb2IoW3NyY10sIHsgdHlwZTogJ3RleHQvamF2YXNjcmlwdCcgfSk7XG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5iYXJlKSB7IHJldHVybiBibG9iOyB9XG4gICAgdmFyIHdvcmtlclVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgdmFyIHdvcmtlciA9IG5ldyBXb3JrZXIod29ya2VyVXJsKTtcbiAgICB3b3JrZXIub2JqZWN0VVJMID0gd29ya2VyVXJsO1xuICAgIHJldHVybiB3b3JrZXI7XG59O1xuXG59LHt9XSxcIi9pbmRleC5qc1wiOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblxuZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXkoYXJyLCBpKSB7IHJldHVybiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB8fCBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyLCBpKSB8fCBfbm9uSXRlcmFibGVSZXN0KCk7IH1cblxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHsgdmFyIF9pID0gYXJyID09IG51bGwgPyBudWxsIDogdHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBhcnJbU3ltYm9sLml0ZXJhdG9yXSB8fCBhcnJbXCJAQGl0ZXJhdG9yXCJdOyBpZiAoX2kgPT0gbnVsbCkgcmV0dXJuOyB2YXIgX2FyciA9IFtdOyB2YXIgX24gPSB0cnVlOyB2YXIgX2QgPSBmYWxzZTsgdmFyIF9zLCBfZTsgdHJ5IHsgZm9yIChfaSA9IF9pLmNhbGwoYXJyKTsgIShfbiA9IChfcyA9IF9pLm5leHQoKSkuZG9uZSk7IF9uID0gdHJ1ZSkgeyBfYXJyLnB1c2goX3MudmFsdWUpOyBpZiAoaSAmJiBfYXJyLmxlbmd0aCA9PT0gaSkgYnJlYWs7IH0gfSBjYXRjaCAoZXJyKSB7IF9kID0gdHJ1ZTsgX2UgPSBlcnI7IH0gZmluYWxseSB7IHRyeSB7IGlmICghX24gJiYgX2lbXCJyZXR1cm5cIl0gIT0gbnVsbCkgX2lbXCJyZXR1cm5cIl0oKTsgfSBmaW5hbGx5IHsgaWYgKF9kKSB0aHJvdyBfZTsgfSB9IHJldHVybiBfYXJyOyB9XG5cbmZ1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjsgfVxuXG52YXIgYXNzaWduID0gX2RlcmVxXygnb2JqZWN0LWFzc2lnbicpO1xuXG52YXIgd2Vid29ya2lmeSA9IF9kZXJlcV8oJ3dlYndvcmtpZnknKTtcblxudmFyIE1hdGhMaWIgPSBfZGVyZXFfKCcuL2xpYi9tYXRobGliJyk7XG5cbnZhciBQb29sID0gX2RlcmVxXygnLi9saWIvcG9vbCcpO1xuXG52YXIgdXRpbHMgPSBfZGVyZXFfKCcuL2xpYi91dGlscycpO1xuXG52YXIgd29ya2VyID0gX2RlcmVxXygnLi9saWIvd29ya2VyJyk7XG5cbnZhciBjcmVhdGVTdGFnZXMgPSBfZGVyZXFfKCcuL2xpYi9zdGVwcGVyJyk7XG5cbnZhciBjcmVhdGVSZWdpb25zID0gX2RlcmVxXygnLi9saWIvdGlsZXInKTsgLy8gRGVkdXBsaWNhdGUgcG9vbHMgJiBsaW1pdGVycyB3aXRoIHRoZSBzYW1lIGNvbmZpZ3Ncbi8vIHdoZW4gdXNlciBjcmVhdGVzIG11bHRpcGxlIHBpY2EgaW5zdGFuY2VzLlxuXG5cbnZhciBzaW5nbGV0b25lcyA9IHt9O1xudmFyIE5FRURfU0FGQVJJX0ZJWCA9IGZhbHNlO1xuXG50cnkge1xuICBpZiAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCkge1xuICAgIE5FRURfU0FGQVJJX0ZJWCA9IG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignU2FmYXJpJykgPj0gMDtcbiAgfVxufSBjYXRjaCAoZSkge31cblxudmFyIGNvbmN1cnJlbmN5ID0gMTtcblxuaWYgKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnKSB7XG4gIGNvbmN1cnJlbmN5ID0gTWF0aC5taW4obmF2aWdhdG9yLmhhcmR3YXJlQ29uY3VycmVuY3kgfHwgMSwgNCk7XG59XG5cbnZhciBERUZBVUxUX1BJQ0FfT1BUUyA9IHtcbiAgdGlsZTogMTAyNCxcbiAgY29uY3VycmVuY3k6IGNvbmN1cnJlbmN5LFxuICBmZWF0dXJlczogWydqcycsICd3YXNtJywgJ3d3J10sXG4gIGlkbGU6IDIwMDAsXG4gIGNyZWF0ZUNhbnZhczogZnVuY3Rpb24gY3JlYXRlQ2FudmFzKHdpZHRoLCBoZWlnaHQpIHtcbiAgICB2YXIgdG1wQ2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgdG1wQ2FudmFzLndpZHRoID0gd2lkdGg7XG4gICAgdG1wQ2FudmFzLmhlaWdodCA9IGhlaWdodDtcbiAgICByZXR1cm4gdG1wQ2FudmFzO1xuICB9XG59O1xudmFyIERFRkFVTFRfUkVTSVpFX09QVFMgPSB7XG4gIHF1YWxpdHk6IDMsXG4gIGFscGhhOiBmYWxzZSxcbiAgdW5zaGFycEFtb3VudDogMCxcbiAgdW5zaGFycFJhZGl1czogMC4wLFxuICB1bnNoYXJwVGhyZXNob2xkOiAwXG59O1xudmFyIENBTl9ORVdfSU1BR0VfREFUQSA9IGZhbHNlO1xudmFyIENBTl9DUkVBVEVfSU1BR0VfQklUTUFQID0gZmFsc2U7XG52YXIgQ0FOX1VTRV9DQU5WQVNfR0VUX0lNQUdFX0RBVEEgPSBmYWxzZTtcbnZhciBDQU5fVVNFX09GRlNDUkVFTl9DQU5WQVMgPSBmYWxzZTtcbnZhciBDQU5fVVNFX0NJQl9SRUdJT05fRk9SX0lNQUdFID0gZmFsc2U7XG5cbmZ1bmN0aW9uIHdvcmtlckZhYnJpYygpIHtcbiAgcmV0dXJuIHtcbiAgICB2YWx1ZTogd2Vid29ya2lmeSh3b3JrZXIpLFxuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICB0aGlzLnZhbHVlLnRlcm1pbmF0ZSgpO1xuXG4gICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdmFyIHVybCA9IHdpbmRvdy5VUkwgfHwgd2luZG93LndlYmtpdFVSTCB8fCB3aW5kb3cubW96VVJMIHx8IHdpbmRvdy5tc1VSTDtcblxuICAgICAgICBpZiAodXJsICYmIHVybC5yZXZva2VPYmplY3RVUkwgJiYgdGhpcy52YWx1ZS5vYmplY3RVUkwpIHtcbiAgICAgICAgICB1cmwucmV2b2tlT2JqZWN0VVJMKHRoaXMudmFsdWUub2JqZWN0VVJMKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcbn0gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIEFQSSBtZXRob2RzXG5cblxuZnVuY3Rpb24gUGljYShvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBQaWNhKSkgcmV0dXJuIG5ldyBQaWNhKG9wdGlvbnMpO1xuICB0aGlzLm9wdGlvbnMgPSBhc3NpZ24oe30sIERFRkFVTFRfUElDQV9PUFRTLCBvcHRpb25zIHx8IHt9KTtcbiAgdmFyIGxpbWl0ZXJfa2V5ID0gXCJsa19cIi5jb25jYXQodGhpcy5vcHRpb25zLmNvbmN1cnJlbmN5KTsgLy8gU2hhcmUgbGltaXRlcnMgdG8gYXZvaWQgbXVsdGlwbGUgcGFyYWxsZWwgd29ya2VycyB3aGVuIHVzZXIgY3JlYXRlc1xuICAvLyBtdWx0aXBsZSBwaWNhIGluc3RhbmNlcy5cblxuICB0aGlzLl9fbGltaXQgPSBzaW5nbGV0b25lc1tsaW1pdGVyX2tleV0gfHwgdXRpbHMubGltaXRlcih0aGlzLm9wdGlvbnMuY29uY3VycmVuY3kpO1xuICBpZiAoIXNpbmdsZXRvbmVzW2xpbWl0ZXJfa2V5XSkgc2luZ2xldG9uZXNbbGltaXRlcl9rZXldID0gdGhpcy5fX2xpbWl0OyAvLyBMaXN0IG9mIHN1cHBvcnRlZCBmZWF0dXJlcywgYWNjb3JkaW5nIHRvIG9wdGlvbnMgJiBicm93c2VyL25vZGUuanNcblxuICB0aGlzLmZlYXR1cmVzID0ge1xuICAgIGpzOiBmYWxzZSxcbiAgICAvLyBwdXJlIEpTIGltcGxlbWVudGF0aW9uLCBjYW4gYmUgZGlzYWJsZWQgZm9yIHRlc3RpbmdcbiAgICB3YXNtOiBmYWxzZSxcbiAgICAvLyB3ZWJhc3NlbWJseSBpbXBsZW1lbnRhdGlvbiBmb3IgaGVhdnkgZnVuY3Rpb25zXG4gICAgY2liOiBmYWxzZSxcbiAgICAvLyByZXNpemUgdmlhIGNyZWF0ZUltYWdlQml0bWFwIChvbmx5IEZGIGF0IHRoaXMgbW9tZW50KVxuICAgIHd3OiBmYWxzZSAvLyB3ZWJ3b3JrZXJzXG5cbiAgfTtcbiAgdGhpcy5fX3dvcmtlcnNQb29sID0gbnVsbDsgLy8gU3RvcmUgcmVxdWVzdGVkIGZlYXR1cmVzIGZvciB3ZWJ3b3JrZXJzXG5cbiAgdGhpcy5fX3JlcXVlc3RlZF9mZWF0dXJlcyA9IFtdO1xuICB0aGlzLl9fbWF0aGxpYiA9IG51bGw7XG59XG5cblBpY2EucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgaWYgKHRoaXMuX19pbml0UHJvbWlzZSkgcmV0dXJuIHRoaXMuX19pbml0UHJvbWlzZTsgLy8gVGVzdCBpZiB3ZSBjYW4gY3JlYXRlIEltYWdlRGF0YSB3aXRob3V0IGNhbnZhcyBhbmQgbWVtb3J5IGNvcHlcblxuICBpZiAodHlwZW9mIEltYWdlRGF0YSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIFVpbnQ4Q2xhbXBlZEFycmF5ICE9PSAndW5kZWZpbmVkJykge1xuICAgIHRyeSB7XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1uZXcgKi9cbiAgICAgIG5ldyBJbWFnZURhdGEobmV3IFVpbnQ4Q2xhbXBlZEFycmF5KDQwMCksIDEwLCAxMCk7XG4gICAgICBDQU5fTkVXX0lNQUdFX0RBVEEgPSB0cnVlO1xuICAgIH0gY2F0Y2ggKF9fKSB7fVxuICB9IC8vIEltYWdlQml0bWFwIGNhbiBiZSBlZmZlY3RpdmUgaW4gMiBwbGFjZXM6XG4gIC8vXG4gIC8vIDEuIFRocmVhZGVkIGpwZWcgdW5wYWNrIChiYXNpYylcbiAgLy8gMi4gQnVpbHQtaW4gcmVzaXplIChibG9ja2VkIGR1ZSBwcm9ibGVtIGluIGNocm9tZSwgc2VlIGlzc3VlICM4OSlcbiAgLy9cbiAgLy8gRm9yIGJhc2ljIHVzZSB3ZSBhbHNvIG5lZWQgSW1hZ2VCaXRtYXAgd28gc3VwcG9ydCAuY2xvc2UoKSBtZXRob2QsXG4gIC8vIHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9ydS9kb2NzL1dlYi9BUEkvSW1hZ2VCaXRtYXBcblxuXG4gIGlmICh0eXBlb2YgSW1hZ2VCaXRtYXAgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgaWYgKEltYWdlQml0bWFwLnByb3RvdHlwZSAmJiBJbWFnZUJpdG1hcC5wcm90b3R5cGUuY2xvc2UpIHtcbiAgICAgIENBTl9DUkVBVEVfSU1BR0VfQklUTUFQID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kZWJ1ZygnSW1hZ2VCaXRtYXAgZG9lcyBub3Qgc3VwcG9ydCAuY2xvc2UoKSwgZGlzYWJsZWQnKTtcbiAgICB9XG4gIH1cblxuICB2YXIgZmVhdHVyZXMgPSB0aGlzLm9wdGlvbnMuZmVhdHVyZXMuc2xpY2UoKTtcblxuICBpZiAoZmVhdHVyZXMuaW5kZXhPZignYWxsJykgPj0gMCkge1xuICAgIGZlYXR1cmVzID0gWydjaWInLCAnd2FzbScsICdqcycsICd3dyddO1xuICB9XG5cbiAgdGhpcy5fX3JlcXVlc3RlZF9mZWF0dXJlcyA9IGZlYXR1cmVzO1xuICB0aGlzLl9fbWF0aGxpYiA9IG5ldyBNYXRoTGliKGZlYXR1cmVzKTsgLy8gQ2hlY2sgV2ViV29ya2VyIHN1cHBvcnQgaWYgcmVxdWVzdGVkXG5cbiAgaWYgKGZlYXR1cmVzLmluZGV4T2YoJ3d3JykgPj0gMCkge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiAnV29ya2VyJyBpbiB3aW5kb3cpIHtcbiAgICAgIC8vIElFIDw9IDExIGRvbid0IGFsbG93IHRvIGNyZWF0ZSB3ZWJ3b3JrZXJzIGZyb20gc3RyaW5nLiBXZSBzaG91bGQgY2hlY2sgaXQuXG4gICAgICAvLyBodHRwczovL2Nvbm5lY3QubWljcm9zb2Z0LmNvbS9JRS9mZWVkYmFjay9kZXRhaWxzLzgwMTgxMC93ZWItd29ya2Vycy1mcm9tLWJsb2ItdXJscy1pbi1pZS0xMC1hbmQtMTFcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciB3a3IgPSBfZGVyZXFfKCd3ZWJ3b3JraWZ5JykoZnVuY3Rpb24gKCkge30pO1xuXG4gICAgICAgIHdrci50ZXJtaW5hdGUoKTtcbiAgICAgICAgdGhpcy5mZWF0dXJlcy53dyA9IHRydWU7IC8vIHBvb2wgdW5pcXVlbmVzcyBkZXBlbmRzIG9uIHBvb2wgY29uZmlnICsgd2Vid29ya2VyIGNvbmZpZ1xuXG4gICAgICAgIHZhciB3cG9vbF9rZXkgPSBcIndwX1wiLmNvbmNhdChKU09OLnN0cmluZ2lmeSh0aGlzLm9wdGlvbnMpKTtcblxuICAgICAgICBpZiAoc2luZ2xldG9uZXNbd3Bvb2xfa2V5XSkge1xuICAgICAgICAgIHRoaXMuX193b3JrZXJzUG9vbCA9IHNpbmdsZXRvbmVzW3dwb29sX2tleV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fX3dvcmtlcnNQb29sID0gbmV3IFBvb2wod29ya2VyRmFicmljLCB0aGlzLm9wdGlvbnMuaWRsZSk7XG4gICAgICAgICAgc2luZ2xldG9uZXNbd3Bvb2xfa2V5XSA9IHRoaXMuX193b3JrZXJzUG9vbDtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoX18pIHt9XG4gICAgfVxuICB9XG5cbiAgdmFyIGluaXRNYXRoID0gdGhpcy5fX21hdGhsaWIuaW5pdCgpLnRoZW4oZnVuY3Rpb24gKG1hdGhsaWIpIHtcbiAgICAvLyBDb3B5IGRldGVjdGVkIGZlYXR1cmVzXG4gICAgYXNzaWduKF90aGlzLmZlYXR1cmVzLCBtYXRobGliLmZlYXR1cmVzKTtcbiAgfSk7XG5cbiAgdmFyIGNoZWNrQ2liUmVzaXplO1xuXG4gIGlmICghQ0FOX0NSRUFURV9JTUFHRV9CSVRNQVApIHtcbiAgICBjaGVja0NpYlJlc2l6ZSA9IFByb21pc2UucmVzb2x2ZShmYWxzZSk7XG4gIH0gZWxzZSB7XG4gICAgY2hlY2tDaWJSZXNpemUgPSB1dGlscy5jaWJfc3VwcG9ydCh0aGlzLm9wdGlvbnMuY3JlYXRlQ2FudmFzKS50aGVuKGZ1bmN0aW9uIChzdGF0dXMpIHtcbiAgICAgIGlmIChfdGhpcy5mZWF0dXJlcy5jaWIgJiYgZmVhdHVyZXMuaW5kZXhPZignY2liJykgPCAwKSB7XG4gICAgICAgIF90aGlzLmRlYnVnKCdjcmVhdGVJbWFnZUJpdG1hcCgpIHJlc2l6ZSBzdXBwb3J0ZWQsIGJ1dCBkaXNhYmxlZCBieSBjb25maWcnKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChmZWF0dXJlcy5pbmRleE9mKCdjaWInKSA+PSAwKSBfdGhpcy5mZWF0dXJlcy5jaWIgPSBzdGF0dXM7XG4gICAgfSk7XG4gIH1cblxuICBDQU5fVVNFX0NBTlZBU19HRVRfSU1BR0VfREFUQSA9IHV0aWxzLmNhbl91c2VfY2FudmFzKHRoaXMub3B0aW9ucy5jcmVhdGVDYW52YXMpO1xuICB2YXIgY2hlY2tPZmZzY3JlZW5DYW52YXM7XG5cbiAgaWYgKENBTl9DUkVBVEVfSU1BR0VfQklUTUFQICYmIENBTl9ORVdfSU1BR0VfREFUQSAmJiBmZWF0dXJlcy5pbmRleE9mKCd3dycpICE9PSAtMSkge1xuICAgIGNoZWNrT2Zmc2NyZWVuQ2FudmFzID0gdXRpbHMud29ya2VyX29mZnNjcmVlbl9jYW52YXNfc3VwcG9ydCgpO1xuICB9IGVsc2Uge1xuICAgIGNoZWNrT2Zmc2NyZWVuQ2FudmFzID0gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcbiAgfVxuXG4gIGNoZWNrT2Zmc2NyZWVuQ2FudmFzID0gY2hlY2tPZmZzY3JlZW5DYW52YXMudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgQ0FOX1VTRV9PRkZTQ1JFRU5fQ0FOVkFTID0gcmVzdWx0O1xuICB9KTsgLy8gd2UgdXNlIGNyZWF0ZUltYWdlQml0bWFwIHRvIGNyb3AgaW1hZ2UgZGF0YSBhbmQgcGFzcyBpdCB0byB3b3JrZXJzLFxuICAvLyBzbyBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgZnVuY3Rpb24gd29ya3MgY29ycmVjdGx5O1xuICAvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0xMjIwNjcxXG5cbiAgdmFyIGNoZWNrQ2liUmVnaW9uID0gdXRpbHMuY2liX2Nhbl91c2VfcmVnaW9uKCkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgQ0FOX1VTRV9DSUJfUkVHSU9OX0ZPUl9JTUFHRSA9IHJlc3VsdDtcbiAgfSk7IC8vIEluaXQgbWF0aCBsaWIuIFRoYXQncyBhc3luYyBiZWNhdXNlIGNhbiBsb2FkIHNvbWVcblxuICB0aGlzLl9faW5pdFByb21pc2UgPSBQcm9taXNlLmFsbChbaW5pdE1hdGgsIGNoZWNrQ2liUmVzaXplLCBjaGVja09mZnNjcmVlbkNhbnZhcywgY2hlY2tDaWJSZWdpb25dKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH0pO1xuICByZXR1cm4gdGhpcy5fX2luaXRQcm9taXNlO1xufTsgLy8gQ2FsbCByZXNpemVyIGluIHdlYndvcmtlciBvciBsb2NhbGx5LCBkZXBlbmRpbmcgb24gY29uZmlnXG5cblxuUGljYS5wcm90b3R5cGUuX19pbnZva2VSZXNpemUgPSBmdW5jdGlvbiAodGlsZU9wdHMsIG9wdHMpIHtcbiAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgLy8gU2hhcmUgY2FjaGUgYmV0d2VlbiBjYWxsczpcbiAgLy9cbiAgLy8gLSB3YXNtIGluc3RhbmNlXG4gIC8vIC0gd2FzbSBtZW1vcnkgb2JqZWN0XG4gIC8vXG4gIG9wdHMuX19tYXRoQ2FjaGUgPSBvcHRzLl9fbWF0aENhY2hlIHx8IHt9O1xuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFfdGhpczIuZmVhdHVyZXMud3cpIHtcbiAgICAgIC8vIG5vdCBwb3NzaWJsZSB0byBoYXZlIEltYWdlQml0bWFwIGhlcmUgaWYgdXNlciBkaXNhYmxlZCBXV1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YTogX3RoaXMyLl9fbWF0aGxpYi5yZXNpemVBbmRVbnNoYXJwKHRpbGVPcHRzLCBvcHRzLl9fbWF0aENhY2hlKVxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIHcgPSBfdGhpczIuX193b3JrZXJzUG9vbC5hY3F1aXJlKCk7XG5cbiAgICAgIGlmIChvcHRzLmNhbmNlbFRva2VuKSBvcHRzLmNhbmNlbFRva2VuW1wiY2F0Y2hcIl0oZnVuY3Rpb24gKGVycikge1xuICAgICAgICByZXR1cm4gcmVqZWN0KGVycik7XG4gICAgICB9KTtcblxuICAgICAgdy52YWx1ZS5vbm1lc3NhZ2UgPSBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgdy5yZWxlYXNlKCk7XG4gICAgICAgIGlmIChldi5kYXRhLmVycikgcmVqZWN0KGV2LmRhdGEuZXJyKTtlbHNlIHJlc29sdmUoZXYuZGF0YSk7XG4gICAgICB9O1xuXG4gICAgICB2YXIgdHJhbnNmZXIgPSBbXTtcbiAgICAgIGlmICh0aWxlT3B0cy5zcmMpIHRyYW5zZmVyLnB1c2godGlsZU9wdHMuc3JjLmJ1ZmZlcik7XG4gICAgICBpZiAodGlsZU9wdHMuc3JjQml0bWFwKSB0cmFuc2Zlci5wdXNoKHRpbGVPcHRzLnNyY0JpdG1hcCk7XG4gICAgICB3LnZhbHVlLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgb3B0czogdGlsZU9wdHMsXG4gICAgICAgIGZlYXR1cmVzOiBfdGhpczIuX19yZXF1ZXN0ZWRfZmVhdHVyZXMsXG4gICAgICAgIHByZWxvYWQ6IHtcbiAgICAgICAgICB3YXNtX25vZHVsZTogX3RoaXMyLl9fbWF0aGxpYi5fX1xuICAgICAgICB9XG4gICAgICB9LCB0cmFuc2Zlcik7XG4gICAgfSk7XG4gIH0pO1xufTsgLy8gdGhpcyBmdW5jdGlvbiBjYW4gcmV0dXJuIHByb21pc2UgaWYgY3JlYXRlSW1hZ2VCaXRtYXAgaXMgdXNlZFxuXG5cblBpY2EucHJvdG90eXBlLl9fZXh0cmFjdFRpbGVEYXRhID0gZnVuY3Rpb24gKHRpbGUsIGZyb20sIG9wdHMsIHN0YWdlRW52LCBleHRyYWN0VG8pIHtcbiAgaWYgKHRoaXMuZmVhdHVyZXMud3cgJiYgQ0FOX1VTRV9PRkZTQ1JFRU5fQ0FOVkFTICYmICggLy8gY3JlYXRlSW1hZ2VCaXRtYXAgZG9lc24ndCB3b3JrIGZvciBpbWFnZXMgKEltYWdlLCBJbWFnZUJpdG1hcCkgd2l0aCBFeGlmIG9yaWVudGF0aW9uIGluIENocm9tZSxcbiAgLy8gY2FuIHVzZSBjYW52YXMgYmVjYXVzZSBjYW52YXMgZG9lc24ndCBoYXZlIG9yaWVudGF0aW9uO1xuICAvLyBzZWUgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9MTIyMDY3MVxuICB1dGlscy5pc0NhbnZhcyhmcm9tKSB8fCBDQU5fVVNFX0NJQl9SRUdJT05fRk9SX0lNQUdFKSkge1xuICAgIHRoaXMuZGVidWcoJ0NyZWF0ZSB0aWxlIGZvciBPZmZzY3JlZW5DYW52YXMnKTtcbiAgICByZXR1cm4gY3JlYXRlSW1hZ2VCaXRtYXAoc3RhZ2VFbnYuc3JjSW1hZ2VCaXRtYXAgfHwgZnJvbSwgdGlsZS54LCB0aWxlLnksIHRpbGUud2lkdGgsIHRpbGUuaGVpZ2h0KS50aGVuKGZ1bmN0aW9uIChiaXRtYXApIHtcbiAgICAgIGV4dHJhY3RUby5zcmNCaXRtYXAgPSBiaXRtYXA7XG4gICAgICByZXR1cm4gZXh0cmFjdFRvO1xuICAgIH0pO1xuICB9IC8vIEV4dHJhY3QgdGlsZSBSR0JBIGJ1ZmZlciwgZGVwZW5kaW5nIG9uIGlucHV0IHR5cGVcblxuXG4gIGlmICh1dGlscy5pc0NhbnZhcyhmcm9tKSkge1xuICAgIGlmICghc3RhZ2VFbnYuc3JjQ3R4KSBzdGFnZUVudi5zcmNDdHggPSBmcm9tLmdldENvbnRleHQoJzJkJywge1xuICAgICAgYWxwaGE6IEJvb2xlYW4ob3B0cy5hbHBoYSlcbiAgICB9KTsgLy8gSWYgaW5wdXQgaXMgQ2FudmFzIC0gZXh0cmFjdCByZWdpb24gZGF0YSBkaXJlY3RseVxuXG4gICAgdGhpcy5kZWJ1ZygnR2V0IHRpbGUgcGl4ZWwgZGF0YScpO1xuICAgIGV4dHJhY3RUby5zcmMgPSBzdGFnZUVudi5zcmNDdHguZ2V0SW1hZ2VEYXRhKHRpbGUueCwgdGlsZS55LCB0aWxlLndpZHRoLCB0aWxlLmhlaWdodCkuZGF0YTtcbiAgICByZXR1cm4gZXh0cmFjdFRvO1xuICB9IC8vIElmIGlucHV0IGlzIEltYWdlIG9yIGRlY29kZWQgdG8gSW1hZ2VCaXRtYXAsXG4gIC8vIGRyYXcgcmVnaW9uIHRvIHRlbXBvcmFyeSBjYW52YXMgYW5kIGV4dHJhY3QgZGF0YSBmcm9tIGl0XG4gIC8vXG4gIC8vIE5vdGUhIEF0dGVtcHQgdG8gcmV1c2UgdGhpcyBjYW52YXMgY2F1c2VzIHNpZ25pZmljYW50IHNsb3dkb3duIGluIGNocm9tZVxuICAvL1xuXG5cbiAgdGhpcy5kZWJ1ZygnRHJhdyB0aWxlIGltYWdlQml0bWFwL2ltYWdlIHRvIHRlbXBvcmFyeSBjYW52YXMnKTtcbiAgdmFyIHRtcENhbnZhcyA9IHRoaXMub3B0aW9ucy5jcmVhdGVDYW52YXModGlsZS53aWR0aCwgdGlsZS5oZWlnaHQpO1xuICB2YXIgdG1wQ3R4ID0gdG1wQ2FudmFzLmdldENvbnRleHQoJzJkJywge1xuICAgIGFscGhhOiBCb29sZWFuKG9wdHMuYWxwaGEpXG4gIH0pO1xuICB0bXBDdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gJ2NvcHknO1xuICB0bXBDdHguZHJhd0ltYWdlKHN0YWdlRW52LnNyY0ltYWdlQml0bWFwIHx8IGZyb20sIHRpbGUueCwgdGlsZS55LCB0aWxlLndpZHRoLCB0aWxlLmhlaWdodCwgMCwgMCwgdGlsZS53aWR0aCwgdGlsZS5oZWlnaHQpO1xuICB0aGlzLmRlYnVnKCdHZXQgdGlsZSBwaXhlbCBkYXRhJyk7XG4gIGV4dHJhY3RUby5zcmMgPSB0bXBDdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIHRpbGUud2lkdGgsIHRpbGUuaGVpZ2h0KS5kYXRhOyAvLyBTYWZhcmkgMTIgd29ya2Fyb3VuZFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWNhL3BpY2EvaXNzdWVzLzE5OVxuXG4gIHRtcENhbnZhcy53aWR0aCA9IHRtcENhbnZhcy5oZWlnaHQgPSAwO1xuICByZXR1cm4gZXh0cmFjdFRvO1xufTtcblxuUGljYS5wcm90b3R5cGUuX19sYW5kVGlsZURhdGEgPSBmdW5jdGlvbiAodGlsZSwgcmVzdWx0LCBzdGFnZUVudikge1xuICB2YXIgdG9JbWFnZURhdGE7XG4gIHRoaXMuZGVidWcoJ0NvbnZlcnQgcmF3IHJnYmEgdGlsZSByZXN1bHQgdG8gSW1hZ2VEYXRhJyk7XG5cbiAgaWYgKHJlc3VsdC5iaXRtYXApIHtcbiAgICBzdGFnZUVudi50b0N0eC5kcmF3SW1hZ2UocmVzdWx0LmJpdG1hcCwgdGlsZS50b1gsIHRpbGUudG9ZKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChDQU5fTkVXX0lNQUdFX0RBVEEpIHtcbiAgICAvLyB0aGlzIGJyYW5jaCBpcyBmb3IgbW9kZXJuIGJyb3dzZXJzXG4gICAgLy8gSWYgYG5ldyBJbWFnZURhdGEoKWAgJiBVaW50OENsYW1wZWRBcnJheSBzdXBvcnRlZFxuICAgIHRvSW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShuZXcgVWludDhDbGFtcGVkQXJyYXkocmVzdWx0LmRhdGEpLCB0aWxlLnRvV2lkdGgsIHRpbGUudG9IZWlnaHQpO1xuICB9IGVsc2Uge1xuICAgIC8vIGZhbGxiYWNrIGZvciBgbm9kZS1jYW52YXNgIGFuZCBvbGQgYnJvd3NlcnNcbiAgICAvLyAoSUUxMSBoYXMgSW1hZ2VEYXRhIGJ1dCBkb2VzIG5vdCBzdXBwb3J0IGBuZXcgSW1hZ2VEYXRhKClgKVxuICAgIHRvSW1hZ2VEYXRhID0gc3RhZ2VFbnYudG9DdHguY3JlYXRlSW1hZ2VEYXRhKHRpbGUudG9XaWR0aCwgdGlsZS50b0hlaWdodCk7XG5cbiAgICBpZiAodG9JbWFnZURhdGEuZGF0YS5zZXQpIHtcbiAgICAgIHRvSW1hZ2VEYXRhLmRhdGEuc2V0KHJlc3VsdC5kYXRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSUU5IGRvbid0IGhhdmUgYC5zZXQoKWBcbiAgICAgIGZvciAodmFyIGkgPSB0b0ltYWdlRGF0YS5kYXRhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIHRvSW1hZ2VEYXRhLmRhdGFbaV0gPSByZXN1bHQuZGF0YVtpXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB0aGlzLmRlYnVnKCdEcmF3IHRpbGUnKTtcblxuICBpZiAoTkVFRF9TQUZBUklfRklYKSB7XG4gICAgLy8gU2FmYXJpIGRyYXdzIHRoaW4gd2hpdGUgc3RyaXBlcyBiZXR3ZWVuIHRpbGVzIHdpdGhvdXQgdGhpcyBmaXhcbiAgICBzdGFnZUVudi50b0N0eC5wdXRJbWFnZURhdGEodG9JbWFnZURhdGEsIHRpbGUudG9YLCB0aWxlLnRvWSwgdGlsZS50b0lubmVyWCAtIHRpbGUudG9YLCB0aWxlLnRvSW5uZXJZIC0gdGlsZS50b1ksIHRpbGUudG9Jbm5lcldpZHRoICsgMWUtNSwgdGlsZS50b0lubmVySGVpZ2h0ICsgMWUtNSk7XG4gIH0gZWxzZSB7XG4gICAgc3RhZ2VFbnYudG9DdHgucHV0SW1hZ2VEYXRhKHRvSW1hZ2VEYXRhLCB0aWxlLnRvWCwgdGlsZS50b1ksIHRpbGUudG9Jbm5lclggLSB0aWxlLnRvWCwgdGlsZS50b0lubmVyWSAtIHRpbGUudG9ZLCB0aWxlLnRvSW5uZXJXaWR0aCwgdGlsZS50b0lubmVySGVpZ2h0KTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufTtcblxuUGljYS5wcm90b3R5cGUuX190aWxlQW5kUmVzaXplID0gZnVuY3Rpb24gKGZyb20sIHRvLCBvcHRzKSB7XG4gIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gIHZhciBzdGFnZUVudiA9IHtcbiAgICBzcmNDdHg6IG51bGwsXG4gICAgc3JjSW1hZ2VCaXRtYXA6IG51bGwsXG4gICAgaXNJbWFnZUJpdG1hcFJldXNlZDogZmFsc2UsXG4gICAgdG9DdHg6IG51bGxcbiAgfTtcblxuICB2YXIgcHJvY2Vzc1RpbGUgPSBmdW5jdGlvbiBwcm9jZXNzVGlsZSh0aWxlKSB7XG4gICAgcmV0dXJuIF90aGlzMy5fX2xpbWl0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChvcHRzLmNhbmNlbGVkKSByZXR1cm4gb3B0cy5jYW5jZWxUb2tlbjtcbiAgICAgIHZhciB0aWxlT3B0cyA9IHtcbiAgICAgICAgd2lkdGg6IHRpbGUud2lkdGgsXG4gICAgICAgIGhlaWdodDogdGlsZS5oZWlnaHQsXG4gICAgICAgIHRvV2lkdGg6IHRpbGUudG9XaWR0aCxcbiAgICAgICAgdG9IZWlnaHQ6IHRpbGUudG9IZWlnaHQsXG4gICAgICAgIHNjYWxlWDogdGlsZS5zY2FsZVgsXG4gICAgICAgIHNjYWxlWTogdGlsZS5zY2FsZVksXG4gICAgICAgIG9mZnNldFg6IHRpbGUub2Zmc2V0WCxcbiAgICAgICAgb2Zmc2V0WTogdGlsZS5vZmZzZXRZLFxuICAgICAgICBxdWFsaXR5OiBvcHRzLnF1YWxpdHksXG4gICAgICAgIGFscGhhOiBvcHRzLmFscGhhLFxuICAgICAgICB1bnNoYXJwQW1vdW50OiBvcHRzLnVuc2hhcnBBbW91bnQsXG4gICAgICAgIHVuc2hhcnBSYWRpdXM6IG9wdHMudW5zaGFycFJhZGl1cyxcbiAgICAgICAgdW5zaGFycFRocmVzaG9sZDogb3B0cy51bnNoYXJwVGhyZXNob2xkXG4gICAgICB9O1xuXG4gICAgICBfdGhpczMuZGVidWcoJ0ludm9rZSByZXNpemUgbWF0aCcpO1xuXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRpbGVPcHRzKS50aGVuKGZ1bmN0aW9uICh0aWxlT3B0cykge1xuICAgICAgICByZXR1cm4gX3RoaXMzLl9fZXh0cmFjdFRpbGVEYXRhKHRpbGUsIGZyb20sIG9wdHMsIHN0YWdlRW52LCB0aWxlT3B0cyk7XG4gICAgICB9KS50aGVuKGZ1bmN0aW9uICh0aWxlT3B0cykge1xuICAgICAgICBfdGhpczMuZGVidWcoJ0ludm9rZSByZXNpemUgbWF0aCcpO1xuXG4gICAgICAgIHJldHVybiBfdGhpczMuX19pbnZva2VSZXNpemUodGlsZU9wdHMsIG9wdHMpO1xuICAgICAgfSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgIGlmIChvcHRzLmNhbmNlbGVkKSByZXR1cm4gb3B0cy5jYW5jZWxUb2tlbjtcbiAgICAgICAgc3RhZ2VFbnYuc3JjSW1hZ2VEYXRhID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIF90aGlzMy5fX2xhbmRUaWxlRGF0YSh0aWxlLCByZXN1bHQsIHN0YWdlRW52KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9OyAvLyBOZWVkIHRvIG5vcm1hbGl6ZSBkYXRhIHNvdXJjZSBmaXJzdC4gSXQgY2FuIGJlIGNhbnZhcyBvciBpbWFnZS5cbiAgLy8gSWYgaW1hZ2UgLSB0cnkgdG8gZGVjb2RlIGluIGJhY2tncm91bmQgaWYgcG9zc2libGVcblxuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICBzdGFnZUVudi50b0N0eCA9IHRvLmdldENvbnRleHQoJzJkJywge1xuICAgICAgYWxwaGE6IEJvb2xlYW4ob3B0cy5hbHBoYSlcbiAgICB9KTtcbiAgICBpZiAodXRpbHMuaXNDYW52YXMoZnJvbSkpIHJldHVybiBudWxsO1xuXG4gICAgaWYgKHV0aWxzLmlzSW1hZ2VCaXRtYXAoZnJvbSkpIHtcbiAgICAgIHN0YWdlRW52LnNyY0ltYWdlQml0bWFwID0gZnJvbTtcbiAgICAgIHN0YWdlRW52LmlzSW1hZ2VCaXRtYXBSZXVzZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHV0aWxzLmlzSW1hZ2UoZnJvbSkpIHtcbiAgICAgIC8vIHRyeSBkbyBkZWNvZGUgaW1hZ2UgaW4gYmFja2dyb3VuZCBmb3IgZmFzdGVyIG5leHQgb3BlcmF0aW9ucztcbiAgICAgIC8vIGlmIHdlJ3JlIHVzaW5nIG9mZnNjcmVlbiBjYW52YXMsIGNpYiBpcyBjYWxsZWQgcGVyIHRpbGUsIHNvIG5vdCBuZWVkZWQgaGVyZVxuICAgICAgaWYgKCFDQU5fQ1JFQVRFX0lNQUdFX0JJVE1BUCkgcmV0dXJuIG51bGw7XG5cbiAgICAgIF90aGlzMy5kZWJ1ZygnRGVjb2RlIGltYWdlIHZpYSBjcmVhdGVJbWFnZUJpdG1hcCcpO1xuXG4gICAgICByZXR1cm4gY3JlYXRlSW1hZ2VCaXRtYXAoZnJvbSkudGhlbihmdW5jdGlvbiAoaW1hZ2VCaXRtYXApIHtcbiAgICAgICAgc3RhZ2VFbnYuc3JjSW1hZ2VCaXRtYXAgPSBpbWFnZUJpdG1hcDtcbiAgICAgIH0pIC8vIFN1cHByZXNzIGVycm9yIHRvIHVzZSBmYWxsYmFjaywgaWYgbWV0aG9kIGZhaWxzXG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWNhL3BpY2EvaXNzdWVzLzE5MFxuXG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xuICAgICAgW1wiY2F0Y2hcIl0oZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1BpY2E6IFwiLmZyb21cIiBzaG91bGQgYmUgSW1hZ2UsIENhbnZhcyBvciBJbWFnZUJpdG1hcCcpO1xuICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAob3B0cy5jYW5jZWxlZCkgcmV0dXJuIG9wdHMuY2FuY2VsVG9rZW47XG5cbiAgICBfdGhpczMuZGVidWcoJ0NhbGN1bGF0ZSB0aWxlcycpOyAvL1xuICAgIC8vIEhlcmUgd2UgYXJlIHdpdGggXCJub3JtYWxpemVkXCIgc291cmNlLFxuICAgIC8vIGZvbGxvdyB0byB0aWxpbmdcbiAgICAvL1xuXG5cbiAgICB2YXIgcmVnaW9ucyA9IGNyZWF0ZVJlZ2lvbnMoe1xuICAgICAgd2lkdGg6IG9wdHMud2lkdGgsXG4gICAgICBoZWlnaHQ6IG9wdHMuaGVpZ2h0LFxuICAgICAgc3JjVGlsZVNpemU6IF90aGlzMy5vcHRpb25zLnRpbGUsXG4gICAgICB0b1dpZHRoOiBvcHRzLnRvV2lkdGgsXG4gICAgICB0b0hlaWdodDogb3B0cy50b0hlaWdodCxcbiAgICAgIGRlc3RUaWxlQm9yZGVyOiBvcHRzLl9fZGVzdFRpbGVCb3JkZXJcbiAgICB9KTtcbiAgICB2YXIgam9icyA9IHJlZ2lvbnMubWFwKGZ1bmN0aW9uICh0aWxlKSB7XG4gICAgICByZXR1cm4gcHJvY2Vzc1RpbGUodGlsZSk7XG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBjbGVhbnVwKHN0YWdlRW52KSB7XG4gICAgICBpZiAoc3RhZ2VFbnYuc3JjSW1hZ2VCaXRtYXApIHtcbiAgICAgICAgaWYgKCFzdGFnZUVudi5pc0ltYWdlQml0bWFwUmV1c2VkKSBzdGFnZUVudi5zcmNJbWFnZUJpdG1hcC5jbG9zZSgpO1xuICAgICAgICBzdGFnZUVudi5zcmNJbWFnZUJpdG1hcCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgX3RoaXMzLmRlYnVnKCdQcm9jZXNzIHRpbGVzJyk7XG5cbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoam9icykudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpczMuZGVidWcoJ0ZpbmlzaGVkIScpO1xuXG4gICAgICBjbGVhbnVwKHN0YWdlRW52KTtcbiAgICAgIHJldHVybiB0bztcbiAgICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBjbGVhbnVwKHN0YWdlRW52KTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9KTtcbiAgfSk7XG59O1xuXG5QaWNhLnByb3RvdHlwZS5fX3Byb2Nlc3NTdGFnZXMgPSBmdW5jdGlvbiAoc3RhZ2VzLCBmcm9tLCB0bywgb3B0cykge1xuICB2YXIgX3RoaXM0ID0gdGhpcztcblxuICBpZiAob3B0cy5jYW5jZWxlZCkgcmV0dXJuIG9wdHMuY2FuY2VsVG9rZW47XG5cbiAgdmFyIF9zdGFnZXMkc2hpZnQgPSBzdGFnZXMuc2hpZnQoKSxcbiAgICAgIF9zdGFnZXMkc2hpZnQyID0gX3NsaWNlZFRvQXJyYXkoX3N0YWdlcyRzaGlmdCwgMiksXG4gICAgICB0b1dpZHRoID0gX3N0YWdlcyRzaGlmdDJbMF0sXG4gICAgICB0b0hlaWdodCA9IF9zdGFnZXMkc2hpZnQyWzFdO1xuXG4gIHZhciBpc0xhc3RTdGFnZSA9IHN0YWdlcy5sZW5ndGggPT09IDA7XG4gIG9wdHMgPSBhc3NpZ24oe30sIG9wdHMsIHtcbiAgICB0b1dpZHRoOiB0b1dpZHRoLFxuICAgIHRvSGVpZ2h0OiB0b0hlaWdodCxcbiAgICAvLyBvbmx5IHVzZSB1c2VyLWRlZmluZWQgcXVhbGl0eSBmb3IgdGhlIGxhc3Qgc3RhZ2UsXG4gICAgLy8gdXNlIHNpbXBsZXIgKEhhbW1pbmcpIGZpbHRlciBmb3IgdGhlIGZpcnN0IHN0YWdlcyB3aGVyZVxuICAgIC8vIHNjYWxlIGZhY3RvciBpcyBsYXJnZSBlbm91Z2ggKG1vcmUgdGhhbiAyLTMpXG4gICAgcXVhbGl0eTogaXNMYXN0U3RhZ2UgPyBvcHRzLnF1YWxpdHkgOiBNYXRoLm1pbigxLCBvcHRzLnF1YWxpdHkpXG4gIH0pO1xuICB2YXIgdG1wQ2FudmFzO1xuXG4gIGlmICghaXNMYXN0U3RhZ2UpIHtcbiAgICAvLyBjcmVhdGUgdGVtcG9yYXJ5IGNhbnZhc1xuICAgIHRtcENhbnZhcyA9IHRoaXMub3B0aW9ucy5jcmVhdGVDYW52YXModG9XaWR0aCwgdG9IZWlnaHQpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuX190aWxlQW5kUmVzaXplKGZyb20sIGlzTGFzdFN0YWdlID8gdG8gOiB0bXBDYW52YXMsIG9wdHMpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgIGlmIChpc0xhc3RTdGFnZSkgcmV0dXJuIHRvO1xuICAgIG9wdHMud2lkdGggPSB0b1dpZHRoO1xuICAgIG9wdHMuaGVpZ2h0ID0gdG9IZWlnaHQ7XG4gICAgcmV0dXJuIF90aGlzNC5fX3Byb2Nlc3NTdGFnZXMoc3RhZ2VzLCB0bXBDYW52YXMsIHRvLCBvcHRzKTtcbiAgfSkudGhlbihmdW5jdGlvbiAocmVzKSB7XG4gICAgaWYgKHRtcENhbnZhcykge1xuICAgICAgLy8gU2FmYXJpIDEyIHdvcmthcm91bmRcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlY2EvcGljYS9pc3N1ZXMvMTk5XG4gICAgICB0bXBDYW52YXMud2lkdGggPSB0bXBDYW52YXMuaGVpZ2h0ID0gMDtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xuICB9KTtcbn07XG5cblBpY2EucHJvdG90eXBlLl9fcmVzaXplVmlhQ3JlYXRlSW1hZ2VCaXRtYXAgPSBmdW5jdGlvbiAoZnJvbSwgdG8sIG9wdHMpIHtcbiAgdmFyIF90aGlzNSA9IHRoaXM7XG5cbiAgdmFyIHRvQ3R4ID0gdG8uZ2V0Q29udGV4dCgnMmQnLCB7XG4gICAgYWxwaGE6IEJvb2xlYW4ob3B0cy5hbHBoYSlcbiAgfSk7XG4gIHRoaXMuZGVidWcoJ1Jlc2l6ZSB2aWEgY3JlYXRlSW1hZ2VCaXRtYXAoKScpO1xuICByZXR1cm4gY3JlYXRlSW1hZ2VCaXRtYXAoZnJvbSwge1xuICAgIHJlc2l6ZVdpZHRoOiBvcHRzLnRvV2lkdGgsXG4gICAgcmVzaXplSGVpZ2h0OiBvcHRzLnRvSGVpZ2h0LFxuICAgIHJlc2l6ZVF1YWxpdHk6IHV0aWxzLmNpYl9xdWFsaXR5X25hbWUob3B0cy5xdWFsaXR5KVxuICB9KS50aGVuKGZ1bmN0aW9uIChpbWFnZUJpdG1hcCkge1xuICAgIGlmIChvcHRzLmNhbmNlbGVkKSByZXR1cm4gb3B0cy5jYW5jZWxUb2tlbjsgLy8gaWYgbm8gdW5zaGFycCAtIGRyYXcgZGlyZWN0bHkgdG8gb3V0cHV0IGNhbnZhc1xuXG4gICAgaWYgKCFvcHRzLnVuc2hhcnBBbW91bnQpIHtcbiAgICAgIHRvQ3R4LmRyYXdJbWFnZShpbWFnZUJpdG1hcCwgMCwgMCk7XG4gICAgICBpbWFnZUJpdG1hcC5jbG9zZSgpO1xuICAgICAgdG9DdHggPSBudWxsO1xuXG4gICAgICBfdGhpczUuZGVidWcoJ0ZpbmlzaGVkIScpO1xuXG4gICAgICByZXR1cm4gdG87XG4gICAgfVxuXG4gICAgX3RoaXM1LmRlYnVnKCdVbnNoYXJwIHJlc3VsdCcpO1xuXG4gICAgdmFyIHRtcENhbnZhcyA9IF90aGlzNS5vcHRpb25zLmNyZWF0ZUNhbnZhcyhvcHRzLnRvV2lkdGgsIG9wdHMudG9IZWlnaHQpO1xuXG4gICAgdmFyIHRtcEN0eCA9IHRtcENhbnZhcy5nZXRDb250ZXh0KCcyZCcsIHtcbiAgICAgIGFscGhhOiBCb29sZWFuKG9wdHMuYWxwaGEpXG4gICAgfSk7XG4gICAgdG1wQ3R4LmRyYXdJbWFnZShpbWFnZUJpdG1hcCwgMCwgMCk7XG4gICAgaW1hZ2VCaXRtYXAuY2xvc2UoKTtcbiAgICB2YXIgaURhdGEgPSB0bXBDdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIG9wdHMudG9XaWR0aCwgb3B0cy50b0hlaWdodCk7XG5cbiAgICBfdGhpczUuX19tYXRobGliLnVuc2hhcnBfbWFzayhpRGF0YS5kYXRhLCBvcHRzLnRvV2lkdGgsIG9wdHMudG9IZWlnaHQsIG9wdHMudW5zaGFycEFtb3VudCwgb3B0cy51bnNoYXJwUmFkaXVzLCBvcHRzLnVuc2hhcnBUaHJlc2hvbGQpO1xuXG4gICAgdG9DdHgucHV0SW1hZ2VEYXRhKGlEYXRhLCAwLCAwKTsgLy8gU2FmYXJpIDEyIHdvcmthcm91bmRcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWNhL3BpY2EvaXNzdWVzLzE5OVxuXG4gICAgdG1wQ2FudmFzLndpZHRoID0gdG1wQ2FudmFzLmhlaWdodCA9IDA7XG4gICAgaURhdGEgPSB0bXBDdHggPSB0bXBDYW52YXMgPSB0b0N0eCA9IG51bGw7XG5cbiAgICBfdGhpczUuZGVidWcoJ0ZpbmlzaGVkIScpO1xuXG4gICAgcmV0dXJuIHRvO1xuICB9KTtcbn07XG5cblBpY2EucHJvdG90eXBlLnJlc2l6ZSA9IGZ1bmN0aW9uIChmcm9tLCB0bywgb3B0aW9ucykge1xuICB2YXIgX3RoaXM2ID0gdGhpcztcblxuICB0aGlzLmRlYnVnKCdTdGFydCByZXNpemUuLi4nKTtcbiAgdmFyIG9wdHMgPSBhc3NpZ24oe30sIERFRkFVTFRfUkVTSVpFX09QVFMpO1xuXG4gIGlmICghaXNOYU4ob3B0aW9ucykpIHtcbiAgICBvcHRzID0gYXNzaWduKG9wdHMsIHtcbiAgICAgIHF1YWxpdHk6IG9wdGlvbnNcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChvcHRpb25zKSB7XG4gICAgb3B0cyA9IGFzc2lnbihvcHRzLCBvcHRpb25zKTtcbiAgfVxuXG4gIG9wdHMudG9XaWR0aCA9IHRvLndpZHRoO1xuICBvcHRzLnRvSGVpZ2h0ID0gdG8uaGVpZ2h0O1xuICBvcHRzLndpZHRoID0gZnJvbS5uYXR1cmFsV2lkdGggfHwgZnJvbS53aWR0aDtcbiAgb3B0cy5oZWlnaHQgPSBmcm9tLm5hdHVyYWxIZWlnaHQgfHwgZnJvbS5oZWlnaHQ7IC8vIFByZXZlbnQgc3RlcHBlciBmcm9tIGluZmluaXRlIGxvb3BcblxuICBpZiAodG8ud2lkdGggPT09IDAgfHwgdG8uaGVpZ2h0ID09PSAwKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkludmFsaWQgb3V0cHV0IHNpemU6IFwiLmNvbmNhdCh0by53aWR0aCwgXCJ4XCIpLmNvbmNhdCh0by5oZWlnaHQpKSk7XG4gIH1cblxuICBpZiAob3B0cy51bnNoYXJwUmFkaXVzID4gMikgb3B0cy51bnNoYXJwUmFkaXVzID0gMjtcbiAgb3B0cy5jYW5jZWxlZCA9IGZhbHNlO1xuXG4gIGlmIChvcHRzLmNhbmNlbFRva2VuKSB7XG4gICAgLy8gV3JhcCBjYW5jZWxUb2tlbiB0byBhdm9pZCBzdWNjZXNzaXZlIHJlc29sdmUgJiBzZXQgZmxhZ1xuICAgIG9wdHMuY2FuY2VsVG9rZW4gPSBvcHRzLmNhbmNlbFRva2VuLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgIG9wdHMuY2FuY2VsZWQgPSB0cnVlO1xuICAgICAgdGhyb3cgZGF0YTtcbiAgICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBvcHRzLmNhbmNlbGVkID0gdHJ1ZTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9KTtcbiAgfVxuXG4gIHZhciBERVNUX1RJTEVfQk9SREVSID0gMzsgLy8gTWF4IHBvc3NpYmxlIGZpbHRlciB3aW5kb3cgc2l6ZVxuXG4gIG9wdHMuX19kZXN0VGlsZUJvcmRlciA9IE1hdGguY2VpbChNYXRoLm1heChERVNUX1RJTEVfQk9SREVSLCAyLjUgKiBvcHRzLnVuc2hhcnBSYWRpdXMgfCAwKSk7XG4gIHJldHVybiB0aGlzLmluaXQoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAob3B0cy5jYW5jZWxlZCkgcmV0dXJuIG9wdHMuY2FuY2VsVG9rZW47IC8vIGlmIGNyZWF0ZUltYWdlQml0bWFwIHN1cHBvcnRzIHJlc2l6ZSwganVzdCBkbyBpdCBhbmQgcmV0dXJuXG5cbiAgICBpZiAoX3RoaXM2LmZlYXR1cmVzLmNpYikge1xuICAgICAgcmV0dXJuIF90aGlzNi5fX3Jlc2l6ZVZpYUNyZWF0ZUltYWdlQml0bWFwKGZyb20sIHRvLCBvcHRzKTtcbiAgICB9XG5cbiAgICBpZiAoIUNBTl9VU0VfQ0FOVkFTX0dFVF9JTUFHRV9EQVRBKSB7XG4gICAgICB2YXIgZXJyID0gbmV3IEVycm9yKCdQaWNhOiBjYW5ub3QgdXNlIGdldEltYWdlRGF0YSBvbiBjYW52YXMsICcgKyBcIm1ha2Ugc3VyZSBmaW5nZXJwcmludGluZyBwcm90ZWN0aW9uIGlzbid0IGVuYWJsZWRcIik7XG4gICAgICBlcnIuY29kZSA9ICdFUlJfR0VUX0lNQUdFX0RBVEEnO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH0gLy9cbiAgICAvLyBObyBlYXN5IHdheSwgbGV0J3MgcmVzaXplIG1hbnVhbGx5IHZpYSBhcnJheXNcbiAgICAvL1xuXG5cbiAgICB2YXIgc3RhZ2VzID0gY3JlYXRlU3RhZ2VzKG9wdHMud2lkdGgsIG9wdHMuaGVpZ2h0LCBvcHRzLnRvV2lkdGgsIG9wdHMudG9IZWlnaHQsIF90aGlzNi5vcHRpb25zLnRpbGUsIG9wdHMuX19kZXN0VGlsZUJvcmRlcik7XG4gICAgcmV0dXJuIF90aGlzNi5fX3Byb2Nlc3NTdGFnZXMoc3RhZ2VzLCBmcm9tLCB0bywgb3B0cyk7XG4gIH0pO1xufTsgLy8gUkdCQSBidWZmZXIgcmVzaXplXG4vL1xuXG5cblBpY2EucHJvdG90eXBlLnJlc2l6ZUJ1ZmZlciA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIHZhciBfdGhpczcgPSB0aGlzO1xuXG4gIHZhciBvcHRzID0gYXNzaWduKHt9LCBERUZBVUxUX1JFU0laRV9PUFRTLCBvcHRpb25zKTtcbiAgcmV0dXJuIHRoaXMuaW5pdCgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfdGhpczcuX19tYXRobGliLnJlc2l6ZUFuZFVuc2hhcnAob3B0cyk7XG4gIH0pO1xufTtcblxuUGljYS5wcm90b3R5cGUudG9CbG9iID0gZnVuY3Rpb24gKGNhbnZhcywgbWltZVR5cGUsIHF1YWxpdHkpIHtcbiAgbWltZVR5cGUgPSBtaW1lVHlwZSB8fCAnaW1hZ2UvcG5nJztcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgaWYgKGNhbnZhcy50b0Jsb2IpIHtcbiAgICAgIGNhbnZhcy50b0Jsb2IoZnVuY3Rpb24gKGJsb2IpIHtcbiAgICAgICAgcmV0dXJuIHJlc29sdmUoYmxvYik7XG4gICAgICB9LCBtaW1lVHlwZSwgcXVhbGl0eSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGNhbnZhcy5jb252ZXJ0VG9CbG9iKSB7XG4gICAgICByZXNvbHZlKGNhbnZhcy5jb252ZXJ0VG9CbG9iKHtcbiAgICAgICAgdHlwZTogbWltZVR5cGUsXG4gICAgICAgIHF1YWxpdHk6IHF1YWxpdHlcbiAgICAgIH0pKTtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIEZhbGxiYWNrIGZvciBvbGQgYnJvd3NlcnNcblxuXG4gICAgdmFyIGFzU3RyaW5nID0gYXRvYihjYW52YXMudG9EYXRhVVJMKG1pbWVUeXBlLCBxdWFsaXR5KS5zcGxpdCgnLCcpWzFdKTtcbiAgICB2YXIgbGVuID0gYXNTdHJpbmcubGVuZ3RoO1xuICAgIHZhciBhc0J1ZmZlciA9IG5ldyBVaW50OEFycmF5KGxlbik7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBhc0J1ZmZlcltpXSA9IGFzU3RyaW5nLmNoYXJDb2RlQXQoaSk7XG4gICAgfVxuXG4gICAgcmVzb2x2ZShuZXcgQmxvYihbYXNCdWZmZXJdLCB7XG4gICAgICB0eXBlOiBtaW1lVHlwZVxuICAgIH0pKTtcbiAgfSk7XG59O1xuXG5QaWNhLnByb3RvdHlwZS5kZWJ1ZyA9IGZ1bmN0aW9uICgpIHt9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFBpY2E7XG5cbn0se1wiLi9saWIvbWF0aGxpYlwiOjEsXCIuL2xpYi9wb29sXCI6MTMsXCIuL2xpYi9zdGVwcGVyXCI6MTQsXCIuL2xpYi90aWxlclwiOjE1LFwiLi9saWIvdXRpbHNcIjoxNixcIi4vbGliL3dvcmtlclwiOjE3LFwib2JqZWN0LWFzc2lnblwiOjIzLFwid2Vid29ya2lmeVwiOjI0fV19LHt9LFtdKShcIi9pbmRleC5qc1wiKVxufSk7XG59KTtcblxudmFyIGltYWdlX3RyYXZlcnNlID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSkge1xuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gSGVscGVyc1xuLy9cbmZ1bmN0aW9uIGVycm9yKG1lc3NhZ2UsIGNvZGUpIHtcbiAgdmFyIGVyciA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgZXJyLmNvZGUgPSBjb2RlO1xuICByZXR1cm4gZXJyO1xufVxuXG5cbi8vIENvbnZlcnQgbnVtYmVyIHRvIDB4SEggc3RyaW5nXG4vL1xuZnVuY3Rpb24gdG9faGV4KG51bWJlcikge1xuICB2YXIgbiA9IG51bWJlci50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcbiAgZm9yICh2YXIgaSA9IDIgLSBuLmxlbmd0aDsgaSA+IDA7IGktLSkgbiA9ICcwJyArIG47XG4gIHJldHVybiAnMHgnICsgbjtcbn1cblxuXG5mdW5jdGlvbiB1dGY4X2VuY29kZShzdHIpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHN0cikpO1xuICB9IGNhdGNoIChfKSB7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIHV0ZjhfZGVjb2RlKHN0cikge1xuICB0cnkge1xuICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKHN0cikpO1xuICB9IGNhdGNoIChfKSB7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxufVxuXG5cbi8vIENoZWNrIGlmIGlucHV0IGlzIGEgVWludDhBcnJheVxuLy9cbmZ1bmN0aW9uIGlzX3VpbnQ4YXJyYXkoYmluKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYmluKSA9PT0gJ1tvYmplY3QgVWludDhBcnJheV0nO1xufVxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBFeGlmIHBhcnNlclxuLy9cbi8vIElucHV0OlxuLy8gIC0ganBlZ19iaW46ICAgVWludDhBcnJheSAtIGpwZWcgZmlsZVxuLy8gIC0gZXhpZl9zdGFydDogTnVtYmVyICAgICAtIHN0YXJ0IG9mIFRJRkYgaGVhZGVyIChhZnRlciBFeGlmXFwwXFwwKVxuLy8gIC0gZXhpZl9lbmQ6ICAgTnVtYmVyICAgICAtIGVuZCBvZiBFeGlmIHNlZ21lbnRcbi8vICAtIG9uX2VudHJ5OiAgIE51bWJlciAgICAgLSBjYWxsYmFja1xuLy9cbmZ1bmN0aW9uIEV4aWZQYXJzZXIoanBlZ19iaW4sIGV4aWZfc3RhcnQsIGV4aWZfZW5kKSB7XG4gIC8vIFVpbnQ4QXJyYXksIGV4aWYgd2l0aG91dCBzaWduYXR1cmUgKHdoaWNoIGlzbid0IGluY2x1ZGVkIGluIG9mZnNldHMpXG4gIHRoaXMuaW5wdXQgICAgICA9IGpwZWdfYmluLnN1YmFycmF5KGV4aWZfc3RhcnQsIGV4aWZfZW5kKTtcblxuICAvLyBvZmZzZXQgY29ycmVjdGlvbiBmb3IgYG9uX2VudHJ5YCBjYWxsYmFja1xuICB0aGlzLnN0YXJ0ICAgICAgPSBleGlmX3N0YXJ0O1xuXG4gIC8vIENoZWNrIFRJRkYgaGVhZGVyIChpbmNsdWRlcyBieXRlIGFsaWdubWVudCBhbmQgZmlyc3QgSUZEIG9mZnNldClcbiAgdmFyIHNpZyA9IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgdGhpcy5pbnB1dC5zdWJhcnJheSgwLCA0KSk7XG5cbiAgaWYgKHNpZyAhPT0gJ0lJXFx4MkFcXDAnICYmIHNpZyAhPT0gJ01NXFwwXFx4MkEnKSB7XG4gICAgdGhyb3cgZXJyb3IoJ2ludmFsaWQgVElGRiBzaWduYXR1cmUnLCAnRUJBRERBVEEnKTtcbiAgfVxuXG4gIC8vIHRydWUgaWYgbW90b3JvbGEgKGJpZyBlbmRpYW4pIGJ5dGUgYWxpZ25tZW50LCBmYWxzZSBpZiBpbnRlbFxuICB0aGlzLmJpZ19lbmRpYW4gPSBzaWdbMF0gPT09ICdNJztcbn1cblxuXG5FeGlmUGFyc2VyLnByb3RvdHlwZS5lYWNoID0gZnVuY3Rpb24gKG9uX2VudHJ5KSB7XG4gIC8vIGFsbG93IHByZW1hdHVyZSBleGl0XG4gIHRoaXMuYWJvcnRlZCA9IGZhbHNlO1xuXG4gIHZhciBvZmZzZXQgPSB0aGlzLnJlYWRfdWludDMyKDQpO1xuXG4gIHRoaXMuaWZkc190b19yZWFkID0gWyB7XG4gICAgaWQ6ICAgICAwLFxuICAgIG9mZnNldDogb2Zmc2V0XG4gIH0gXTtcblxuICB3aGlsZSAodGhpcy5pZmRzX3RvX3JlYWQubGVuZ3RoID4gMCAmJiAhdGhpcy5hYm9ydGVkKSB7XG4gICAgdmFyIGkgPSB0aGlzLmlmZHNfdG9fcmVhZC5zaGlmdCgpO1xuICAgIGlmICghaS5vZmZzZXQpIGNvbnRpbnVlO1xuICAgIHRoaXMuc2Nhbl9pZmQoaS5pZCwgaS5vZmZzZXQsIG9uX2VudHJ5KTtcbiAgfVxufTtcblxuXG5FeGlmUGFyc2VyLnByb3RvdHlwZS5maWx0ZXIgPSBmdW5jdGlvbiAob25fZW50cnkpIHtcbiAgdmFyIGlmZHMgPSB7fTtcblxuICAvLyBtYWtlIHN1cmUgSUZEMCBhbHdheXMgZXhpc3RzXG4gIGlmZHMuaWZkMCA9IHsgaWQ6IDAsIGVudHJpZXM6IFtdIH07XG5cbiAgdGhpcy5lYWNoKGZ1bmN0aW9uIChlbnRyeSkge1xuICAgIGlmIChvbl9lbnRyeShlbnRyeSkgPT09IGZhbHNlICYmICFlbnRyeS5pc19zdWJpZmRfbGluaykgcmV0dXJuO1xuICAgIGlmIChlbnRyeS5pc19zdWJpZmRfbGluayAmJiBlbnRyeS5jb3VudCAhPT0gMSAmJiBlbnRyeS5mb3JtYXQgIT09IDQpIHJldHVybjsgLy8gZmlsdGVyIG91dCBib2d1cyBsaW5rc1xuXG4gICAgaWYgKCFpZmRzWydpZmQnICsgZW50cnkuaWZkXSkge1xuICAgICAgaWZkc1snaWZkJyArIGVudHJ5LmlmZF0gPSB7IGlkOiBlbnRyeS5pZmQsIGVudHJpZXM6IFtdIH07XG4gICAgfVxuXG4gICAgaWZkc1snaWZkJyArIGVudHJ5LmlmZF0uZW50cmllcy5wdXNoKGVudHJ5KTtcbiAgfSk7XG5cbiAgLy8gdGh1bWJuYWlscyBhcmUgbm90IHN1cHBvcnRlZCBqdXN0IHlldCwgc28gZGVsZXRlIGFsbCBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGl0XG4gIGRlbGV0ZSBpZmRzLmlmZDE7XG5cbiAgLy8gQ2FsY3VsYXRlIG91dHB1dCBzaXplXG4gIHZhciBsZW5ndGggPSA4O1xuICBPYmplY3Qua2V5cyhpZmRzKS5mb3JFYWNoKGZ1bmN0aW9uIChpZmRfbm8pIHtcbiAgICBsZW5ndGggKz0gMjtcblxuICAgIGlmZHNbaWZkX25vXS5lbnRyaWVzLmZvckVhY2goZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgICBsZW5ndGggKz0gMTIgKyAoZW50cnkuZGF0YV9sZW5ndGggPiA0ID8gTWF0aC5jZWlsKGVudHJ5LmRhdGFfbGVuZ3RoIC8gMikgKiAyIDogMCk7XG4gICAgfSk7XG5cbiAgICBsZW5ndGggKz0gNDtcbiAgfSk7XG5cbiAgdGhpcy5vdXRwdXQgPSBuZXcgVWludDhBcnJheShsZW5ndGgpO1xuICB0aGlzLm91dHB1dFswXSA9IHRoaXMub3V0cHV0WzFdID0gKHRoaXMuYmlnX2VuZGlhbiA/ICdNJyA6ICdJJykuY2hhckNvZGVBdCgwKTtcbiAgdGhpcy53cml0ZV91aW50MTYoMiwgMHgyQSk7XG5cbiAgdmFyIG9mZnNldCA9IDg7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdGhpcy53cml0ZV91aW50MzIoNCwgb2Zmc2V0KTtcblxuICBPYmplY3Qua2V5cyhpZmRzKS5mb3JFYWNoKGZ1bmN0aW9uIChpZmRfbm8pIHtcbiAgICBpZmRzW2lmZF9ub10ud3JpdHRlbl9vZmZzZXQgPSBvZmZzZXQ7XG5cbiAgICB2YXIgaWZkX3N0YXJ0ID0gb2Zmc2V0O1xuICAgIHZhciBpZmRfZW5kICAgPSBpZmRfc3RhcnQgKyAyICsgaWZkc1tpZmRfbm9dLmVudHJpZXMubGVuZ3RoICogMTIgKyA0O1xuICAgIG9mZnNldCA9IGlmZF9lbmQ7XG5cbiAgICBzZWxmLndyaXRlX3VpbnQxNihpZmRfc3RhcnQsIGlmZHNbaWZkX25vXS5lbnRyaWVzLmxlbmd0aCk7XG5cbiAgICBpZmRzW2lmZF9ub10uZW50cmllcy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAvLyBJRkQgZW50cmllcyBtdXN0IGJlIGluIG9yZGVyIG9mIGluY3JlYXNpbmcgdGFnIElEc1xuICAgICAgcmV0dXJuIGEudGFnIC0gYi50YWc7XG4gICAgfSkuZm9yRWFjaChmdW5jdGlvbiAoZW50cnksIGlkeCkge1xuICAgICAgdmFyIGVudHJ5X29mZnNldCA9IGlmZF9zdGFydCArIDIgKyBpZHggKiAxMjtcblxuICAgICAgc2VsZi53cml0ZV91aW50MTYoZW50cnlfb2Zmc2V0LCBlbnRyeS50YWcpO1xuICAgICAgc2VsZi53cml0ZV91aW50MTYoZW50cnlfb2Zmc2V0ICsgMiwgZW50cnkuZm9ybWF0KTtcbiAgICAgIHNlbGYud3JpdGVfdWludDMyKGVudHJ5X29mZnNldCArIDQsIGVudHJ5LmNvdW50KTtcblxuICAgICAgaWYgKGVudHJ5LmlzX3N1YmlmZF9saW5rKSB7XG4gICAgICAgIC8vIGZpbGxlZCBpbiBsYXRlclxuICAgICAgICBpZiAoaWZkc1snaWZkJyArIGVudHJ5LnRhZ10pIGlmZHNbJ2lmZCcgKyBlbnRyeS50YWddLmxpbmtfb2Zmc2V0ID0gZW50cnlfb2Zmc2V0ICsgODtcbiAgICAgIH0gZWxzZSBpZiAoZW50cnkuZGF0YV9sZW5ndGggPD0gNCkge1xuICAgICAgICBzZWxmLm91dHB1dC5zZXQoXG4gICAgICAgICAgc2VsZi5pbnB1dC5zdWJhcnJheShlbnRyeS5kYXRhX29mZnNldCAtIHNlbGYuc3RhcnQsIGVudHJ5LmRhdGFfb2Zmc2V0IC0gc2VsZi5zdGFydCArIDQpLFxuICAgICAgICAgIGVudHJ5X29mZnNldCArIDhcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlbGYud3JpdGVfdWludDMyKGVudHJ5X29mZnNldCArIDgsIG9mZnNldCk7XG4gICAgICAgIHNlbGYub3V0cHV0LnNldChcbiAgICAgICAgICBzZWxmLmlucHV0LnN1YmFycmF5KGVudHJ5LmRhdGFfb2Zmc2V0IC0gc2VsZi5zdGFydCwgZW50cnkuZGF0YV9vZmZzZXQgLSBzZWxmLnN0YXJ0ICsgZW50cnkuZGF0YV9sZW5ndGgpLFxuICAgICAgICAgIG9mZnNldFxuICAgICAgICApO1xuICAgICAgICBvZmZzZXQgKz0gTWF0aC5jZWlsKGVudHJ5LmRhdGFfbGVuZ3RoIC8gMikgKiAyO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdmFyIG5leHRfaWZkID0gaWZkc1snaWZkJyArIChpZmRzW2lmZF9ub10uaWQgKyAxKV07XG4gICAgaWYgKG5leHRfaWZkKSBuZXh0X2lmZC5saW5rX29mZnNldCA9IGlmZF9lbmQgLSA0O1xuICB9KTtcblxuICBPYmplY3Qua2V5cyhpZmRzKS5mb3JFYWNoKGZ1bmN0aW9uIChpZmRfbm8pIHtcbiAgICBpZiAoaWZkc1tpZmRfbm9dLndyaXR0ZW5fb2Zmc2V0ICYmIGlmZHNbaWZkX25vXS5saW5rX29mZnNldCkge1xuICAgICAgc2VsZi53cml0ZV91aW50MzIoaWZkc1tpZmRfbm9dLmxpbmtfb2Zmc2V0LCBpZmRzW2lmZF9ub10ud3JpdHRlbl9vZmZzZXQpO1xuICAgIH1cbiAgfSk7XG5cbiAgaWYgKHRoaXMub3V0cHV0Lmxlbmd0aCAhPT0gb2Zmc2V0KSB0aHJvdyBlcnJvcignaW50ZXJuYWwgZXJyb3I6IGluY29ycmVjdCBidWZmZXIgc2l6ZSBhbGxvY2F0ZWQnKTtcblxuICByZXR1cm4gdGhpcy5vdXRwdXQ7XG59O1xuXG5cbkV4aWZQYXJzZXIucHJvdG90eXBlLnJlYWRfdWludDE2ID0gZnVuY3Rpb24gKG9mZnNldCkge1xuICB2YXIgZCA9IHRoaXMuaW5wdXQ7XG4gIGlmIChvZmZzZXQgKyAyID4gZC5sZW5ndGgpIHRocm93IGVycm9yKCd1bmV4cGVjdGVkIEVPRicsICdFQkFEREFUQScpO1xuXG4gIHJldHVybiB0aGlzLmJpZ19lbmRpYW4gP1xuICAgIGRbb2Zmc2V0XSAqIDB4MTAwICsgZFtvZmZzZXQgKyAxXSA6XG4gICAgZFtvZmZzZXRdICsgZFtvZmZzZXQgKyAxXSAqIDB4MTAwO1xufTtcblxuXG5FeGlmUGFyc2VyLnByb3RvdHlwZS5yZWFkX3VpbnQzMiA9IGZ1bmN0aW9uIChvZmZzZXQpIHtcbiAgdmFyIGQgPSB0aGlzLmlucHV0O1xuICBpZiAob2Zmc2V0ICsgNCA+IGQubGVuZ3RoKSB0aHJvdyBlcnJvcigndW5leHBlY3RlZCBFT0YnLCAnRUJBRERBVEEnKTtcblxuICByZXR1cm4gdGhpcy5iaWdfZW5kaWFuID9cbiAgICBkW29mZnNldF0gKiAweDEwMDAwMDAgKyBkW29mZnNldCArIDFdICogMHgxMDAwMCArIGRbb2Zmc2V0ICsgMl0gKiAweDEwMCArIGRbb2Zmc2V0ICsgM10gOlxuICAgIGRbb2Zmc2V0XSArIGRbb2Zmc2V0ICsgMV0gKiAweDEwMCArIGRbb2Zmc2V0ICsgMl0gKiAweDEwMDAwICsgZFtvZmZzZXQgKyAzXSAqIDB4MTAwMDAwMDtcbn07XG5cblxuRXhpZlBhcnNlci5wcm90b3R5cGUud3JpdGVfdWludDE2ID0gZnVuY3Rpb24gKG9mZnNldCwgdmFsdWUpIHtcbiAgdmFyIGQgPSB0aGlzLm91dHB1dDtcblxuICBpZiAodGhpcy5iaWdfZW5kaWFuKSB7XG4gICAgZFtvZmZzZXRdICAgICA9ICh2YWx1ZSA+Pj4gOCkgJiAweEZGO1xuICAgIGRbb2Zmc2V0ICsgMV0gPSB2YWx1ZSAmIDB4RkY7XG4gIH0gZWxzZSB7XG4gICAgZFtvZmZzZXRdICAgICA9IHZhbHVlICYgMHhGRjtcbiAgICBkW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KSAmIDB4RkY7XG4gIH1cbn07XG5cblxuRXhpZlBhcnNlci5wcm90b3R5cGUud3JpdGVfdWludDMyID0gZnVuY3Rpb24gKG9mZnNldCwgdmFsdWUpIHtcbiAgdmFyIGQgPSB0aGlzLm91dHB1dDtcblxuICBpZiAodGhpcy5iaWdfZW5kaWFuKSB7XG4gICAgZFtvZmZzZXRdICAgICA9ICh2YWx1ZSA+Pj4gMjQpICYgMHhGRjtcbiAgICBkW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNikgJiAweEZGO1xuICAgIGRbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDgpICYgMHhGRjtcbiAgICBkW29mZnNldCArIDNdID0gdmFsdWUgJiAweEZGO1xuICB9IGVsc2Uge1xuICAgIGRbb2Zmc2V0XSAgICAgPSB2YWx1ZSAmIDB4RkY7XG4gICAgZFtvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOCkgJiAweEZGO1xuICAgIGRbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDE2KSAmIDB4RkY7XG4gICAgZFtvZmZzZXQgKyAzXSA9ICh2YWx1ZSA+Pj4gMjQpICYgMHhGRjtcbiAgfVxufTtcblxuXG5FeGlmUGFyc2VyLnByb3RvdHlwZS5pc19zdWJpZmRfbGluayA9IGZ1bmN0aW9uIChpZmQsIHRhZykge1xuICByZXR1cm4gKGlmZCA9PT0gMCAmJiB0YWcgPT09IDB4ODc2OSkgfHwgLy8gU3ViSUZEXG4gICAgICAgICAoaWZkID09PSAwICYmIHRhZyA9PT0gMHg4ODI1KSB8fCAvLyBHUFMgSW5mb1xuICAgICAgICAgKGlmZCA9PT0gMHg4NzY5ICYmIHRhZyA9PT0gMHhBMDA1KTsgLy8gSW50ZXJvcCBJRkRcbn07XG5cblxuLy8gUmV0dXJucyBieXRlIGxlbmd0aCBvZiBhIHNpbmdsZSBjb21wb25lbnQgb2YgYSBnaXZlbiBmb3JtYXRcbi8vXG5FeGlmUGFyc2VyLnByb3RvdHlwZS5leGlmX2Zvcm1hdF9sZW5ndGggPSBmdW5jdGlvbiAoZm9ybWF0KSB7XG4gIHN3aXRjaCAoZm9ybWF0KSB7XG4gICAgY2FzZSAxOiAvLyBieXRlXG4gICAgY2FzZSAyOiAvLyBhc2NpaVxuICAgIGNhc2UgNjogLy8gc2J5dGVcbiAgICBjYXNlIDc6IC8vIHVuZGVmaW5lZFxuICAgICAgcmV0dXJuIDE7XG5cbiAgICBjYXNlIDM6IC8vIHNob3J0XG4gICAgY2FzZSA4OiAvLyBzc2hvcnRcbiAgICAgIHJldHVybiAyO1xuXG4gICAgY2FzZSA0OiAgLy8gbG9uZ1xuICAgIGNhc2UgOTogIC8vIHNsb25nXG4gICAgY2FzZSAxMTogLy8gZmxvYXRcbiAgICAgIHJldHVybiA0O1xuXG4gICAgY2FzZSA1OiAgLy8gcmF0aW9uYWxcbiAgICBjYXNlIDEwOiAvLyBzcmF0aW9uYWxcbiAgICBjYXNlIDEyOiAvLyBkb3VibGVcbiAgICAgIHJldHVybiA4O1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIHVua25vd24gdHlwZVxuICAgICAgcmV0dXJuIDA7XG4gIH1cbn07XG5cblxuLy8gUmVhZHMgRXhpZiBkYXRhXG4vL1xuRXhpZlBhcnNlci5wcm90b3R5cGUuZXhpZl9mb3JtYXRfcmVhZCA9IGZ1bmN0aW9uIChmb3JtYXQsIG9mZnNldCkge1xuICB2YXIgdjtcblxuICBzd2l0Y2ggKGZvcm1hdCkge1xuICAgIGNhc2UgMTogLy8gYnl0ZVxuICAgIGNhc2UgMjogLy8gYXNjaWlcbiAgICAgIHYgPSB0aGlzLmlucHV0W29mZnNldF07XG4gICAgICByZXR1cm4gdjtcblxuICAgIGNhc2UgNjogLy8gc2J5dGVcbiAgICAgIHYgPSB0aGlzLmlucHV0W29mZnNldF07XG4gICAgICByZXR1cm4gdiB8ICh2ICYgMHg4MCkgKiAweDFmZmZmZmU7XG5cbiAgICBjYXNlIDM6IC8vIHNob3J0XG4gICAgICB2ID0gdGhpcy5yZWFkX3VpbnQxNihvZmZzZXQpO1xuICAgICAgcmV0dXJuIHY7XG5cbiAgICBjYXNlIDg6IC8vIHNzaG9ydFxuICAgICAgdiA9IHRoaXMucmVhZF91aW50MTYob2Zmc2V0KTtcbiAgICAgIHJldHVybiB2IHwgKHYgJiAweDgwMDApICogMHgxZmZmZTtcblxuICAgIGNhc2UgNDogLy8gbG9uZ1xuICAgICAgdiA9IHRoaXMucmVhZF91aW50MzIob2Zmc2V0KTtcbiAgICAgIHJldHVybiB2O1xuXG4gICAgY2FzZSA5OiAvLyBzbG9uZ1xuICAgICAgdiA9IHRoaXMucmVhZF91aW50MzIob2Zmc2V0KTtcbiAgICAgIHJldHVybiB2IHwgMDtcblxuICAgIGNhc2UgNTogIC8vIHJhdGlvbmFsXG4gICAgY2FzZSAxMDogLy8gc3JhdGlvbmFsXG4gICAgY2FzZSAxMTogLy8gZmxvYXRcbiAgICBjYXNlIDEyOiAvLyBkb3VibGVcbiAgICAgIHJldHVybiBudWxsOyAvLyBub3QgaW1wbGVtZW50ZWRcblxuICAgIGNhc2UgNzogLy8gdW5kZWZpbmVkXG4gICAgICByZXR1cm4gbnVsbDsgLy8gYmxvYlxuXG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIHVua25vd24gdHlwZVxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn07XG5cblxuRXhpZlBhcnNlci5wcm90b3R5cGUuc2Nhbl9pZmQgPSBmdW5jdGlvbiAoaWZkX25vLCBvZmZzZXQsIG9uX2VudHJ5KSB7XG4gIHZhciBlbnRyeV9jb3VudCA9IHRoaXMucmVhZF91aW50MTYob2Zmc2V0KTtcblxuICBvZmZzZXQgKz0gMjtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGVudHJ5X2NvdW50OyBpKyspIHtcbiAgICB2YXIgdGFnICAgID0gdGhpcy5yZWFkX3VpbnQxNihvZmZzZXQpO1xuICAgIHZhciBmb3JtYXQgPSB0aGlzLnJlYWRfdWludDE2KG9mZnNldCArIDIpO1xuICAgIHZhciBjb3VudCAgPSB0aGlzLnJlYWRfdWludDMyKG9mZnNldCArIDQpO1xuXG4gICAgdmFyIGNvbXBfbGVuZ3RoICAgID0gdGhpcy5leGlmX2Zvcm1hdF9sZW5ndGgoZm9ybWF0KTtcbiAgICB2YXIgZGF0YV9sZW5ndGggICAgPSBjb3VudCAqIGNvbXBfbGVuZ3RoO1xuICAgIHZhciBkYXRhX29mZnNldCAgICA9IGRhdGFfbGVuZ3RoIDw9IDQgPyBvZmZzZXQgKyA4IDogdGhpcy5yZWFkX3VpbnQzMihvZmZzZXQgKyA4KTtcbiAgICB2YXIgaXNfc3ViaWZkX2xpbmsgPSBmYWxzZTtcblxuICAgIGlmIChkYXRhX29mZnNldCArIGRhdGFfbGVuZ3RoID4gdGhpcy5pbnB1dC5sZW5ndGgpIHtcbiAgICAgIHRocm93IGVycm9yKCd1bmV4cGVjdGVkIEVPRicsICdFQkFEREFUQScpO1xuICAgIH1cblxuICAgIHZhciB2YWx1ZSA9IFtdO1xuICAgIHZhciBjb21wX29mZnNldCA9IGRhdGFfb2Zmc2V0O1xuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBjb3VudDsgaisrLCBjb21wX29mZnNldCArPSBjb21wX2xlbmd0aCkge1xuICAgICAgdmFyIGl0ZW0gPSB0aGlzLmV4aWZfZm9ybWF0X3JlYWQoZm9ybWF0LCBjb21wX29mZnNldCk7XG4gICAgICBpZiAoaXRlbSA9PT0gbnVsbCkge1xuICAgICAgICB2YWx1ZSA9IG51bGw7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgdmFsdWUucHVzaChpdGVtKTtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgZm9ybWF0ID09PSAyKSB7XG4gICAgICB0cnkge1xuICAgICAgICB2YWx1ZSA9IHV0ZjhfZGVjb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgdmFsdWUpKTtcbiAgICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgdmFsdWUgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAodmFsdWUgJiYgdmFsdWVbdmFsdWUubGVuZ3RoIC0gMV0gPT09ICdcXDAnKSB2YWx1ZSA9IHZhbHVlLnNsaWNlKDAsIC0xKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc19zdWJpZmRfbGluayhpZmRfbm8sIHRhZykpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiBOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlWzBdKSAmJiB2YWx1ZVswXSA+IDApIHtcbiAgICAgICAgdGhpcy5pZmRzX3RvX3JlYWQucHVzaCh7XG4gICAgICAgICAgaWQ6ICAgICB0YWcsXG4gICAgICAgICAgb2Zmc2V0OiB2YWx1ZVswXVxuICAgICAgICB9KTtcbiAgICAgICAgaXNfc3ViaWZkX2xpbmsgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBlbnRyeSA9IHtcbiAgICAgIGlzX2JpZ19lbmRpYW46ICB0aGlzLmJpZ19lbmRpYW4sXG4gICAgICBpZmQ6ICAgICAgICAgICAgaWZkX25vLFxuICAgICAgdGFnOiAgICAgICAgICAgIHRhZyxcbiAgICAgIGZvcm1hdDogICAgICAgICBmb3JtYXQsXG4gICAgICBjb3VudDogICAgICAgICAgY291bnQsXG4gICAgICBlbnRyeV9vZmZzZXQ6ICAgb2Zmc2V0ICsgdGhpcy5zdGFydCxcbiAgICAgIGRhdGFfbGVuZ3RoOiAgICBkYXRhX2xlbmd0aCxcbiAgICAgIGRhdGFfb2Zmc2V0OiAgICBkYXRhX29mZnNldCArIHRoaXMuc3RhcnQsXG4gICAgICB2YWx1ZTogICAgICAgICAgdmFsdWUsXG4gICAgICBpc19zdWJpZmRfbGluazogaXNfc3ViaWZkX2xpbmtcbiAgICB9O1xuXG4gICAgaWYgKG9uX2VudHJ5KGVudHJ5KSA9PT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuYWJvcnRlZCA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgb2Zmc2V0ICs9IDEyO1xuICB9XG5cbiAgaWYgKGlmZF9ubyA9PT0gMCkge1xuICAgIHRoaXMuaWZkc190b19yZWFkLnB1c2goe1xuICAgICAgaWQ6ICAgICAxLFxuICAgICAgb2Zmc2V0OiB0aGlzLnJlYWRfdWludDMyKG9mZnNldClcbiAgICB9KTtcbiAgfVxufTtcblxuXG4vLyBDaGVjayB3aGV0aGVyIGlucHV0IGlzIGEgSlBFRyBpbWFnZVxuLy9cbi8vIElucHV0OlxuLy8gIC0ganBlZ19iaW46IFVpbnQ4QXJyYXkgLSBqcGVnIGZpbGVcbi8vXG4vLyBSZXR1cm5zIHRydWUgaWYgaXQgaXMgYW5kIGZhbHNlIG90aGVyd2lzZVxuLy9cbm1vZHVsZS5leHBvcnRzLmlzX2pwZWcgPSBmdW5jdGlvbiAoanBlZ19iaW4pIHtcbiAgcmV0dXJuIGpwZWdfYmluLmxlbmd0aCA+PSA0ICYmIGpwZWdfYmluWzBdID09PSAweEZGICYmIGpwZWdfYmluWzFdID09PSAweEQ4ICYmIGpwZWdfYmluWzJdID09PSAweEZGO1xufTtcblxuXG4vLyBDYWxsIGFuIGl0ZXJhdG9yIG9uIGVhY2ggc2VnbWVudCBpbiB0aGUgZ2l2ZW4gSlBFRyBpbWFnZVxuLy9cbi8vIElucHV0OlxuLy8gIC0ganBlZ19iaW46ICAgVWludDhBcnJheSAtIGpwZWcgZmlsZVxuLy8gIC0gb25fc2VnbWVudDogRnVuY3Rpb24gLSBjYWxsYmFjayBleGVjdXRlZCBvbiBlYWNoIEpQRUcgbWFya2VyIHNlZ21lbnRcbi8vICAgIC0gc2VnbWVudDogIE9iamVjdFxuLy8gICAgICAtIGNvZGU6ICAgTnVtYmVyIC0gbWFya2VyIHR5cGUgKDJuZCBieXRlLCBlLmcuIDB4RTAgZm9yIEFQUDApXG4vLyAgICAgIC0gb2Zmc2V0OiBOdW1iZXIgLSBvZmZzZXQgb2YgdGhlIGZpcnN0IGJ5dGUgKDB4RkYpIHJlbGF0aXZlIHRvIGBqcGVnX2JpbmAgc3RhcnRcbi8vICAgICAgLSBsZW5ndGg6IE51bWJlciAtIGxlbmd0aCBvZiB0aGUgZW50aXJlIG1hcmtlciBzZWdtZW50IGluY2x1ZGluZyBmaXJzdCB0d28gYnl0ZXMgYW5kIGxlbmd0aFxuLy8gICAgICAgIC0gMiBmb3Igc3RhbmRhbG9uZSBtYXJrZXJzXG4vLyAgICAgICAgLSA0K2xlbmd0aCBmb3IgbWFya2VycyB3aXRoIGRhdGFcbi8vXG4vLyBJdGVyYXRpb24gc3RvcHMgd2hlbiBgRU9JYCAoMHhGRkQ5KSBtYXJrZXIgaXMgcmVhY2hlZCBvciBpZiBgb25fc2VnbWVudGBcbi8vIGZ1bmN0aW9uIHJldHVybnMgYGZhbHNlYC5cbi8vXG5tb2R1bGUuZXhwb3J0cy5qcGVnX3NlZ21lbnRzX2VhY2ggPSBmdW5jdGlvbiAoanBlZ19iaW4sIG9uX3NlZ21lbnQpIHtcbiAgaWYgKCFpc191aW50OGFycmF5KGpwZWdfYmluKSkge1xuICAgIHRocm93IGVycm9yKCdJbnZhbGlkIGFyZ3VtZW50IChqcGVnX2JpbiksIFVpbnQ4QXJyYXkgZXhwZWN0ZWQnLCAnRUlOVkFMJyk7XG4gIH1cblxuICBpZiAodHlwZW9mIG9uX3NlZ21lbnQgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBlcnJvcignSW52YWxpZCBhcmd1bWVudCAob25fc2VnbWVudCksIEZ1bmN0aW9uIGV4cGVjdGVkJywgJ0VJTlZBTCcpO1xuICB9XG5cbiAgaWYgKCFtb2R1bGUuZXhwb3J0cy5pc19qcGVnKGpwZWdfYmluKSkge1xuICAgIHRocm93IGVycm9yKCdVbmtub3duIGZpbGUgZm9ybWF0JywgJ0VOT1RKUEVHJyk7XG4gIH1cblxuICB2YXIgb2Zmc2V0ID0gMCwgbGVuZ3RoID0ganBlZ19iaW4ubGVuZ3RoLCBpbnNpZGVfc2NhbiA9IGZhbHNlO1xuXG4gIGZvciAoOzspIHtcbiAgICB2YXIgc2VnbWVudF9jb2RlLCBzZWdtZW50X2xlbmd0aDtcblxuICAgIGlmIChvZmZzZXQgKyAxID49IGxlbmd0aCkgdGhyb3cgZXJyb3IoJ1VuZXhwZWN0ZWQgRU9GJywgJ0VCQUREQVRBJyk7XG4gICAgdmFyIGJ5dGUxID0ganBlZ19iaW5bb2Zmc2V0XTtcbiAgICB2YXIgYnl0ZTIgPSBqcGVnX2JpbltvZmZzZXQgKyAxXTtcblxuICAgIGlmIChieXRlMSA9PT0gMHhGRiAmJiBieXRlMiA9PT0gMHhGRikge1xuICAgICAgLy8gcGFkZGluZ1xuICAgICAgc2VnbWVudF9jb2RlID0gMHhGRjtcbiAgICAgIHNlZ21lbnRfbGVuZ3RoID0gMTtcblxuICAgIH0gZWxzZSBpZiAoYnl0ZTEgPT09IDB4RkYgJiYgYnl0ZTIgIT09IDApIHtcbiAgICAgIC8vIG1hcmtlclxuICAgICAgc2VnbWVudF9jb2RlID0gYnl0ZTI7XG4gICAgICBzZWdtZW50X2xlbmd0aCA9IDI7XG5cbiAgICAgIGlmICgoMHhEMCA8PSBzZWdtZW50X2NvZGUgJiYgc2VnbWVudF9jb2RlIDw9IDB4RDkpIHx8IHNlZ21lbnRfY29kZSA9PT0gMHgwMSkgOyBlbHNlIHtcbiAgICAgICAgaWYgKG9mZnNldCArIDMgPj0gbGVuZ3RoKSB0aHJvdyBlcnJvcignVW5leHBlY3RlZCBFT0YnLCAnRUJBRERBVEEnKTtcbiAgICAgICAgc2VnbWVudF9sZW5ndGggKz0ganBlZ19iaW5bb2Zmc2V0ICsgMl0gKiAweDEwMCArIGpwZWdfYmluW29mZnNldCArIDNdO1xuICAgICAgICBpZiAoc2VnbWVudF9sZW5ndGggPCAyKSB0aHJvdyBlcnJvcignSW52YWxpZCBzZWdtZW50IGxlbmd0aCcsICdFQkFEREFUQScpO1xuICAgICAgICBpZiAob2Zmc2V0ICsgc2VnbWVudF9sZW5ndGggLSAxID49IGxlbmd0aCkgdGhyb3cgZXJyb3IoJ1VuZXhwZWN0ZWQgRU9GJywgJ0VCQUREQVRBJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpbnNpZGVfc2Nhbikge1xuICAgICAgICBpZiAoc2VnbWVudF9jb2RlID49IDB4RDAgJiYgc2VnbWVudF9jb2RlIDw9IDB4RDcpIDsgZWxzZSB7XG4gICAgICAgICAgaW5zaWRlX3NjYW4gPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc2VnbWVudF9jb2RlID09PSAweERBIC8qIFNPUyAqLykgaW5zaWRlX3NjYW4gPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoaW5zaWRlX3NjYW4pIHtcbiAgICAgIC8vIGVudHJvcHktZW5jb2RlZCBzZWdtZW50XG4gICAgICBmb3IgKHZhciBwb3MgPSBvZmZzZXQgKyAxOyA7IHBvcysrKSB7XG4gICAgICAgIC8vIHNjYW4gdW50aWwgd2UgZmluZCBGRlxuICAgICAgICBpZiAocG9zID49IGxlbmd0aCkgdGhyb3cgZXJyb3IoJ1VuZXhwZWN0ZWQgRU9GJywgJ0VCQUREQVRBJyk7XG4gICAgICAgIGlmIChqcGVnX2Jpbltwb3NdID09PSAweEZGKSB7XG4gICAgICAgICAgaWYgKHBvcyArIDEgPj0gbGVuZ3RoKSB0aHJvdyBlcnJvcignVW5leHBlY3RlZCBFT0YnLCAnRUJBRERBVEEnKTtcbiAgICAgICAgICBpZiAoanBlZ19iaW5bcG9zICsgMV0gIT09IDApIHtcbiAgICAgICAgICAgIHNlZ21lbnRfY29kZSA9IDA7XG4gICAgICAgICAgICBzZWdtZW50X2xlbmd0aCA9IHBvcyAtIG9mZnNldDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBlcnJvcignVW5leHBlY3RlZCBieXRlIGF0IHNlZ21lbnQgc3RhcnQ6ICcgKyB0b19oZXgoYnl0ZTEpICtcbiAgICAgICAgJyAob2Zmc2V0ICcgKyB0b19oZXgob2Zmc2V0KSArICcpJywgJ0VCQUREQVRBJyk7XG4gICAgfVxuXG4gICAgaWYgKG9uX3NlZ21lbnQoeyBjb2RlOiBzZWdtZW50X2NvZGUsIG9mZnNldDogb2Zmc2V0LCBsZW5ndGg6IHNlZ21lbnRfbGVuZ3RoIH0pID09PSBmYWxzZSkgYnJlYWs7XG4gICAgaWYgKHNlZ21lbnRfY29kZSA9PT0gMHhEOSAvKiBFT0kgKi8pIGJyZWFrO1xuICAgIG9mZnNldCArPSBzZWdtZW50X2xlbmd0aDtcbiAgfVxufTtcblxuXG4vLyBSZXBsYWNlIG9yIHJlbW92ZSBzZWdtZW50cyBpbiB0aGUgZ2l2ZW4gSlBFRyBpbWFnZVxuLy9cbi8vIElucHV0OlxuLy8gIC0ganBlZ19iaW46ICAgVWludDhBcnJheSAtIGpwZWcgZmlsZVxuLy8gIC0gb25fc2VnbWVudDogRnVuY3Rpb24gLSBjYWxsYmFjayBleGVjdXRlZCBvbiBlYWNoIEpQRUcgbWFya2VyIHNlZ21lbnRcbi8vICAgIC0gc2VnbWVudDogIE9iamVjdFxuLy8gICAgICAtIGNvZGU6ICAgTnVtYmVyIC0gbWFya2VyIHR5cGUgKDJuZCBieXRlLCBlLmcuIDB4RTAgZm9yIEFQUDApXG4vLyAgICAgIC0gb2Zmc2V0OiBOdW1iZXIgLSBvZmZzZXQgb2YgdGhlIGZpcnN0IGJ5dGUgKDB4RkYpIHJlbGF0aXZlIHRvIGBqcGVnX2JpbmAgc3RhcnRcbi8vICAgICAgLSBsZW5ndGg6IE51bWJlciAtIGxlbmd0aCBvZiB0aGUgZW50aXJlIG1hcmtlciBzZWdtZW50IGluY2x1ZGluZyBmaXJzdCB0d28gYnl0ZXMgYW5kIGxlbmd0aFxuLy8gICAgICAgIC0gMiBmb3Igc3RhbmRhbG9uZSBtYXJrZXJzXG4vLyAgICAgICAgLSA0K2xlbmd0aCBmb3IgbWFya2VycyB3aXRoIGRhdGFcbi8vXG4vLyBgb25fc2VnbWVudGAgZnVuY3Rpb24gc2hvdWxkIHJldHVybiBvbmUgb2YgdGhlIGZvbGxvd2luZzpcbi8vICAtIGBmYWxzZWAgICAgICAgIC0gc2VnbWVudCBpcyByZW1vdmVkIGZyb20gdGhlIG91dHB1dFxuLy8gIC0gVWludDhBcnJheSAgICAgLSBzZWdtZW50IGlzIHJlcGxhY2VkIHdpdGggdGhlIG5ldyBkYXRhXG4vLyAgLSBbIFVpbnQ4QXJyYXkgXSAtIHNlZ21lbnQgaXMgcmVwbGFjZWQgd2l0aCB0aGUgbmV3IGRhdGFcbi8vICAtIGFueXRoaW5nIGVsc2UgIC0gc2VnbWVudCBpcyBjb3BpZWQgdG8gdGhlIG91dHB1dCBhcyBpc1xuLy9cbi8vIEFueSBkYXRhIGFmdGVyIGBFT0lgICgweEZGRDkpIG1hcmtlciBpcyByZW1vdmVkLlxuLy9cbm1vZHVsZS5leHBvcnRzLmpwZWdfc2VnbWVudHNfZmlsdGVyID0gZnVuY3Rpb24gKGpwZWdfYmluLCBvbl9zZWdtZW50KSB7XG4gIGlmICghaXNfdWludDhhcnJheShqcGVnX2JpbikpIHtcbiAgICB0aHJvdyBlcnJvcignSW52YWxpZCBhcmd1bWVudCAoanBlZ19iaW4pLCBVaW50OEFycmF5IGV4cGVjdGVkJywgJ0VJTlZBTCcpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvbl9zZWdtZW50ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgZXJyb3IoJ0ludmFsaWQgYXJndW1lbnQgKG9uX3NlZ21lbnQpLCBGdW5jdGlvbiBleHBlY3RlZCcsICdFSU5WQUwnKTtcbiAgfVxuXG4gIHZhciByYW5nZXMgPSBbXTtcbiAgdmFyIG91dF9sZW5ndGggPSAwO1xuXG4gIG1vZHVsZS5leHBvcnRzLmpwZWdfc2VnbWVudHNfZWFjaChqcGVnX2JpbiwgZnVuY3Rpb24gKHNlZ21lbnQpIHtcbiAgICB2YXIgbmV3X3NlZ21lbnQgPSBvbl9zZWdtZW50KHNlZ21lbnQpO1xuXG4gICAgaWYgKGlzX3VpbnQ4YXJyYXkobmV3X3NlZ21lbnQpKSB7XG4gICAgICByYW5nZXMucHVzaCh7IGRhdGE6IG5ld19zZWdtZW50IH0pO1xuICAgICAgb3V0X2xlbmd0aCArPSBuZXdfc2VnbWVudC5sZW5ndGg7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG5ld19zZWdtZW50KSkge1xuICAgICAgbmV3X3NlZ21lbnQuZmlsdGVyKGlzX3VpbnQ4YXJyYXkpLmZvckVhY2goZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgcmFuZ2VzLnB1c2goeyBkYXRhOiBzIH0pO1xuICAgICAgICBvdXRfbGVuZ3RoICs9IHMubGVuZ3RoO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChuZXdfc2VnbWVudCAhPT0gZmFsc2UpIHtcbiAgICAgIHZhciBuZXdfcmFuZ2UgPSB7IHN0YXJ0OiBzZWdtZW50Lm9mZnNldCwgZW5kOiBzZWdtZW50Lm9mZnNldCArIHNlZ21lbnQubGVuZ3RoIH07XG5cbiAgICAgIGlmIChyYW5nZXMubGVuZ3RoID4gMCAmJiByYW5nZXNbcmFuZ2VzLmxlbmd0aCAtIDFdLmVuZCA9PT0gbmV3X3JhbmdlLnN0YXJ0KSB7XG4gICAgICAgIHJhbmdlc1tyYW5nZXMubGVuZ3RoIC0gMV0uZW5kID0gbmV3X3JhbmdlLmVuZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJhbmdlcy5wdXNoKG5ld19yYW5nZSk7XG4gICAgICB9XG5cbiAgICAgIG91dF9sZW5ndGggKz0gc2VnbWVudC5sZW5ndGg7XG4gICAgfVxuICB9KTtcblxuICB2YXIgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkob3V0X2xlbmd0aCk7XG4gIHZhciBvZmZzZXQgPSAwO1xuXG4gIHJhbmdlcy5mb3JFYWNoKGZ1bmN0aW9uIChyYW5nZSkge1xuICAgIHZhciBkYXRhID0gcmFuZ2UuZGF0YSB8fCBqcGVnX2Jpbi5zdWJhcnJheShyYW5nZS5zdGFydCwgcmFuZ2UuZW5kKTtcbiAgICByZXN1bHQuc2V0KGRhdGEsIG9mZnNldCk7XG4gICAgb2Zmc2V0ICs9IGRhdGEubGVuZ3RoO1xuICB9KTtcblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuXG4vLyBDYWxsIGFuIGl0ZXJhdG9yIG9uIGVhY2ggRXhpZiBlbnRyeSBpbiB0aGUgZ2l2ZW4gSlBFRyBpbWFnZVxuLy9cbi8vIElucHV0OlxuLy8gIC0ganBlZ19iaW46IFVpbnQ4QXJyYXkgLSBqcGVnIGZpbGVcbi8vICAtIG9uX2VudHJ5OiBGdW5jdGlvbiAtIGNhbGxiYWNrIGV4ZWN1dGVkIG9uIGVhY2ggRXhpZiBlbnRyeVxuLy8gICAgLSBlbnRyeTogIE9iamVjdFxuLy8gICAgICAtIGlzX2JpZ19lbmRpYW46ICBCb29sZWFuIC0gd2hldGhlciBFeGlmIHVzZXMgYmlnIG9yIGxpdHRsZSBlbmRpYW4gYnl0ZSBhbGlnbm1lbnRcbi8vICAgICAgLSBpZmQ6ICAgICAgICAgICAgTnVtYmVyICAtIElGRCBpZGVudGlmaWVyICgwIGZvciBJRkQwLCAxIGZvciBJRkQxLCAweDg3NjkgZm9yIFN1YklGRCxcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODI1IGZvciBHUFMgSW5mbywgMHhBMDA1IGZvciBJbnRlcm9wIElGRClcbi8vICAgICAgLSB0YWc6ICAgICAgICAgICAgTnVtYmVyICAtIGV4aWYgZW50cnkgdGFnICgweDAxMTAgLSBjYW1lcmEgbmFtZSwgMHgwMTEyIC0gb3JpZW50YXRpb24sIGV0Yy4gLSBzZWUgRXhpZiBzcGVjKVxuLy8gICAgICAtIGZvcm1hdDogICAgICAgICBOdW1iZXIgIC0gZXhpZiBlbnRyeSBmb3JtYXQgKDEgLSBieXRlLCAyIC0gYXNjaWksIDMgLSBzaG9ydCwgZXRjLiAtIHNlZSBFeGlmIHNwZWMpXG4vLyAgICAgIC0gY291bnQ6ICAgICAgICAgIE51bWJlciAgLSBudW1iZXIgb2YgY29tcG9uZW50cyBvZiB0aGUgZ2l2ZW4gZm9ybWF0IGluc2lkZSBkYXRhXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1c3VhbGx5IDEsIG9yIHN0cmluZyBsZW5ndGggZm9yIGFzY2lpIGZvcm1hdClcbi8vICAgICAgLSBlbnRyeV9vZmZzZXQ6ICAgTnVtYmVyICAtIHN0YXJ0IG9mIEV4aWYgZW50cnkgKGVudHJ5IGxlbmd0aCBpcyBhbHdheXMgMTIsIHNvIG5vdCBpbmNsdWRlZClcbi8vICAgICAgLSBkYXRhX29mZnNldDogICAgTnVtYmVyICAtIHN0YXJ0IG9mIGRhdGEgYXR0YWNoZWQgdG8gRXhpZiBlbnRyeSAod2lsbCBvdmVybGFwIHdpdGggZW50cnkgaWYgbGVuZ3RoIDw9IDQpXG4vLyAgICAgIC0gZGF0YV9sZW5ndGg6ICAgIE51bWJlciAgLSBsZW5ndGggb2YgZGF0YSBhdHRhY2hlZCB0byBFeGlmIGVudHJ5XG4vLyAgICAgIC0gdmFsdWU6ICAgICAgICAgIEFycmF5fFN0cmluZ3xOdWxsIC0gb3VyIGJlc3QgYXR0ZW1wdCBhdCBwYXJzaW5nIGRhdGEgKG5vdCBhbGwgZm9ybWF0cyBzdXBwb3J0ZWQgcmlnaHQgbm93KVxuLy8gICAgICAtIGlzX3N1YmlmZF9saW5rOiBCb29sZWFuIC0gd2hldGhlciB0aGlzIGVudHJ5IGlzIHJlY29nbml6ZWQgdG8gYmUgYSBsaW5rIHRvIHN1YmlmZCAoY2FuJ3QgZmlsdGVyIHRoZXNlIG91dClcbi8vXG4vLyBJdGVyYXRpb24gc3RvcHMgZWFybHkgaWYgaXRlcmF0b3IgcmV0dXJucyBgZmFsc2VgLlxuLy9cbi8vIElmIEV4aWYgd2Fzbid0IGZvdW5kIGFueXdoZXJlIChiZWZvcmUgc3RhcnQgb2YgdGhlIGltYWdlIGRhdGEsIFNPUyksXG4vLyBpdGVyYXRvciBpcyBuZXZlciBleGVjdXRlZC5cbi8vXG5tb2R1bGUuZXhwb3J0cy5qcGVnX2V4aWZfdGFnc19lYWNoID0gZnVuY3Rpb24gKGpwZWdfYmluLCBvbl9leGlmX2VudHJ5KSB7XG4gIGlmICghaXNfdWludDhhcnJheShqcGVnX2JpbikpIHtcbiAgICB0aHJvdyBlcnJvcignSW52YWxpZCBhcmd1bWVudCAoanBlZ19iaW4pLCBVaW50OEFycmF5IGV4cGVjdGVkJywgJ0VJTlZBTCcpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvbl9leGlmX2VudHJ5ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgZXJyb3IoJ0ludmFsaWQgYXJndW1lbnQgKG9uX2V4aWZfZW50cnkpLCBGdW5jdGlvbiBleHBlY3RlZCcsICdFSU5WQUwnKTtcbiAgfVxuXG4gIC8qIGVzbGludC1kaXNhYmxlIGNvbnNpc3RlbnQtcmV0dXJuICovXG4gIG1vZHVsZS5leHBvcnRzLmpwZWdfc2VnbWVudHNfZWFjaChqcGVnX2JpbiwgZnVuY3Rpb24gKHNlZ21lbnQpIHtcbiAgICBpZiAoc2VnbWVudC5jb2RlID09PSAweERBIC8qIFNPUyAqLykgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gbG9vayBmb3IgQVBQMSBzZWdtZW50IGFuZCBjb21wYXJlIGhlYWRlciB3aXRoICdFeGlmXFwwXFwwJ1xuICAgIGlmIChzZWdtZW50LmNvZGUgPT09IDB4RTEgJiYgc2VnbWVudC5sZW5ndGggPj0gMTAgJiZcbiAgICAgICAganBlZ19iaW5bc2VnbWVudC5vZmZzZXQgKyA0XSA9PT0gMHg0NSAmJiBqcGVnX2JpbltzZWdtZW50Lm9mZnNldCArIDVdID09PSAweDc4ICYmXG4gICAgICAgIGpwZWdfYmluW3NlZ21lbnQub2Zmc2V0ICsgNl0gPT09IDB4NjkgJiYganBlZ19iaW5bc2VnbWVudC5vZmZzZXQgKyA3XSA9PT0gMHg2NiAmJlxuICAgICAgICBqcGVnX2JpbltzZWdtZW50Lm9mZnNldCArIDhdID09PSAweDAwICYmIGpwZWdfYmluW3NlZ21lbnQub2Zmc2V0ICsgOV0gPT09IDB4MDApIHtcblxuICAgICAgbmV3IEV4aWZQYXJzZXIoanBlZ19iaW4sIHNlZ21lbnQub2Zmc2V0ICsgMTAsIHNlZ21lbnQub2Zmc2V0ICsgc2VnbWVudC5sZW5ndGgpLmVhY2gob25fZXhpZl9lbnRyeSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9KTtcbn07XG5cblxuLy8gUmVtb3ZlIEV4aWYgZW50cmllcyBpbiB0aGUgZ2l2ZW4gSlBFRyBpbWFnZVxuLy9cbi8vIElucHV0OlxuLy8gIC0ganBlZ19iaW46IFVpbnQ4QXJyYXkgLSBqcGVnIGZpbGVcbi8vICAtIG9uX2VudHJ5OiBGdW5jdGlvbiAtIGNhbGxiYWNrIGV4ZWN1dGVkIG9uIGVhY2ggRXhpZiBlbnRyeVxuLy8gICAgLSBlbnRyeTogIE9iamVjdFxuLy8gICAgICAtIGlzX2JpZ19lbmRpYW46ICBCb29sZWFuIC0gd2hldGhlciBFeGlmIHVzZXMgYmlnIG9yIGxpdHRsZSBlbmRpYW4gYnl0ZSBhbGlnbm1lbnRcbi8vICAgICAgLSBpZmQ6ICAgICAgICAgICAgTnVtYmVyICAtIElGRCBpZGVudGlmaWVyICgwIGZvciBJRkQwLCAxIGZvciBJRkQxLCAweDg3NjkgZm9yIFN1YklGRCxcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODgyNSBmb3IgR1BTIEluZm8sIDB4QTAwNSBmb3IgSW50ZXJvcCBJRkQpXG4vLyAgICAgIC0gdGFnOiAgICAgICAgICAgIE51bWJlciAgLSBleGlmIGVudHJ5IHRhZyAoMHgwMTEwIC0gY2FtZXJhIG5hbWUsIDB4MDExMiAtIG9yaWVudGF0aW9uLCBldGMuIC0gc2VlIEV4aWYgc3BlYylcbi8vICAgICAgLSBmb3JtYXQ6ICAgICAgICAgTnVtYmVyICAtIGV4aWYgZW50cnkgZm9ybWF0ICgxIC0gYnl0ZSwgMiAtIGFzY2lpLCAzIC0gc2hvcnQsIGV0Yy4gLSBzZWUgRXhpZiBzcGVjKVxuLy8gICAgICAtIGNvdW50OiAgICAgICAgICBOdW1iZXIgIC0gbnVtYmVyIG9mIGNvbXBvbmVudHMgb2YgdGhlIGdpdmVuIGZvcm1hdCBpbnNpZGUgZGF0YVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVzdWFsbHkgMSwgb3Igc3RyaW5nIGxlbmd0aCBmb3IgYXNjaWkgZm9ybWF0KVxuLy8gICAgICAtIGVudHJ5X29mZnNldDogICBOdW1iZXIgIC0gc3RhcnQgb2YgRXhpZiBlbnRyeSAoZW50cnkgbGVuZ3RoIGlzIGFsd2F5cyAxMiwgc28gbm90IGluY2x1ZGVkKVxuLy8gICAgICAtIGRhdGFfb2Zmc2V0OiAgICBOdW1iZXIgIC0gc3RhcnQgb2YgZGF0YSBhdHRhY2hlZCB0byBFeGlmIGVudHJ5ICh3aWxsIG92ZXJsYXAgd2l0aCBlbnRyeSBpZiBsZW5ndGggPD0gNClcbi8vICAgICAgLSBkYXRhX2xlbmd0aDogICAgTnVtYmVyICAtIGxlbmd0aCBvZiBkYXRhIGF0dGFjaGVkIHRvIEV4aWYgZW50cnlcbi8vICAgICAgLSB2YWx1ZTogICAgICAgICAgQXJyYXl8U3RyaW5nfE51bGwgLSBvdXIgYmVzdCBhdHRlbXB0IGF0IHBhcnNpbmcgZGF0YSAobm90IGFsbCBmb3JtYXRzIHN1cHBvcnRlZCByaWdodCBub3cpXG4vLyAgICAgIC0gaXNfc3ViaWZkX2xpbms6IEJvb2xlYW4gLSB3aGV0aGVyIHRoaXMgZW50cnkgaXMgcmVjb2duaXplZCB0byBiZSBhIGxpbmsgdG8gc3ViaWZkIChjYW4ndCBmaWx0ZXIgdGhlc2Ugb3V0KVxuLy9cbi8vIFRoaXMgZnVuY3Rpb24gcmVtb3ZlcyBmb2xsb3dpbmcgZnJvbSBFeGlmOlxuLy8gIC0gYWxsIGVudHJpZXMgd2hlcmUgaXRlcmF0b3IgcmV0dXJuZWQgZmFsc2UgKGV4Y2VwdCBzdWJpZmQgbGlua3Mgd2hpY2ggYXJlIG1hbmRhdG9yeSlcbi8vICAtIElGRDEgYW5kIHRodW1ibmFpbCBpbWFnZSAodGhlIHB1cnBvc2Ugb2YgdGhpcyBmdW5jdGlvbiBpcyB0byByZWR1Y2UgZmlsZSBzaXplLFxuLy8gICAgc28gdGh1bWJuYWlsIGlzIHVzdWFsbHkgdGhlIGZpcnN0IHRoaW5nIHRvIGdvKVxuLy8gIC0gYWxsIG90aGVyIGRhdGEgdGhhdCBpc24ndCBpbiBJRkQwLCBTdWJJRkQsIEdQU0lGRCwgSW50ZXJvcElGRFxuLy8gICAgKHRoZW9yZXRpY2FsbHkgcG9zc2libGUgcHJvcHJpZXRhcnkgZXh0ZW5zaW9ucywgSSBoYXZlbid0IHNlZW4gYW55IG9mIHRoZXNlIHlldClcbi8vXG4vLyBDaGFuZ2luZyBkYXRhIGluc2lkZSBFeGlmIGVudHJpZXMgaXMgTk9UIHN1cHBvcnRlZCB5ZXQgKG1vZGlmeWluZyBgZW50cnlgIG9iamVjdCBpbnNpZGUgY2FsbGJhY2sgbWF5IGJyZWFrIHN0dWZmKS5cbi8vXG4vLyBJZiBFeGlmIHdhc24ndCBmb3VuZCBhbnl3aGVyZSAoYmVmb3JlIHN0YXJ0IG9mIHRoZSBpbWFnZSBkYXRhLCBTT1MpLFxuLy8gaXRlcmF0b3IgaXMgbmV2ZXIgZXhlY3V0ZWQsIGFuZCBvcmlnaW5hbCBKUEVHIGlzIHJldHVybmVkIGFzIGlzLlxuLy9cbm1vZHVsZS5leHBvcnRzLmpwZWdfZXhpZl90YWdzX2ZpbHRlciA9IGZ1bmN0aW9uIChqcGVnX2Jpbiwgb25fZXhpZl9lbnRyeSkge1xuICBpZiAoIWlzX3VpbnQ4YXJyYXkoanBlZ19iaW4pKSB7XG4gICAgdGhyb3cgZXJyb3IoJ0ludmFsaWQgYXJndW1lbnQgKGpwZWdfYmluKSwgVWludDhBcnJheSBleHBlY3RlZCcsICdFSU5WQUwnKTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb25fZXhpZl9lbnRyeSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IGVycm9yKCdJbnZhbGlkIGFyZ3VtZW50IChvbl9leGlmX2VudHJ5KSwgRnVuY3Rpb24gZXhwZWN0ZWQnLCAnRUlOVkFMJyk7XG4gIH1cblxuICB2YXIgc3RvcF9zZWFyY2ggPSBmYWxzZTtcblxuICByZXR1cm4gbW9kdWxlLmV4cG9ydHMuanBlZ19zZWdtZW50c19maWx0ZXIoanBlZ19iaW4sIGZ1bmN0aW9uIChzZWdtZW50KSB7XG4gICAgaWYgKHN0b3Bfc2VhcmNoKSByZXR1cm47XG4gICAgaWYgKHNlZ21lbnQuY29kZSA9PT0gMHhEQSAvKiBTT1MgKi8pIHN0b3Bfc2VhcmNoID0gdHJ1ZTtcblxuICAgIC8vIGxvb2sgZm9yIEFQUDEgc2VnbWVudCBhbmQgY29tcGFyZSBoZWFkZXIgd2l0aCAnRXhpZlxcMFxcMCdcbiAgICBpZiAoc2VnbWVudC5jb2RlID09PSAweEUxICYmIHNlZ21lbnQubGVuZ3RoID49IDEwICYmXG4gICAgICAgIGpwZWdfYmluW3NlZ21lbnQub2Zmc2V0ICsgNF0gPT09IDB4NDUgJiYganBlZ19iaW5bc2VnbWVudC5vZmZzZXQgKyA1XSA9PT0gMHg3OCAmJlxuICAgICAgICBqcGVnX2JpbltzZWdtZW50Lm9mZnNldCArIDZdID09PSAweDY5ICYmIGpwZWdfYmluW3NlZ21lbnQub2Zmc2V0ICsgN10gPT09IDB4NjYgJiZcbiAgICAgICAganBlZ19iaW5bc2VnbWVudC5vZmZzZXQgKyA4XSA9PT0gMHgwMCAmJiBqcGVnX2JpbltzZWdtZW50Lm9mZnNldCArIDldID09PSAweDAwKSB7XG5cbiAgICAgIHZhciBuZXdfZXhpZiA9IG5ldyBFeGlmUGFyc2VyKGpwZWdfYmluLCBzZWdtZW50Lm9mZnNldCArIDEwLCBzZWdtZW50Lm9mZnNldCArIHNlZ21lbnQubGVuZ3RoKVxuICAgICAgICAuZmlsdGVyKG9uX2V4aWZfZW50cnkpO1xuICAgICAgaWYgKCFuZXdfZXhpZikgcmV0dXJuIGZhbHNlO1xuXG4gICAgICB2YXIgaGVhZGVyID0gbmV3IFVpbnQ4QXJyYXkoMTApO1xuXG4gICAgICBoZWFkZXIuc2V0KGpwZWdfYmluLnNsaWNlKHNlZ21lbnQub2Zmc2V0LCBzZWdtZW50Lm9mZnNldCArIDEwKSk7XG4gICAgICBoZWFkZXJbMl0gPSAoKG5ld19leGlmLmxlbmd0aCArIDgpID4+PiA4KSAmIDB4RkY7XG4gICAgICBoZWFkZXJbM10gPSAobmV3X2V4aWYubGVuZ3RoICsgOCkgJiAweEZGO1xuXG4gICAgICBzdG9wX3NlYXJjaCA9IHRydWU7XG4gICAgICByZXR1cm4gWyBoZWFkZXIsIG5ld19leGlmIF07XG4gICAgfVxuICB9KTtcbn07XG5cblxuLy8gSW5zZXJ0cyBhIGN1c3RvbSBjb21tZW50IG1hcmtlciBzZWdtZW50IGludG8gSlBFRyBmaWxlLlxuLy9cbi8vIElucHV0OlxuLy8gIC0ganBlZ19iaW46IFVpbnQ4QXJyYXkgLSBqcGVnIGZpbGVcbi8vICAtIGNvbW1lbnQ6ICBTdHJpbmdcbi8vXG4vLyBDb21tZW50IGlzIGluc2VydGVkIGFmdGVyIGZpcnN0IHR3byBieXRlcyAoRkZEOCwgU09JKS5cbi8vXG4vLyBJZiBKRklGIChBUFAwKSBtYXJrZXIgZXhpc3RzIGltbWVkaWF0ZWx5IGFmdGVyIFNPSSAoYXMgbWFuZGF0ZWQgYnkgdGhlIEpGSUZcbi8vIHNwZWMpLCB3ZSBpbnNlcnQgY29tbWVudCBhZnRlciBpdCBpbnN0ZWFkLlxuLy9cbm1vZHVsZS5leHBvcnRzLmpwZWdfYWRkX2NvbW1lbnQgPSBmdW5jdGlvbiAoanBlZ19iaW4sIGNvbW1lbnQpIHtcbiAgdmFyIGNvbW1lbnRfaW5zZXJ0ZWQgPSBmYWxzZSwgc2VnbWVudF9jb3VudCA9IDA7XG5cbiAgcmV0dXJuIG1vZHVsZS5leHBvcnRzLmpwZWdfc2VnbWVudHNfZmlsdGVyKGpwZWdfYmluLCBmdW5jdGlvbiAoc2VnbWVudCkge1xuICAgIHNlZ21lbnRfY291bnQrKztcbiAgICBpZiAoc2VnbWVudF9jb3VudCA9PT0gMSAmJiBzZWdtZW50LmNvZGUgPT09IDB4RDggLyogU09JICAqLykgcmV0dXJuO1xuICAgIGlmIChzZWdtZW50X2NvdW50ID09PSAyICYmIHNlZ21lbnQuY29kZSA9PT0gMHhFMCAvKiBBUFAwICovKSByZXR1cm47XG5cbiAgICBpZiAoY29tbWVudF9pbnNlcnRlZCkgcmV0dXJuO1xuICAgIGNvbW1lbnQgPSB1dGY4X2VuY29kZShjb21tZW50KTtcblxuICAgIC8vIGNvbW1lbnQgc2VnbWVudFxuICAgIHZhciBjc2VnbWVudCA9IG5ldyBVaW50OEFycmF5KDUgKyBjb21tZW50Lmxlbmd0aCk7XG4gICAgdmFyIG9mZnNldCA9IDA7XG5cbiAgICBjc2VnbWVudFtvZmZzZXQrK10gPSAweEZGO1xuICAgIGNzZWdtZW50W29mZnNldCsrXSA9IDB4RkU7XG4gICAgY3NlZ21lbnRbb2Zmc2V0KytdID0gKChjb21tZW50Lmxlbmd0aCArIDMpID4+PiA4KSAmIDB4RkY7XG4gICAgY3NlZ21lbnRbb2Zmc2V0KytdID0gKGNvbW1lbnQubGVuZ3RoICsgMykgJiAweEZGO1xuXG4gICAgY29tbWVudC5zcGxpdCgnJykuZm9yRWFjaChmdW5jdGlvbiAoYykge1xuICAgICAgY3NlZ21lbnRbb2Zmc2V0KytdID0gYy5jaGFyQ29kZUF0KDApICYgMHhGRjtcbiAgICB9KTtcblxuICAgIGNzZWdtZW50W29mZnNldCsrXSA9IDA7XG4gICAgY29tbWVudF9pbnNlcnRlZCA9IHRydWU7XG5cbiAgICByZXR1cm4gWyBjc2VnbWVudCwganBlZ19iaW4uc3ViYXJyYXkoc2VnbWVudC5vZmZzZXQsIHNlZ21lbnQub2Zmc2V0ICsgc2VnbWVudC5sZW5ndGgpIF07XG4gIH0pO1xufTtcbn0pO1xuXG5mdW5jdGlvbiBqcGVnX3BhdGNoX2V4aWYoZW52KSB7XG4gIHJldHVybiB0aGlzLl9nZXRVaW50OEFycmF5KGVudi5ibG9iKS50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgZW52LmlzX2pwZWcgPSBpbWFnZV90cmF2ZXJzZS5pc19qcGVnKGRhdGEpO1xuXG4gICAgaWYgKCFlbnYuaXNfanBlZykgcmV0dXJuIFByb21pc2UucmVzb2x2ZShlbnYpO1xuXG4gICAgZW52Lm9yaWdfYmxvYiA9IGVudi5ibG9iO1xuXG4gICAgdHJ5IHtcbiAgICAgIHZhciBleGlmX2lzX2JpZ19lbmRpYW4sIG9yaWVudGF0aW9uX29mZnNldDtcblxuICAgICAgLyogZXNsaW50LWRpc2FibGUgY29uc2lzdGVudC1yZXR1cm4gKi9cbiAgICAgIGltYWdlX3RyYXZlcnNlLmpwZWdfZXhpZl90YWdzX2VhY2goZGF0YSwgZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgICAgIGlmIChlbnRyeS5pZmQgPT09IDAgJiYgZW50cnkudGFnID09PSAweDExMiAmJiBBcnJheS5pc0FycmF5KGVudHJ5LnZhbHVlKSkge1xuICAgICAgICAgIGVudi5vcmllbnRhdGlvbiAgICA9IGVudHJ5LnZhbHVlWzBdIHx8IDE7XG4gICAgICAgICAgZXhpZl9pc19iaWdfZW5kaWFuID0gZW50cnkuaXNfYmlnX2VuZGlhbjtcbiAgICAgICAgICBvcmllbnRhdGlvbl9vZmZzZXQgPSBlbnRyeS5kYXRhX29mZnNldDtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAob3JpZW50YXRpb25fb2Zmc2V0KSB7XG4gICAgICAgIHZhciBvcmllbnRhdGlvbl9wYXRjaCA9IGV4aWZfaXNfYmlnX2VuZGlhbiA/XG4gICAgICAgICAgbmV3IFVpbnQ4QXJyYXkoWyAwLCAxIF0pIDpcbiAgICAgICAgICBuZXcgVWludDhBcnJheShbIDEsIDAgXSk7XG5cbiAgICAgICAgZW52LmJsb2IgPSBuZXcgQmxvYihbXG4gICAgICAgICAgZGF0YS5zbGljZSgwLCBvcmllbnRhdGlvbl9vZmZzZXQpLFxuICAgICAgICAgIG9yaWVudGF0aW9uX3BhdGNoLFxuICAgICAgICAgIGRhdGEuc2xpY2Uob3JpZW50YXRpb25fb2Zmc2V0ICsgMilcbiAgICAgICAgXSwgeyB0eXBlOiAnaW1hZ2UvanBlZycgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoXykge31cblxuICAgIHJldHVybiBlbnY7XG4gIH0pO1xufVxuXG5cbmZ1bmN0aW9uIGpwZWdfcm90YXRlX2NhbnZhcyhlbnYpIHtcbiAgaWYgKCFlbnYuaXNfanBlZykgcmV0dXJuIFByb21pc2UucmVzb2x2ZShlbnYpO1xuXG4gIHZhciBvcmllbnRhdGlvbiA9IGVudi5vcmllbnRhdGlvbiAtIDE7XG4gIGlmICghb3JpZW50YXRpb24pIHJldHVybiBQcm9taXNlLnJlc29sdmUoZW52KTtcblxuICB2YXIgY2FudmFzO1xuXG4gIGlmIChvcmllbnRhdGlvbiAmIDQpIHtcbiAgICBjYW52YXMgPSB0aGlzLnBpY2Eub3B0aW9ucy5jcmVhdGVDYW52YXMoZW52Lm91dF9jYW52YXMuaGVpZ2h0LCBlbnYub3V0X2NhbnZhcy53aWR0aCk7XG4gIH0gZWxzZSB7XG4gICAgY2FudmFzID0gdGhpcy5waWNhLm9wdGlvbnMuY3JlYXRlQ2FudmFzKGVudi5vdXRfY2FudmFzLndpZHRoLCBlbnYub3V0X2NhbnZhcy5oZWlnaHQpO1xuICB9XG5cbiAgdmFyIGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuXG4gIGN0eC5zYXZlKCk7XG5cbiAgaWYgKG9yaWVudGF0aW9uICYgMSkgY3R4LnRyYW5zZm9ybSgtMSwgMCwgMCwgMSwgY2FudmFzLndpZHRoLCAwKTtcbiAgaWYgKG9yaWVudGF0aW9uICYgMikgY3R4LnRyYW5zZm9ybSgtMSwgMCwgMCwgLTEsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7XG4gIGlmIChvcmllbnRhdGlvbiAmIDQpIGN0eC50cmFuc2Zvcm0oMCwgMSwgMSwgMCwgMCwgMCk7XG5cbiAgY3R4LmRyYXdJbWFnZShlbnYub3V0X2NhbnZhcywgMCwgMCk7XG4gIGN0eC5yZXN0b3JlKCk7XG5cbiAgLy8gU2FmYXJpIDEyIHdvcmthcm91bmRcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVjYS9waWNhL2lzc3Vlcy8xOTlcbiAgZW52Lm91dF9jYW52YXMud2lkdGggPSBlbnYub3V0X2NhbnZhcy5oZWlnaHQgPSAwO1xuXG4gIGVudi5vdXRfY2FudmFzID0gY2FudmFzO1xuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUoZW52KTtcbn1cblxuXG5mdW5jdGlvbiBqcGVnX2F0dGFjaF9vcmlnX3NlZ21lbnRzKGVudikge1xuICBpZiAoIWVudi5pc19qcGVnKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGVudik7XG5cbiAgcmV0dXJuIFByb21pc2UuYWxsKFtcbiAgICB0aGlzLl9nZXRVaW50OEFycmF5KGVudi5ibG9iKSxcbiAgICB0aGlzLl9nZXRVaW50OEFycmF5KGVudi5vdXRfYmxvYilcbiAgXSkudGhlbihmdW5jdGlvbiAocmVzKSB7XG4gICAgdmFyIGRhdGEgPSByZXNbMF07XG4gICAgdmFyIGRhdGFfb3V0ID0gcmVzWzFdO1xuXG4gICAgaWYgKCFpbWFnZV90cmF2ZXJzZS5pc19qcGVnKGRhdGEpKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGVudik7XG5cbiAgICB2YXIgc2VnbWVudHMgPSBbXTtcblxuICAgIGltYWdlX3RyYXZlcnNlLmpwZWdfc2VnbWVudHNfZWFjaChkYXRhLCBmdW5jdGlvbiAoc2VnbWVudCkge1xuICAgICAgaWYgKHNlZ21lbnQuY29kZSA9PT0gMHhEQSAvKiBTT1MgKi8pIHJldHVybiBmYWxzZTtcbiAgICAgIHNlZ21lbnRzLnB1c2goc2VnbWVudCk7XG4gICAgfSk7XG5cbiAgICBzZWdtZW50cyA9IHNlZ21lbnRzXG4gICAgICAuZmlsdGVyKGZ1bmN0aW9uIChzZWdtZW50KSB7XG4gICAgICAgIC8vIERyb3AgSUNDX1BST0ZJTEVcbiAgICAgICAgLy9cbiAgICAgICAgaWYgKHNlZ21lbnQuY29kZSA9PT0gMHhFMikgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIC8vIEtlZXAgYWxsIEFQUG4gc2VnbWVudHMgZXhjbHVkaW5nIEFQUDIgKElDQ19QUk9GSUxFKSxcbiAgICAgICAgLy8gcmVtb3ZlIG90aGVycyBiZWNhdXNlIG1vc3Qgb2YgdGhlbSBkZXBlbmQgb24gaW1hZ2UgZGF0YSAoRENUIGFuZCBzdWNoKS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gQVBQMCAtIEpGSUYsIEFQUDEgLSBFeGlmLCB0aGUgcmVzdCBhcmUgcGhvdG9zaG9wIG1ldGFkYXRhIGFuZCBzdWNoXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFNlZSBmdWxsIGxpc3QgYXQgaHR0cHM6Ly93d3cudzMub3JnL0dyYXBoaWNzL0pQRUcvaXR1LXQ4MS5wZGYgKHRhYmxlIEIuMSBvbiBwYWdlIDMyKVxuICAgICAgICAvL1xuICAgICAgICBpZiAoc2VnbWVudC5jb2RlID49IDB4RTAgJiYgc2VnbWVudC5jb2RlIDwgMHhGMCkgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgLy8gS2VlcCBjb21tZW50c1xuICAgICAgICAvL1xuICAgICAgICBpZiAoc2VnbWVudC5jb2RlID09PSAweEZFKSByZXR1cm4gdHJ1ZTtcblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9KVxuICAgICAgLm1hcChmdW5jdGlvbiAoc2VnbWVudCkge1xuICAgICAgICByZXR1cm4gZGF0YS5zbGljZShzZWdtZW50Lm9mZnNldCwgc2VnbWVudC5vZmZzZXQgKyBzZWdtZW50Lmxlbmd0aCk7XG4gICAgICB9KTtcblxuICAgIGVudi5vdXRfYmxvYiA9IG5ldyBCbG9iKFxuICAgICAgLy8gaW50ZW50aW9uYWxseSBvbWl0dGluZyBleHBlY3RlZCBKRklGIHNlZ21lbnQgKG9mZnNldCAyIHRvIDIwKVxuICAgICAgWyBkYXRhX291dC5zbGljZSgwLCAyKSBdLmNvbmNhdChzZWdtZW50cykuY29uY2F0KFsgZGF0YV9vdXQuc2xpY2UoMjApIF0pLFxuICAgICAgeyB0eXBlOiAnaW1hZ2UvanBlZycgfVxuICAgICk7XG5cbiAgICByZXR1cm4gZW52O1xuICB9KTtcbn1cblxuXG5mdW5jdGlvbiBhc3NpZ24ocmVkdWNlcikge1xuICByZWR1Y2VyLmJlZm9yZSgnX2Jsb2JfdG9faW1hZ2UnLCBqcGVnX3BhdGNoX2V4aWYpO1xuICByZWR1Y2VyLmFmdGVyKCdfdHJhbnNmb3JtJywgICAgICBqcGVnX3JvdGF0ZV9jYW52YXMpO1xuICByZWR1Y2VyLmFmdGVyKCdfY3JlYXRlX2Jsb2InLCAgICBqcGVnX2F0dGFjaF9vcmlnX3NlZ21lbnRzKTtcbn1cblxuXG52YXIganBlZ19wYXRjaF9leGlmXzEgPSBqcGVnX3BhdGNoX2V4aWY7XG52YXIganBlZ19yb3RhdGVfY2FudmFzXzEgPSBqcGVnX3JvdGF0ZV9jYW52YXM7XG52YXIganBlZ19hdHRhY2hfb3JpZ19zZWdtZW50c18xID0ganBlZ19hdHRhY2hfb3JpZ19zZWdtZW50cztcbnZhciBhc3NpZ25fMSA9IGFzc2lnbjtcblxudmFyIGpwZWdfcGx1Z2lucyA9IHtcblx0anBlZ19wYXRjaF9leGlmOiBqcGVnX3BhdGNoX2V4aWZfMSxcblx0anBlZ19yb3RhdGVfY2FudmFzOiBqcGVnX3JvdGF0ZV9jYW52YXNfMSxcblx0anBlZ19hdHRhY2hfb3JpZ19zZWdtZW50czoganBlZ19hdHRhY2hfb3JpZ19zZWdtZW50c18xLFxuXHRhc3NpZ246IGFzc2lnbl8xXG59O1xuXG5mdW5jdGlvbiBJbWFnZUJsb2JSZWR1Y2Uob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgSW1hZ2VCbG9iUmVkdWNlKSkgcmV0dXJuIG5ldyBJbWFnZUJsb2JSZWR1Y2Uob3B0aW9ucyk7XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgdGhpcy5waWNhID0gb3B0aW9ucy5waWNhIHx8IHBpY2Eoe30pO1xuICB0aGlzLmluaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgdGhpcy51dGlscyA9IHV0aWxzO1xufVxuXG5cbkltYWdlQmxvYlJlZHVjZS5wcm90b3R5cGUudXNlID0gZnVuY3Rpb24gKHBsdWdpbiAvKiwgcGFyYW1zLCAuLi4gKi8pIHtcbiAgdmFyIGFyZ3MgPSBbIHRoaXMgXS5jb25jYXQoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7XG4gIHBsdWdpbi5hcHBseShwbHVnaW4sIGFyZ3MpO1xuICByZXR1cm4gdGhpcztcbn07XG5cblxuSW1hZ2VCbG9iUmVkdWNlLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLnVzZShqcGVnX3BsdWdpbnMuYXNzaWduKTtcbn07XG5cblxuSW1hZ2VCbG9iUmVkdWNlLnByb3RvdHlwZS50b0Jsb2IgPSBmdW5jdGlvbiAoYmxvYiwgb3B0aW9ucykge1xuICB2YXIgb3B0cyA9IHV0aWxzLmFzc2lnbih7IG1heDogSW5maW5pdHkgfSwgb3B0aW9ucyk7XG4gIHZhciBlbnYgPSB7XG4gICAgYmxvYjogYmxvYixcbiAgICBvcHRzOiBvcHRzXG4gIH07XG5cbiAgaWYgKCF0aGlzLmluaXRpYWxpemVkKSB7XG4gICAgdGhpcy5pbml0KCk7XG4gICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG4gIH1cblxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGVudilcbiAgICAudGhlbih0aGlzLl9ibG9iX3RvX2ltYWdlKVxuICAgIC50aGVuKHRoaXMuX2NhbGN1bGF0ZV9zaXplKVxuICAgIC50aGVuKHRoaXMuX3RyYW5zZm9ybSlcbiAgICAudGhlbih0aGlzLl9jbGVhbnVwKVxuICAgIC50aGVuKHRoaXMuX2NyZWF0ZV9ibG9iKVxuICAgIC50aGVuKGZ1bmN0aW9uIChfZW52KSB7XG4gICAgICAvLyBTYWZhcmkgMTIgd29ya2Fyb3VuZFxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVjYS9waWNhL2lzc3Vlcy8xOTlcbiAgICAgIF9lbnYub3V0X2NhbnZhcy53aWR0aCA9IF9lbnYub3V0X2NhbnZhcy5oZWlnaHQgPSAwO1xuXG4gICAgICByZXR1cm4gX2Vudi5vdXRfYmxvYjtcbiAgICB9KTtcbn07XG5cblxuSW1hZ2VCbG9iUmVkdWNlLnByb3RvdHlwZS50b0NhbnZhcyA9IGZ1bmN0aW9uIChibG9iLCBvcHRpb25zKSB7XG4gIHZhciBvcHRzID0gdXRpbHMuYXNzaWduKHsgbWF4OiBJbmZpbml0eSB9LCBvcHRpb25zKTtcbiAgdmFyIGVudiA9IHtcbiAgICBibG9iOiBibG9iLFxuICAgIG9wdHM6IG9wdHNcbiAgfTtcblxuICBpZiAoIXRoaXMuaW5pdGlhbGl6ZWQpIHtcbiAgICB0aGlzLmluaXQoKTtcbiAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUoZW52KVxuICAgIC50aGVuKHRoaXMuX2Jsb2JfdG9faW1hZ2UpXG4gICAgLnRoZW4odGhpcy5fY2FsY3VsYXRlX3NpemUpXG4gICAgLnRoZW4odGhpcy5fdHJhbnNmb3JtKVxuICAgIC50aGVuKHRoaXMuX2NsZWFudXApXG4gICAgLnRoZW4oZnVuY3Rpb24gKF9lbnYpIHsgcmV0dXJuIF9lbnYub3V0X2NhbnZhczsgfSk7XG59O1xuXG5cbkltYWdlQmxvYlJlZHVjZS5wcm90b3R5cGUuYmVmb3JlID0gZnVuY3Rpb24gKG1ldGhvZF9uYW1lLCBmbikge1xuICBpZiAoIXRoaXNbbWV0aG9kX25hbWVdKSB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBcIicgKyBtZXRob2RfbmFtZSArICdcIiBkb2VzIG5vdCBleGlzdCcpO1xuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnQgXCJmblwiLCBmdW5jdGlvbiBleHBlY3RlZCcpO1xuXG4gIHZhciBvbGRfZm4gPSB0aGlzW21ldGhvZF9uYW1lXTtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gIHRoaXNbbWV0aG9kX25hbWVdID0gZnVuY3Rpb24gKGVudikge1xuICAgIHJldHVybiBmbi5jYWxsKHNlbGYsIGVudikudGhlbihmdW5jdGlvbiAoX2Vudikge1xuICAgICAgcmV0dXJuIG9sZF9mbi5jYWxsKHNlbGYsIF9lbnYpO1xuICAgIH0pO1xuICB9O1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuXG5JbWFnZUJsb2JSZWR1Y2UucHJvdG90eXBlLmFmdGVyID0gZnVuY3Rpb24gKG1ldGhvZF9uYW1lLCBmbikge1xuICBpZiAoIXRoaXNbbWV0aG9kX25hbWVdKSB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBcIicgKyBtZXRob2RfbmFtZSArICdcIiBkb2VzIG5vdCBleGlzdCcpO1xuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnQgXCJmblwiLCBmdW5jdGlvbiBleHBlY3RlZCcpO1xuXG4gIHZhciBvbGRfZm4gPSB0aGlzW21ldGhvZF9uYW1lXTtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gIHRoaXNbbWV0aG9kX25hbWVdID0gZnVuY3Rpb24gKGVudikge1xuICAgIHJldHVybiBvbGRfZm4uY2FsbChzZWxmLCBlbnYpLnRoZW4oZnVuY3Rpb24gKF9lbnYpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHNlbGYsIF9lbnYpO1xuICAgIH0pO1xuICB9O1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuXG5JbWFnZUJsb2JSZWR1Y2UucHJvdG90eXBlLl9ibG9iX3RvX2ltYWdlID0gZnVuY3Rpb24gKGVudikge1xuICB2YXIgVVJMID0gd2luZG93LlVSTCB8fCB3aW5kb3cud2Via2l0VVJMIHx8IHdpbmRvdy5tb3pVUkwgfHwgd2luZG93Lm1zVVJMO1xuXG4gIGVudi5pbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO1xuICBlbnYuaW1hZ2VfdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChlbnYuYmxvYik7XG4gIGVudi5pbWFnZS5zcmMgPSBlbnYuaW1hZ2VfdXJsO1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgZW52LmltYWdlLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7IHJlamVjdChuZXcgRXJyb3IoJ0ltYWdlQmxvYlJlZHVjZTogZmFpbGVkIHRvIGNyZWF0ZSBJbWFnZSgpIGZyb20gYmxvYicpKTsgfTtcbiAgICBlbnYuaW1hZ2Uub25sb2FkID0gZnVuY3Rpb24gKCkgeyByZXNvbHZlKGVudik7IH07XG4gIH0pO1xufTtcblxuXG5JbWFnZUJsb2JSZWR1Y2UucHJvdG90eXBlLl9jYWxjdWxhdGVfc2l6ZSA9IGZ1bmN0aW9uIChlbnYpIHtcbiAgLy9cbiAgLy8gTm90ZSwgaWYgeW91ciBuZWVkIG5vdCBcInN5bW1ldHJpY1wiIHJlc2l6ZSBsb2dpYywgeW91IE1VU1QgY2hlY2tcbiAgLy8gYGVudi5vcmllbnRhdGlvbmAgKHNldCBieSBwbHVnaW5zKSBhbmQgc3dhcCB3aWR0aC9oZWlnaHQgYXBwcm9wcmlhdGVseS5cbiAgLy9cbiAgdmFyIHNjYWxlX2ZhY3RvciA9IGVudi5vcHRzLm1heCAvIE1hdGgubWF4KGVudi5pbWFnZS53aWR0aCwgZW52LmltYWdlLmhlaWdodCk7XG5cbiAgaWYgKHNjYWxlX2ZhY3RvciA+IDEpIHNjYWxlX2ZhY3RvciA9IDE7XG5cbiAgZW52LnRyYW5zZm9ybV93aWR0aCA9IE1hdGgubWF4KE1hdGgucm91bmQoZW52LmltYWdlLndpZHRoICogc2NhbGVfZmFjdG9yKSwgMSk7XG4gIGVudi50cmFuc2Zvcm1faGVpZ2h0ID0gTWF0aC5tYXgoTWF0aC5yb3VuZChlbnYuaW1hZ2UuaGVpZ2h0ICogc2NhbGVfZmFjdG9yKSwgMSk7XG5cbiAgLy8gSW5mbyBmb3IgdXNlciBwbHVnaW5zLCB0byBjaGVjayBpZiBzY2FsaW5nIGFwcGxpZWRcbiAgZW52LnNjYWxlX2ZhY3RvciA9IHNjYWxlX2ZhY3RvcjtcblxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGVudik7XG59O1xuXG5cbkltYWdlQmxvYlJlZHVjZS5wcm90b3R5cGUuX3RyYW5zZm9ybSA9IGZ1bmN0aW9uIChlbnYpIHtcbiAgZW52Lm91dF9jYW52YXMgPSB0aGlzLnBpY2Eub3B0aW9ucy5jcmVhdGVDYW52YXMoZW52LnRyYW5zZm9ybV93aWR0aCwgZW52LnRyYW5zZm9ybV9oZWlnaHQpO1xuXG4gIC8vIERpbSBlbnYgdGVtcG9yYXJ5IHZhcnMgdG8gcHJvaGliaXQgdXNlIGFuZCBhdm9pZCBjb25mdXNpb24gd2hlbiBvcmllbnRhdGlvblxuICAvLyBjaGFuZ2VkLiBZb3Ugc2hvdWxkIHRha2UgcmVhbCBzaXplIGZyb20gY2FudmFzLlxuICBlbnYudHJhbnNmb3JtX3dpZHRoID0gbnVsbDtcbiAgZW52LnRyYW5zZm9ybV9oZWlnaHQgPSBudWxsO1xuXG4gIC8vIEJ5IGRlZmF1bHQgdXNlIGFscGhhIGZvciBwbmcgb25seVxuICB2YXIgcGljYV9vcHRzID0geyBhbHBoYTogZW52LmJsb2IudHlwZSA9PT0gJ2ltYWdlL3BuZycgfTtcblxuICAvLyBFeHRyYWN0IHBpY2Egb3B0aW9ucyBpZiBiZWVuIHBhc3NlZFxuICB0aGlzLnV0aWxzLmFzc2lnbihwaWNhX29wdHMsIHRoaXMudXRpbHMucGlja19waWNhX3Jlc2l6ZV9vcHRpb25zKGVudi5vcHRzKSk7XG5cbiAgcmV0dXJuIHRoaXMucGljYVxuICAgIC5yZXNpemUoZW52LmltYWdlLCBlbnYub3V0X2NhbnZhcywgcGljYV9vcHRzKVxuICAgIC50aGVuKGZ1bmN0aW9uICgpIHsgcmV0dXJuIGVudjsgfSk7XG59O1xuXG5cbkltYWdlQmxvYlJlZHVjZS5wcm90b3R5cGUuX2NsZWFudXAgPSBmdW5jdGlvbiAoZW52KSB7XG4gIGVudi5pbWFnZS5zcmMgPSAnJztcbiAgZW52LmltYWdlID0gbnVsbDtcblxuICB2YXIgVVJMID0gd2luZG93LlVSTCB8fCB3aW5kb3cud2Via2l0VVJMIHx8IHdpbmRvdy5tb3pVUkwgfHwgd2luZG93Lm1zVVJMO1xuICBpZiAoVVJMLnJldm9rZU9iamVjdFVSTCkgVVJMLnJldm9rZU9iamVjdFVSTChlbnYuaW1hZ2VfdXJsKTtcblxuICBlbnYuaW1hZ2VfdXJsID0gbnVsbDtcblxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGVudik7XG59O1xuXG5cbkltYWdlQmxvYlJlZHVjZS5wcm90b3R5cGUuX2NyZWF0ZV9ibG9iID0gZnVuY3Rpb24gKGVudikge1xuICByZXR1cm4gdGhpcy5waWNhLnRvQmxvYihlbnYub3V0X2NhbnZhcywgZW52LmJsb2IudHlwZSlcbiAgICAudGhlbihmdW5jdGlvbiAoYmxvYikge1xuICAgICAgZW52Lm91dF9ibG9iID0gYmxvYjtcbiAgICAgIHJldHVybiBlbnY7XG4gICAgfSk7XG59O1xuXG5cbkltYWdlQmxvYlJlZHVjZS5wcm90b3R5cGUuX2dldFVpbnQ4QXJyYXkgPSBmdW5jdGlvbiAoYmxvYikge1xuICBpZiAoYmxvYi5hcnJheUJ1ZmZlcikge1xuICAgIHJldHVybiBibG9iLmFycmF5QnVmZmVyKCkudGhlbihmdW5jdGlvbiAoYnVmKSB7XG4gICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYnVmKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgdmFyIGZyID0gbmV3IEZpbGVSZWFkZXIoKTtcblxuICAgIGZyLnJlYWRBc0FycmF5QnVmZmVyKGJsb2IpO1xuXG4gICAgZnIub25sb2FkID0gZnVuY3Rpb24gKCkgeyByZXNvbHZlKG5ldyBVaW50OEFycmF5KGZyLnJlc3VsdCkpOyB9O1xuICAgIGZyLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZWplY3QobmV3IEVycm9yKCdJbWFnZUJsb2JSZWR1Y2U6IGZhaWxlZCB0byBsb2FkIGRhdGEgZnJvbSBpbnB1dCBibG9iJykpO1xuICAgICAgZnIuYWJvcnQoKTtcbiAgICB9O1xuICAgIGZyLm9uYWJvcnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZWplY3QobmV3IEVycm9yKCdJbWFnZUJsb2JSZWR1Y2U6IGZhaWxlZCB0byBsb2FkIGRhdGEgZnJvbSBpbnB1dCBibG9iIChhYm9ydGVkKScpKTtcbiAgICB9O1xuICB9KTtcbn07XG5cblxuSW1hZ2VCbG9iUmVkdWNlLnBpY2EgPSBwaWNhO1xuXG52YXIgaW1hZ2VCbG9iUmVkdWNlID0gSW1hZ2VCbG9iUmVkdWNlO1xuXG5leHBvcnQgZGVmYXVsdCBpbWFnZUJsb2JSZWR1Y2U7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../../node_modules/image-blob-reduce/dist/image-blob-reduce.esm.mjs\n");
|
|
28
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n\n/*! image-blob-reduce 3.0.1 https://github.com/nodeca/image-blob-reduce @license MIT */\nvar assign$1 = function assign(to) {\n var from;\n\n for (var s = 1; s < arguments.length; s++) {\n from = Object(arguments[s]);\n\n for (var key in from) {\n if (Object.prototype.hasOwnProperty.call(from, key)) to[key] = from[key];\n }\n }\n\n return to;\n};\n\n\nfunction pick(from, props) {\n var to = {};\n\n props.forEach(function (key) {\n if (Object.prototype.hasOwnProperty.call(from, key)) to[key] = from[key];\n });\n\n return to;\n}\n\n\nfunction pick_pica_resize_options(from) {\n return pick(from, [\n 'alpha',\n 'unsharpAmount',\n 'unsharpRadius',\n 'unsharpThreshold',\n 'cancelToken'\n ]);\n}\n\n\nvar pick_1 = pick;\nvar pick_pica_resize_options_1 = pick_pica_resize_options;\n\nvar utils = {\n\tassign: assign$1,\n\tpick: pick_1,\n\tpick_pica_resize_options: pick_pica_resize_options_1\n};\n\nfunction createCommonjsModule(fn) {\n var module = { exports: {} };\n\treturn fn(module, module.exports), module.exports;\n}\n\nfunction commonjsRequire (target) {\n\tthrow new Error('Could not dynamically require \"' + target + '\". Please configure the dynamicRequireTargets option of @rollup/plugin-commonjs appropriately for this require call to behave properly.');\n}\n\n/*!\n\npica\nhttps://github.com/nodeca/pica\n\n*/\n\nvar pica = createCommonjsModule(function (module, exports) {\n(function(f){{module.exports=f();}})(function(){return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof commonjsRequire&&commonjsRequire;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t);}return n[i].exports}for(var u=\"function\"==typeof commonjsRequire&&commonjsRequire,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(_dereq_,module,exports){\n\nvar inherits = _dereq_('inherits');\n\nvar Multimath = _dereq_('multimath');\n\nvar mm_unsharp_mask = _dereq_('./mm_unsharp_mask');\n\nvar mm_resize = _dereq_('./mm_resize');\n\nfunction MathLib(requested_features) {\n var __requested_features = requested_features || [];\n\n var features = {\n js: __requested_features.indexOf('js') >= 0,\n wasm: __requested_features.indexOf('wasm') >= 0\n };\n Multimath.call(this, features);\n this.features = {\n js: features.js,\n wasm: features.wasm && this.has_wasm()\n };\n this.use(mm_unsharp_mask);\n this.use(mm_resize);\n}\n\ninherits(MathLib, Multimath);\n\nMathLib.prototype.resizeAndUnsharp = function resizeAndUnsharp(options, cache) {\n var result = this.resize(options, cache);\n\n if (options.unsharpAmount) {\n this.unsharp_mask(result, options.toWidth, options.toHeight, options.unsharpAmount, options.unsharpRadius, options.unsharpThreshold);\n }\n\n return result;\n};\n\nmodule.exports = MathLib;\n\n},{\"./mm_resize\":4,\"./mm_unsharp_mask\":9,\"inherits\":19,\"multimath\":20}],2:[function(_dereq_,module,exports){\n//var FIXED_FRAC_BITS = 14;\n\nfunction clampTo8(i) {\n return i < 0 ? 0 : i > 255 ? 255 : i;\n} // Convolve image in horizontal directions and transpose output. In theory,\n// transpose allow:\n//\n// - use the same convolver for both passes (this fails due different\n// types of input array and temporary buffer)\n// - making vertical pass by horisonltal lines inprove CPU cache use.\n//\n// But in real life this doesn't work :)\n//\n\n\nfunction convolveHorizontally(src, dest, srcW, srcH, destW, filters) {\n var r, g, b, a;\n var filterPtr, filterShift, filterSize;\n var srcPtr, srcY, destX, filterVal;\n var srcOffset = 0,\n destOffset = 0; // For each row\n\n for (srcY = 0; srcY < srcH; srcY++) {\n filterPtr = 0; // Apply precomputed filters to each destination row point\n\n for (destX = 0; destX < destW; destX++) {\n // Get the filter that determines the current output pixel.\n filterShift = filters[filterPtr++];\n filterSize = filters[filterPtr++];\n srcPtr = srcOffset + filterShift * 4 | 0;\n r = g = b = a = 0; // Apply the filter to the row to get the destination pixel r, g, b, a\n\n for (; filterSize > 0; filterSize--) {\n filterVal = filters[filterPtr++]; // Use reverse order to workaround deopts in old v8 (node v.10)\n // Big thanks to @mraleph (Vyacheslav Egorov) for the tip.\n\n a = a + filterVal * src[srcPtr + 3] | 0;\n b = b + filterVal * src[srcPtr + 2] | 0;\n g = g + filterVal * src[srcPtr + 1] | 0;\n r = r + filterVal * src[srcPtr] | 0;\n srcPtr = srcPtr + 4 | 0;\n } // Bring this value back in range. All of the filter scaling factors\n // are in fixed point with FIXED_FRAC_BITS bits of fractional part.\n //\n // (!) Add 1/2 of value before clamping to get proper rounding. In other\n // case brightness loss will be noticeable if you resize image with white\n // border and place it on white background.\n //\n\n\n dest[destOffset + 3] = clampTo8(a + (1 << 13) >> 14\n /*FIXED_FRAC_BITS*/\n );\n dest[destOffset + 2] = clampTo8(b + (1 << 13) >> 14\n /*FIXED_FRAC_BITS*/\n );\n dest[destOffset + 1] = clampTo8(g + (1 << 13) >> 14\n /*FIXED_FRAC_BITS*/\n );\n dest[destOffset] = clampTo8(r + (1 << 13) >> 14\n /*FIXED_FRAC_BITS*/\n );\n destOffset = destOffset + srcH * 4 | 0;\n }\n\n destOffset = (srcY + 1) * 4 | 0;\n srcOffset = (srcY + 1) * srcW * 4 | 0;\n }\n} // Technically, convolvers are the same. But input array and temporary\n// buffer can be of different type (especially, in old browsers). So,\n// keep code in separate functions to avoid deoptimizations & speed loss.\n\n\nfunction convolveVertically(src, dest, srcW, srcH, destW, filters) {\n var r, g, b, a;\n var filterPtr, filterShift, filterSize;\n var srcPtr, srcY, destX, filterVal;\n var srcOffset = 0,\n destOffset = 0; // For each row\n\n for (srcY = 0; srcY < srcH; srcY++) {\n filterPtr = 0; // Apply precomputed filters to each destination row point\n\n for (destX = 0; destX < destW; destX++) {\n // Get the filter that determines the current output pixel.\n filterShift = filters[filterPtr++];\n filterSize = filters[filterPtr++];\n srcPtr = srcOffset + filterShift * 4 | 0;\n r = g = b = a = 0; // Apply the filter to the row to get the destination pixel r, g, b, a\n\n for (; filterSize > 0; filterSize--) {\n filterVal = filters[filterPtr++]; // Use reverse order to workaround deopts in old v8 (node v.10)\n // Big thanks to @mraleph (Vyacheslav Egorov) for the tip.\n\n a = a + filterVal * src[srcPtr + 3] | 0;\n b = b + filterVal * src[srcPtr + 2] | 0;\n g = g + filterVal * src[srcPtr + 1] | 0;\n r = r + filterVal * src[srcPtr] | 0;\n srcPtr = srcPtr + 4 | 0;\n } // Bring this value back in range. All of the filter scaling factors\n // are in fixed point with FIXED_FRAC_BITS bits of fractional part.\n //\n // (!) Add 1/2 of value before clamping to get proper rounding. In other\n // case brightness loss will be noticeable if you resize image with white\n // border and place it on white background.\n //\n\n\n dest[destOffset + 3] = clampTo8(a + (1 << 13) >> 14\n /*FIXED_FRAC_BITS*/\n );\n dest[destOffset + 2] = clampTo8(b + (1 << 13) >> 14\n /*FIXED_FRAC_BITS*/\n );\n dest[destOffset + 1] = clampTo8(g + (1 << 13) >> 14\n /*FIXED_FRAC_BITS*/\n );\n dest[destOffset] = clampTo8(r + (1 << 13) >> 14\n /*FIXED_FRAC_BITS*/\n );\n destOffset = destOffset + srcH * 4 | 0;\n }\n\n destOffset = (srcY + 1) * 4 | 0;\n srcOffset = (srcY + 1) * srcW * 4 | 0;\n }\n}\n\nmodule.exports = {\n convolveHorizontally: convolveHorizontally,\n convolveVertically: convolveVertically\n};\n\n},{}],3:[function(_dereq_,module,exports){\n/* eslint-disable max-len */\n\nmodule.exports = 'AGFzbQEAAAAADAZkeWxpbmsAAAAAAAEXA2AAAGAGf39/f39/AGAHf39/f39/fwACDwEDZW52Bm1lbW9yeQIAAAMEAwABAgYGAX8AQQALB1cFEV9fd2FzbV9jYWxsX2N0b3JzAAAIY29udm9sdmUAAQpjb252b2x2ZUhWAAIMX19kc29faGFuZGxlAwAYX193YXNtX2FwcGx5X2RhdGFfcmVsb2NzAAAK7AMDAwABC8YDAQ9/AkAgA0UNACAERQ0AA0AgDCENQQAhE0EAIQcDQCAHQQJqIQYCfyAHQQF0IAVqIgcuAQIiFEUEQEGAwAAhCEGAwAAhCUGAwAAhCkGAwAAhCyAGDAELIBIgBy4BAGohCEEAIQsgFCEHQQAhDiAGIQlBACEPQQAhEANAIAUgCUEBdGouAQAiESAAIAhBAnRqKAIAIgpBGHZsIBBqIRAgCkH/AXEgEWwgC2ohCyAKQRB2Qf8BcSARbCAPaiEPIApBCHZB/wFxIBFsIA5qIQ4gCEEBaiEIIAlBAWohCSAHQQFrIgcNAAsgC0GAQGshCCAOQYBAayEJIA9BgEBrIQogEEGAQGshCyAGIBRqCyEHIAEgDUECdGogCUEOdSIGQf8BIAZB/wFIGyIGQQAgBkEAShtBCHRBgP4DcSAKQQ51IgZB/wEgBkH/AUgbIgZBACAGQQBKG0EQdEGAgPwHcSALQQ51IgZB/wEgBkH/AUgbIgZBACAGQQBKG0EYdHJyIAhBDnUiBkH/ASAGQf8BSBsiBkEAIAZBAEobcjYCACADIA1qIQ0gE0EBaiITIARHDQALIAxBAWoiDCACbCESIAMgDEcNAAsLCx4AQQAgAiADIAQgBSAAEAEgAkEAIAQgBSAGIAEQAQs=';\n\n},{}],4:[function(_dereq_,module,exports){\n\nmodule.exports = {\n name: 'resize',\n fn: _dereq_('./resize'),\n wasm_fn: _dereq_('./resize_wasm'),\n wasm_src: _dereq_('./convolve_wasm_base64')\n};\n\n},{\"./convolve_wasm_base64\":3,\"./resize\":5,\"./resize_wasm\":8}],5:[function(_dereq_,module,exports){\n\nvar createFilters = _dereq_('./resize_filter_gen');\n\nvar convolveHorizontally = _dereq_('./convolve').convolveHorizontally;\n\nvar convolveVertically = _dereq_('./convolve').convolveVertically;\n\nfunction resetAlpha(dst, width, height) {\n var ptr = 3,\n len = width * height * 4 | 0;\n\n while (ptr < len) {\n dst[ptr] = 0xFF;\n ptr = ptr + 4 | 0;\n }\n}\n\nmodule.exports = function resize(options) {\n var src = options.src;\n var srcW = options.width;\n var srcH = options.height;\n var destW = options.toWidth;\n var destH = options.toHeight;\n var scaleX = options.scaleX || options.toWidth / options.width;\n var scaleY = options.scaleY || options.toHeight / options.height;\n var offsetX = options.offsetX || 0;\n var offsetY = options.offsetY || 0;\n var dest = options.dest || new Uint8Array(destW * destH * 4);\n var quality = typeof options.quality === 'undefined' ? 3 : options.quality;\n var alpha = options.alpha || false;\n var filtersX = createFilters(quality, srcW, destW, scaleX, offsetX),\n filtersY = createFilters(quality, srcH, destH, scaleY, offsetY);\n var tmp = new Uint8Array(destW * srcH * 4); // To use single function we need src & tmp of the same type.\n // But src can be CanvasPixelArray, and tmp - Uint8Array. So, keep\n // vertical and horizontal passes separately to avoid deoptimization.\n\n convolveHorizontally(src, tmp, srcW, srcH, destW, filtersX);\n convolveVertically(tmp, dest, srcH, destW, destH, filtersY); // That's faster than doing checks in convolver.\n // !!! Note, canvas data is not premultipled. We don't need other\n // alpha corrections.\n\n if (!alpha) resetAlpha(dest, destW, destH);\n return dest;\n};\n\n},{\"./convolve\":2,\"./resize_filter_gen\":6}],6:[function(_dereq_,module,exports){\n\nvar FILTER_INFO = _dereq_('./resize_filter_info'); // Precision of fixed FP values\n\n\nvar FIXED_FRAC_BITS = 14;\n\nfunction toFixedPoint(num) {\n return Math.round(num * ((1 << FIXED_FRAC_BITS) - 1));\n}\n\nmodule.exports = function resizeFilterGen(quality, srcSize, destSize, scale, offset) {\n var filterFunction = FILTER_INFO[quality].filter;\n var scaleInverted = 1.0 / scale;\n var scaleClamped = Math.min(1.0, scale); // For upscale\n // Filter window (averaging interval), scaled to src image\n\n var srcWindow = FILTER_INFO[quality].win / scaleClamped;\n var destPixel, srcPixel, srcFirst, srcLast, filterElementSize, floatFilter, fxpFilter, total, pxl, idx, floatVal, filterTotal, filterVal;\n var leftNotEmpty, rightNotEmpty, filterShift, filterSize;\n var maxFilterElementSize = Math.floor((srcWindow + 1) * 2);\n var packedFilter = new Int16Array((maxFilterElementSize + 2) * destSize);\n var packedFilterPtr = 0;\n var slowCopy = !packedFilter.subarray || !packedFilter.set; // For each destination pixel calculate source range and built filter values\n\n for (destPixel = 0; destPixel < destSize; destPixel++) {\n // Scaling should be done relative to central pixel point\n srcPixel = (destPixel + 0.5) * scaleInverted + offset;\n srcFirst = Math.max(0, Math.floor(srcPixel - srcWindow));\n srcLast = Math.min(srcSize - 1, Math.ceil(srcPixel + srcWindow));\n filterElementSize = srcLast - srcFirst + 1;\n floatFilter = new Float32Array(filterElementSize);\n fxpFilter = new Int16Array(filterElementSize);\n total = 0.0; // Fill filter values for calculated range\n\n for (pxl = srcFirst, idx = 0; pxl <= srcLast; pxl++, idx++) {\n floatVal = filterFunction((pxl + 0.5 - srcPixel) * scaleClamped);\n total += floatVal;\n floatFilter[idx] = floatVal;\n } // Normalize filter, convert to fixed point and accumulate conversion error\n\n\n filterTotal = 0;\n\n for (idx = 0; idx < floatFilter.length; idx++) {\n filterVal = floatFilter[idx] / total;\n filterTotal += filterVal;\n fxpFilter[idx] = toFixedPoint(filterVal);\n } // Compensate normalization error, to minimize brightness drift\n\n\n fxpFilter[destSize >> 1] += toFixedPoint(1.0 - filterTotal); //\n // Now pack filter to useable form\n //\n // 1. Trim heading and tailing zero values, and compensate shitf/length\n // 2. Put all to single array in this format:\n //\n // [ pos shift, data length, value1, value2, value3, ... ]\n //\n\n leftNotEmpty = 0;\n\n while (leftNotEmpty < fxpFilter.length && fxpFilter[leftNotEmpty] === 0) {\n leftNotEmpty++;\n }\n\n if (leftNotEmpty < fxpFilter.length) {\n rightNotEmpty = fxpFilter.length - 1;\n\n while (rightNotEmpty > 0 && fxpFilter[rightNotEmpty] === 0) {\n rightNotEmpty--;\n }\n\n filterShift = srcFirst + leftNotEmpty;\n filterSize = rightNotEmpty - leftNotEmpty + 1;\n packedFilter[packedFilterPtr++] = filterShift; // shift\n\n packedFilter[packedFilterPtr++] = filterSize; // size\n\n if (!slowCopy) {\n packedFilter.set(fxpFilter.subarray(leftNotEmpty, rightNotEmpty + 1), packedFilterPtr);\n packedFilterPtr += filterSize;\n } else {\n // fallback for old IE < 11, without subarray/set methods\n for (idx = leftNotEmpty; idx <= rightNotEmpty; idx++) {\n packedFilter[packedFilterPtr++] = fxpFilter[idx];\n }\n }\n } else {\n // zero data, write header only\n packedFilter[packedFilterPtr++] = 0; // shift\n\n packedFilter[packedFilterPtr++] = 0; // size\n }\n }\n\n return packedFilter;\n};\n\n},{\"./resize_filter_info\":7}],7:[function(_dereq_,module,exports){\n\nmodule.exports = [{\n // Nearest neibor (Box)\n win: 0.5,\n filter: function filter(x) {\n return x >= -0.5 && x < 0.5 ? 1.0 : 0.0;\n }\n}, {\n // Hamming\n win: 1.0,\n filter: function filter(x) {\n if (x <= -1.0 || x >= 1.0) {\n return 0.0;\n }\n\n if (x > -1.19209290E-07 && x < 1.19209290E-07) {\n return 1.0;\n }\n\n var xpi = x * Math.PI;\n return Math.sin(xpi) / xpi * (0.54 + 0.46 * Math.cos(xpi / 1.0));\n }\n}, {\n // Lanczos, win = 2\n win: 2.0,\n filter: function filter(x) {\n if (x <= -2.0 || x >= 2.0) {\n return 0.0;\n }\n\n if (x > -1.19209290E-07 && x < 1.19209290E-07) {\n return 1.0;\n }\n\n var xpi = x * Math.PI;\n return Math.sin(xpi) / xpi * Math.sin(xpi / 2.0) / (xpi / 2.0);\n }\n}, {\n // Lanczos, win = 3\n win: 3.0,\n filter: function filter(x) {\n if (x <= -3.0 || x >= 3.0) {\n return 0.0;\n }\n\n if (x > -1.19209290E-07 && x < 1.19209290E-07) {\n return 1.0;\n }\n\n var xpi = x * Math.PI;\n return Math.sin(xpi) / xpi * Math.sin(xpi / 3.0) / (xpi / 3.0);\n }\n}];\n\n},{}],8:[function(_dereq_,module,exports){\n\nvar createFilters = _dereq_('./resize_filter_gen');\n\nfunction resetAlpha(dst, width, height) {\n var ptr = 3,\n len = width * height * 4 | 0;\n\n while (ptr < len) {\n dst[ptr] = 0xFF;\n ptr = ptr + 4 | 0;\n }\n}\n\nfunction asUint8Array(src) {\n return new Uint8Array(src.buffer, 0, src.byteLength);\n}\n\nvar IS_LE = true; // should not crash everything on module load in old browsers\n\ntry {\n IS_LE = new Uint32Array(new Uint8Array([1, 0, 0, 0]).buffer)[0] === 1;\n} catch (__) {}\n\nfunction copyInt16asLE(src, target, target_offset) {\n if (IS_LE) {\n target.set(asUint8Array(src), target_offset);\n return;\n }\n\n for (var ptr = target_offset, i = 0; i < src.length; i++) {\n var data = src[i];\n target[ptr++] = data & 0xFF;\n target[ptr++] = data >> 8 & 0xFF;\n }\n}\n\nmodule.exports = function resize_wasm(options) {\n var src = options.src;\n var srcW = options.width;\n var srcH = options.height;\n var destW = options.toWidth;\n var destH = options.toHeight;\n var scaleX = options.scaleX || options.toWidth / options.width;\n var scaleY = options.scaleY || options.toHeight / options.height;\n var offsetX = options.offsetX || 0.0;\n var offsetY = options.offsetY || 0.0;\n var dest = options.dest || new Uint8Array(destW * destH * 4);\n var quality = typeof options.quality === 'undefined' ? 3 : options.quality;\n var alpha = options.alpha || false;\n var filtersX = createFilters(quality, srcW, destW, scaleX, offsetX),\n filtersY = createFilters(quality, srcH, destH, scaleY, offsetY); // destination is 0 too.\n\n var src_offset = 0; // buffer between convolve passes\n\n var tmp_offset = this.__align(src_offset + Math.max(src.byteLength, dest.byteLength));\n\n var filtersX_offset = this.__align(tmp_offset + srcH * destW * 4);\n\n var filtersY_offset = this.__align(filtersX_offset + filtersX.byteLength);\n\n var alloc_bytes = filtersY_offset + filtersY.byteLength;\n\n var instance = this.__instance('resize', alloc_bytes); //\n // Fill memory block with data to process\n //\n\n\n var mem = new Uint8Array(this.__memory.buffer);\n var mem32 = new Uint32Array(this.__memory.buffer); // 32-bit copy is much faster in chrome\n\n var src32 = new Uint32Array(src.buffer);\n mem32.set(src32); // We should guarantee LE bytes order. Filters are not big, so\n // speed difference is not significant vs direct .set()\n\n copyInt16asLE(filtersX, mem, filtersX_offset);\n copyInt16asLE(filtersY, mem, filtersY_offset); //\n // Now call webassembly method\n // emsdk does method names with '_'\n\n var fn = instance.exports.convolveHV || instance.exports._convolveHV;\n fn(filtersX_offset, filtersY_offset, tmp_offset, srcW, srcH, destW, destH); //\n // Copy data back to typed array\n //\n // 32-bit copy is much faster in chrome\n\n var dest32 = new Uint32Array(dest.buffer);\n dest32.set(new Uint32Array(this.__memory.buffer, 0, destH * destW)); // That's faster than doing checks in convolver.\n // !!! Note, canvas data is not premultipled. We don't need other\n // alpha corrections.\n\n if (!alpha) resetAlpha(dest, destW, destH);\n return dest;\n};\n\n},{\"./resize_filter_gen\":6}],9:[function(_dereq_,module,exports){\n\nmodule.exports = {\n name: 'unsharp_mask',\n fn: _dereq_('./unsharp_mask'),\n wasm_fn: _dereq_('./unsharp_mask_wasm'),\n wasm_src: _dereq_('./unsharp_mask_wasm_base64')\n};\n\n},{\"./unsharp_mask\":10,\"./unsharp_mask_wasm\":11,\"./unsharp_mask_wasm_base64\":12}],10:[function(_dereq_,module,exports){\n\nvar glur_mono16 = _dereq_('glur/mono16');\n\nfunction hsv_v16(img, width, height) {\n var size = width * height;\n var out = new Uint16Array(size);\n var r, g, b, max;\n\n for (var i = 0; i < size; i++) {\n r = img[4 * i];\n g = img[4 * i + 1];\n b = img[4 * i + 2];\n max = r >= g && r >= b ? r : g >= b && g >= r ? g : b;\n out[i] = max << 8;\n }\n\n return out;\n}\n\nmodule.exports = function unsharp(img, width, height, amount, radius, threshold) {\n var v1, v2, vmul;\n var diff, iTimes4;\n\n if (amount === 0 || radius < 0.5) {\n return;\n }\n\n if (radius > 2.0) {\n radius = 2.0;\n }\n\n var brightness = hsv_v16(img, width, height);\n var blured = new Uint16Array(brightness); // copy, because blur modify src\n\n glur_mono16(blured, width, height, radius);\n var amountFp = amount / 100 * 0x1000 + 0.5 | 0;\n var thresholdFp = threshold << 8;\n var size = width * height;\n /* eslint-disable indent */\n\n for (var i = 0; i < size; i++) {\n v1 = brightness[i];\n diff = v1 - blured[i];\n\n if (Math.abs(diff) >= thresholdFp) {\n // add unsharp mask to the brightness channel\n v2 = v1 + (amountFp * diff + 0x800 >> 12); // Both v1 and v2 are within [0.0 .. 255.0] (0000-FF00) range, never going into\n // [255.003 .. 255.996] (FF01-FFFF). This allows to round this value as (x+.5)|0\n // later without overflowing.\n\n v2 = v2 > 0xff00 ? 0xff00 : v2;\n v2 = v2 < 0x0000 ? 0x0000 : v2; // Avoid division by 0. V=0 means rgb(0,0,0), unsharp with unsharpAmount>0 cannot\n // change this value (because diff between colors gets inflated), so no need to verify correctness.\n\n v1 = v1 !== 0 ? v1 : 1; // Multiplying V in HSV model by a constant is equivalent to multiplying each component\n // in RGB by the same constant (same for HSL), see also:\n // https://beesbuzz.biz/code/16-hsv-color-transforms\n\n vmul = (v2 << 12) / v1 | 0; // Result will be in [0..255] range because:\n // - all numbers are positive\n // - r,g,b <= (v1/256)\n // - r,g,b,(v1/256),(v2/256) <= 255\n // So highest this number can get is X*255/X+0.5=255.5 which is < 256 and rounds down.\n\n iTimes4 = i * 4;\n img[iTimes4] = img[iTimes4] * vmul + 0x800 >> 12; // R\n\n img[iTimes4 + 1] = img[iTimes4 + 1] * vmul + 0x800 >> 12; // G\n\n img[iTimes4 + 2] = img[iTimes4 + 2] * vmul + 0x800 >> 12; // B\n }\n }\n};\n\n},{\"glur/mono16\":18}],11:[function(_dereq_,module,exports){\n\nmodule.exports = function unsharp(img, width, height, amount, radius, threshold) {\n if (amount === 0 || radius < 0.5) {\n return;\n }\n\n if (radius > 2.0) {\n radius = 2.0;\n }\n\n var pixels = width * height;\n var img_bytes_cnt = pixels * 4;\n var hsv_bytes_cnt = pixels * 2;\n var blur_bytes_cnt = pixels * 2;\n var blur_line_byte_cnt = Math.max(width, height) * 4; // float32 array\n\n var blur_coeffs_byte_cnt = 8 * 4; // float32 array\n\n var img_offset = 0;\n var hsv_offset = img_bytes_cnt;\n var blur_offset = hsv_offset + hsv_bytes_cnt;\n var blur_tmp_offset = blur_offset + blur_bytes_cnt;\n var blur_line_offset = blur_tmp_offset + blur_bytes_cnt;\n var blur_coeffs_offset = blur_line_offset + blur_line_byte_cnt;\n\n var instance = this.__instance('unsharp_mask', img_bytes_cnt + hsv_bytes_cnt + blur_bytes_cnt * 2 + blur_line_byte_cnt + blur_coeffs_byte_cnt, {\n exp: Math.exp\n }); // 32-bit copy is much faster in chrome\n\n\n var img32 = new Uint32Array(img.buffer);\n var mem32 = new Uint32Array(this.__memory.buffer);\n mem32.set(img32); // HSL\n\n var fn = instance.exports.hsv_v16 || instance.exports._hsv_v16;\n fn(img_offset, hsv_offset, width, height); // BLUR\n\n fn = instance.exports.blurMono16 || instance.exports._blurMono16;\n fn(hsv_offset, blur_offset, blur_tmp_offset, blur_line_offset, blur_coeffs_offset, width, height, radius); // UNSHARP\n\n fn = instance.exports.unsharp || instance.exports._unsharp;\n fn(img_offset, img_offset, hsv_offset, blur_offset, width, height, amount, threshold); // 32-bit copy is much faster in chrome\n\n img32.set(new Uint32Array(this.__memory.buffer, 0, pixels));\n};\n\n},{}],12:[function(_dereq_,module,exports){\n/* eslint-disable max-len */\n\nmodule.exports = 'AGFzbQEAAAAADAZkeWxpbmsAAAAAAAE0B2AAAGAEf39/fwBgBn9/f39/fwBgCH9/f39/f39/AGAIf39/f39/f30AYAJ9fwBgAXwBfAIZAgNlbnYDZXhwAAYDZW52Bm1lbW9yeQIAAAMHBgAFAgQBAwYGAX8AQQALB4oBCBFfX3dhc21fY2FsbF9jdG9ycwABFl9fYnVpbGRfZ2F1c3NpYW5fY29lZnMAAg5fX2dhdXNzMTZfbGluZQADCmJsdXJNb25vMTYABAdoc3ZfdjE2AAUHdW5zaGFycAAGDF9fZHNvX2hhbmRsZQMAGF9fd2FzbV9hcHBseV9kYXRhX3JlbG9jcwABCsUMBgMAAQvWAQEHfCABRNuGukOCGvs/IAC7oyICRAAAAAAAAADAohAAIgW2jDgCFCABIAKaEAAiAyADoCIGtjgCECABRAAAAAAAAPA/IAOhIgQgBKIgAyACIAKgokQAAAAAAADwP6AgBaGjIgS2OAIAIAEgBSAEmqIiB7Y4AgwgASADIAJEAAAAAAAA8D+gIASioiIItjgCCCABIAMgAkQAAAAAAADwv6AgBKKiIgK2OAIEIAEgByAIoCAFRAAAAAAAAPA/IAahoCIDo7Y4AhwgASAEIAKgIAOjtjgCGAuGBQMGfwl8An0gAyoCDCEVIAMqAgghFiADKgIUuyERIAMqAhC7IRACQCAEQQFrIghBAEgiCQRAIAIhByAAIQYMAQsgAiAALwEAuCIPIAMqAhi7oiIMIBGiIg0gDCAQoiAPIAMqAgS7IhOiIhQgAyoCALsiEiAPoqCgoCIOtjgCACACQQRqIQcgAEECaiEGIAhFDQAgCEEBIAhBAUgbIgpBf3MhCwJ/IAQgCmtBAXFFBEAgDiENIAgMAQsgAiANIA4gEKIgFCASIAAvAQK4Ig+ioKCgIg22OAIEIAJBCGohByAAQQRqIQYgDiEMIARBAmsLIQIgC0EAIARrRg0AA0AgByAMIBGiIA0gEKIgDyAToiASIAYvAQC4Ig6ioKCgIgy2OAIAIAcgDSARoiAMIBCiIA4gE6IgEiAGLwECuCIPoqCgoCINtjgCBCAHQQhqIQcgBkEEaiEGIAJBAkohACACQQJrIQIgAA0ACwsCQCAJDQAgASAFIAhsQQF0aiIAAn8gBkECay8BACICuCINIBW7IhKiIA0gFrsiE6KgIA0gAyoCHLuiIgwgEKKgIAwgEaKgIg8gB0EEayIHKgIAu6AiDkQAAAAAAADwQWMgDkQAAAAAAAAAAGZxBEAgDqsMAQtBAAs7AQAgCEUNACAGQQRrIQZBACAFa0EBdCEBA0ACfyANIBKiIAJB//8DcbgiDSAToqAgDyIOIBCioCAMIBGioCIPIAdBBGsiByoCALugIgxEAAAAAAAA8EFjIAxEAAAAAAAAAABmcQRAIAyrDAELQQALIQMgBi8BACECIAAgAWoiACADOwEAIAZBAmshBiAIQQFKIQMgDiEMIAhBAWshCCADDQALCwvRAgIBfwd8AkAgB0MAAAAAWw0AIARE24a6Q4Ia+z8gB0MAAAA/l7ujIglEAAAAAAAAAMCiEAAiDLaMOAIUIAQgCZoQACIKIAqgIg22OAIQIAREAAAAAAAA8D8gCqEiCyALoiAKIAkgCaCiRAAAAAAAAPA/oCAMoaMiC7Y4AgAgBCAMIAuaoiIOtjgCDCAEIAogCUQAAAAAAADwP6AgC6KiIg+2OAIIIAQgCiAJRAAAAAAAAPC/oCALoqIiCbY4AgQgBCAOIA+gIAxEAAAAAAAA8D8gDaGgIgqjtjgCHCAEIAsgCaAgCqO2OAIYIAYEQANAIAAgBSAIbEEBdGogAiAIQQF0aiADIAQgBSAGEAMgCEEBaiIIIAZHDQALCyAFRQ0AQQAhCANAIAIgBiAIbEEBdGogASAIQQF0aiADIAQgBiAFEAMgCEEBaiIIIAVHDQALCwtxAQN/IAIgA2wiBQRAA0AgASAAKAIAIgRBEHZB/wFxIgIgAiAEQQh2Qf8BcSIDIAMgBEH/AXEiBEkbIAIgA0sbIgYgBiAEIAIgBEsbIAMgBEsbQQh0OwEAIAFBAmohASAAQQRqIQAgBUEBayIFDQALCwuZAgIDfwF8IAQgBWwhBAJ/IAazQwAAgEWUQwAAyEKVu0QAAAAAAADgP6AiC5lEAAAAAAAA4EFjBEAgC6oMAQtBgICAgHgLIQUgBARAIAdBCHQhCUEAIQYDQCAJIAIgBkEBdCIHai8BACIBIAMgB2ovAQBrIgcgB0EfdSIIaiAIc00EQCAAIAZBAnQiCGoiCiAFIAdsQYAQakEMdSABaiIHQYD+AyAHQYD+A0gbIgdBACAHQQBKG0EMdCABQQEgARtuIgEgCi0AAGxBgBBqQQx2OgAAIAAgCEEBcmoiByABIActAABsQYAQakEMdjoAACAAIAhBAnJqIgcgASAHLQAAbEGAEGpBDHY6AAALIAZBAWoiBiAERw0ACwsL';\n\n},{}],13:[function(_dereq_,module,exports){\n\nvar GC_INTERVAL = 100;\n\nfunction Pool(create, idle) {\n this.create = create;\n this.available = [];\n this.acquired = {};\n this.lastId = 1;\n this.timeoutId = 0;\n this.idle = idle || 2000;\n}\n\nPool.prototype.acquire = function () {\n var _this = this;\n\n var resource;\n\n if (this.available.length !== 0) {\n resource = this.available.pop();\n } else {\n resource = this.create();\n resource.id = this.lastId++;\n\n resource.release = function () {\n return _this.release(resource);\n };\n }\n\n this.acquired[resource.id] = resource;\n return resource;\n};\n\nPool.prototype.release = function (resource) {\n var _this2 = this;\n\n delete this.acquired[resource.id];\n resource.lastUsed = Date.now();\n this.available.push(resource);\n\n if (this.timeoutId === 0) {\n this.timeoutId = setTimeout(function () {\n return _this2.gc();\n }, GC_INTERVAL);\n }\n};\n\nPool.prototype.gc = function () {\n var _this3 = this;\n\n var now = Date.now();\n this.available = this.available.filter(function (resource) {\n if (now - resource.lastUsed > _this3.idle) {\n resource.destroy();\n return false;\n }\n\n return true;\n });\n\n if (this.available.length !== 0) {\n this.timeoutId = setTimeout(function () {\n return _this3.gc();\n }, GC_INTERVAL);\n } else {\n this.timeoutId = 0;\n }\n};\n\nmodule.exports = Pool;\n\n},{}],14:[function(_dereq_,module,exports){\n// min size = 1 can consume large amount of memory\n\nvar MIN_INNER_TILE_SIZE = 2;\n\nmodule.exports = function createStages(fromWidth, fromHeight, toWidth, toHeight, srcTileSize, destTileBorder) {\n var scaleX = toWidth / fromWidth;\n var scaleY = toHeight / fromHeight; // derived from createRegions equation:\n // innerTileWidth = pixelFloor(srcTileSize * scaleX) - 2 * destTileBorder;\n\n var minScale = (2 * destTileBorder + MIN_INNER_TILE_SIZE + 1) / srcTileSize; // refuse to scale image multiple times by less than twice each time,\n // it could only happen because of invalid options\n\n if (minScale > 0.5) return [[toWidth, toHeight]];\n var stageCount = Math.ceil(Math.log(Math.min(scaleX, scaleY)) / Math.log(minScale)); // no additional resizes are necessary,\n // stageCount can be zero or be negative when enlarging the image\n\n if (stageCount <= 1) return [[toWidth, toHeight]];\n var result = [];\n\n for (var i = 0; i < stageCount; i++) {\n var width = Math.round(Math.pow(Math.pow(fromWidth, stageCount - i - 1) * Math.pow(toWidth, i + 1), 1 / stageCount));\n var height = Math.round(Math.pow(Math.pow(fromHeight, stageCount - i - 1) * Math.pow(toHeight, i + 1), 1 / stageCount));\n result.push([width, height]);\n }\n\n return result;\n};\n\n},{}],15:[function(_dereq_,module,exports){\n/*\n * pixelFloor and pixelCeil are modified versions of Math.floor and Math.ceil\n * functions which take into account floating point arithmetic errors.\n * Those errors can cause undesired increments/decrements of sizes and offsets:\n * Math.ceil(36 / (36 / 500)) = 501\n * pixelCeil(36 / (36 / 500)) = 500\n */\n\nvar PIXEL_EPSILON = 1e-5;\n\nfunction pixelFloor(x) {\n var nearest = Math.round(x);\n\n if (Math.abs(x - nearest) < PIXEL_EPSILON) {\n return nearest;\n }\n\n return Math.floor(x);\n}\n\nfunction pixelCeil(x) {\n var nearest = Math.round(x);\n\n if (Math.abs(x - nearest) < PIXEL_EPSILON) {\n return nearest;\n }\n\n return Math.ceil(x);\n}\n\nmodule.exports = function createRegions(options) {\n var scaleX = options.toWidth / options.width;\n var scaleY = options.toHeight / options.height;\n var innerTileWidth = pixelFloor(options.srcTileSize * scaleX) - 2 * options.destTileBorder;\n var innerTileHeight = pixelFloor(options.srcTileSize * scaleY) - 2 * options.destTileBorder; // prevent infinite loop, this should never happen\n\n if (innerTileWidth < 1 || innerTileHeight < 1) {\n throw new Error('Internal error in pica: target tile width/height is too small.');\n }\n\n var x, y;\n var innerX, innerY, toTileWidth, toTileHeight;\n var tiles = [];\n var tile; // we go top-to-down instead of left-to-right to make image displayed from top to\n // doesn in the browser\n\n for (innerY = 0; innerY < options.toHeight; innerY += innerTileHeight) {\n for (innerX = 0; innerX < options.toWidth; innerX += innerTileWidth) {\n x = innerX - options.destTileBorder;\n\n if (x < 0) {\n x = 0;\n }\n\n toTileWidth = innerX + innerTileWidth + options.destTileBorder - x;\n\n if (x + toTileWidth >= options.toWidth) {\n toTileWidth = options.toWidth - x;\n }\n\n y = innerY - options.destTileBorder;\n\n if (y < 0) {\n y = 0;\n }\n\n toTileHeight = innerY + innerTileHeight + options.destTileBorder - y;\n\n if (y + toTileHeight >= options.toHeight) {\n toTileHeight = options.toHeight - y;\n }\n\n tile = {\n toX: x,\n toY: y,\n toWidth: toTileWidth,\n toHeight: toTileHeight,\n toInnerX: innerX,\n toInnerY: innerY,\n toInnerWidth: innerTileWidth,\n toInnerHeight: innerTileHeight,\n offsetX: x / scaleX - pixelFloor(x / scaleX),\n offsetY: y / scaleY - pixelFloor(y / scaleY),\n scaleX: scaleX,\n scaleY: scaleY,\n x: pixelFloor(x / scaleX),\n y: pixelFloor(y / scaleY),\n width: pixelCeil(toTileWidth / scaleX),\n height: pixelCeil(toTileHeight / scaleY)\n };\n tiles.push(tile);\n }\n }\n\n return tiles;\n};\n\n},{}],16:[function(_dereq_,module,exports){\n\nfunction objClass(obj) {\n return Object.prototype.toString.call(obj);\n}\n\nmodule.exports.isCanvas = function isCanvas(element) {\n var cname = objClass(element);\n return cname === '[object HTMLCanvasElement]'\n /* browser */\n || cname === '[object OffscreenCanvas]' || cname === '[object Canvas]'\n /* node-canvas */\n ;\n};\n\nmodule.exports.isImage = function isImage(element) {\n return objClass(element) === '[object HTMLImageElement]';\n};\n\nmodule.exports.isImageBitmap = function isImageBitmap(element) {\n return objClass(element) === '[object ImageBitmap]';\n};\n\nmodule.exports.limiter = function limiter(concurrency) {\n var active = 0,\n queue = [];\n\n function roll() {\n if (active < concurrency && queue.length) {\n active++;\n queue.shift()();\n }\n }\n\n return function limit(fn) {\n return new Promise(function (resolve, reject) {\n queue.push(function () {\n fn().then(function (result) {\n resolve(result);\n active--;\n roll();\n }, function (err) {\n reject(err);\n active--;\n roll();\n });\n });\n roll();\n });\n };\n};\n\nmodule.exports.cib_quality_name = function cib_quality_name(num) {\n switch (num) {\n case 0:\n return 'pixelated';\n\n case 1:\n return 'low';\n\n case 2:\n return 'medium';\n }\n\n return 'high';\n};\n\nmodule.exports.cib_support = function cib_support(createCanvas) {\n return Promise.resolve().then(function () {\n if (typeof createImageBitmap === 'undefined') {\n return false;\n }\n\n var c = createCanvas(100, 100);\n return createImageBitmap(c, 0, 0, 100, 100, {\n resizeWidth: 10,\n resizeHeight: 10,\n resizeQuality: 'high'\n }).then(function (bitmap) {\n var status = bitmap.width === 10; // Branch below is filtered on upper level. We do not call resize\n // detection for basic ImageBitmap.\n //\n // https://developer.mozilla.org/en-US/docs/Web/API/ImageBitmap\n // old Crome 51 has ImageBitmap without .close(). Then this code\n // will throw and return 'false' as expected.\n //\n\n bitmap.close();\n c = null;\n return status;\n });\n })[\"catch\"](function () {\n return false;\n });\n};\n\nmodule.exports.worker_offscreen_canvas_support = function worker_offscreen_canvas_support() {\n return new Promise(function (resolve, reject) {\n if (typeof OffscreenCanvas === 'undefined') {\n // if OffscreenCanvas is present, we assume browser supports Worker and built-in Promise as well\n resolve(false);\n return;\n }\n\n function workerPayload(self) {\n if (typeof createImageBitmap === 'undefined') {\n self.postMessage(false);\n return;\n }\n\n Promise.resolve().then(function () {\n var canvas = new OffscreenCanvas(10, 10); // test that 2d context can be used in worker\n\n var ctx = canvas.getContext('2d');\n ctx.rect(0, 0, 1, 1); // test that cib can be used to return image bitmap from worker\n\n return createImageBitmap(canvas, 0, 0, 1, 1);\n }).then(function () {\n return self.postMessage(true);\n }, function () {\n return self.postMessage(false);\n });\n }\n\n var code = btoa(\"(\".concat(workerPayload.toString(), \")(self);\"));\n var w = new Worker(\"data:text/javascript;base64,\".concat(code));\n\n w.onmessage = function (ev) {\n return resolve(ev.data);\n };\n\n w.onerror = reject;\n }).then(function (result) {\n return result;\n }, function () {\n return false;\n });\n}; // Check if canvas.getContext('2d').getImageData can be used,\n// FireFox randomizes the output of that function in `privacy.resistFingerprinting` mode\n\n\nmodule.exports.can_use_canvas = function can_use_canvas(createCanvas) {\n var usable = false;\n\n try {\n var canvas = createCanvas(2, 1);\n var ctx = canvas.getContext('2d');\n var d = ctx.createImageData(2, 1);\n d.data[0] = 12;\n d.data[1] = 23;\n d.data[2] = 34;\n d.data[3] = 255;\n d.data[4] = 45;\n d.data[5] = 56;\n d.data[6] = 67;\n d.data[7] = 255;\n ctx.putImageData(d, 0, 0);\n d = null;\n d = ctx.getImageData(0, 0, 2, 1);\n\n if (d.data[0] === 12 && d.data[1] === 23 && d.data[2] === 34 && d.data[3] === 255 && d.data[4] === 45 && d.data[5] === 56 && d.data[6] === 67 && d.data[7] === 255) {\n usable = true;\n }\n } catch (err) {}\n\n return usable;\n}; // Check if createImageBitmap(img, sx, sy, sw, sh) signature works correctly\n// with JPEG images oriented with Exif;\n// https://bugs.chromium.org/p/chromium/issues/detail?id=1220671\n// TODO: remove after it's fixed in chrome for at least 2 releases\n\n\nmodule.exports.cib_can_use_region = function cib_can_use_region() {\n return new Promise(function (resolve) {\n if (typeof createImageBitmap === 'undefined') {\n resolve(false);\n return;\n }\n\n var image = new Image();\n image.src = 'data:image/jpeg;base64,' + '/9j/4QBiRXhpZgAATU0AKgAAAAgABQESAAMAAAABAAYAAAEaAAUAAAABAAAASgEbAAUAA' + 'AABAAAAUgEoAAMAAAABAAIAAAITAAMAAAABAAEAAAAAAAAAAABIAAAAAQAAAEgAAAAB/9' + 'sAQwAEAwMEAwMEBAMEBQQEBQYKBwYGBgYNCQoICg8NEBAPDQ8OERMYFBESFxIODxUcFRc' + 'ZGRsbGxAUHR8dGh8YGhsa/9sAQwEEBQUGBQYMBwcMGhEPERoaGhoaGhoaGhoaGhoaGhoa' + 'GhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoa/8IAEQgAAQACAwERAAIRAQMRA' + 'f/EABQAAQAAAAAAAAAAAAAAAAAAAAf/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAA' + 'IQAxAAAAF/P//EABQQAQAAAAAAAAAAAAAAAAAAAAD/2gAIAQEAAQUCf//EABQRAQAAAAA' + 'AAAAAAAAAAAAAAAD/2gAIAQMBAT8Bf//EABQRAQAAAAAAAAAAAAAAAAAAAAD/2gAIAQIB' + 'AT8Bf//EABQQAQAAAAAAAAAAAAAAAAAAAAD/2gAIAQEABj8Cf//EABQQAQAAAAAAAAAAA' + 'AAAAAAAAAD/2gAIAQEAAT8hf//aAAwDAQACAAMAAAAQH//EABQRAQAAAAAAAAAAAAAAAA' + 'AAAAD/2gAIAQMBAT8Qf//EABQRAQAAAAAAAAAAAAAAAAAAAAD/2gAIAQIBAT8Qf//EABQ' + 'QAQAAAAAAAAAAAAAAAAAAAAD/2gAIAQEAAT8Qf//Z';\n\n image.onload = function () {\n createImageBitmap(image, 0, 0, image.width, image.height).then(function (bitmap) {\n if (bitmap.width === image.width && bitmap.height === image.height) {\n resolve(true);\n } else {\n resolve(false);\n }\n }, function () {\n return resolve(false);\n });\n };\n\n image.onerror = function () {\n return resolve(false);\n };\n });\n};\n\n},{}],17:[function(_dereq_,module,exports){\n\nmodule.exports = function () {\n var MathLib = _dereq_('./mathlib');\n\n var mathLib;\n /* eslint-disable no-undef */\n\n onmessage = function onmessage(ev) {\n var tileOpts = ev.data.opts;\n var returnBitmap = false;\n\n if (!tileOpts.src && tileOpts.srcBitmap) {\n var canvas = new OffscreenCanvas(tileOpts.width, tileOpts.height);\n var ctx = canvas.getContext('2d', {\n alpha: Boolean(tileOpts.alpha)\n });\n ctx.drawImage(tileOpts.srcBitmap, 0, 0);\n tileOpts.src = ctx.getImageData(0, 0, tileOpts.width, tileOpts.height).data;\n canvas.width = canvas.height = 0;\n canvas = null;\n tileOpts.srcBitmap.close();\n tileOpts.srcBitmap = null;\n returnBitmap = true;\n }\n\n if (!mathLib) mathLib = new MathLib(ev.data.features); // Use multimath's sync auto-init. Avoid Promise use in old browsers,\n // because polyfills are not propagated to webworker.\n\n var data = mathLib.resizeAndUnsharp(tileOpts);\n\n if (returnBitmap) {\n var toImageData = new ImageData(new Uint8ClampedArray(data), tileOpts.toWidth, tileOpts.toHeight);\n\n var _canvas = new OffscreenCanvas(tileOpts.toWidth, tileOpts.toHeight);\n\n var _ctx = _canvas.getContext('2d', {\n alpha: Boolean(tileOpts.alpha)\n });\n\n _ctx.putImageData(toImageData, 0, 0);\n\n createImageBitmap(_canvas).then(function (bitmap) {\n postMessage({\n bitmap: bitmap\n }, [bitmap]);\n });\n } else {\n postMessage({\n data: data\n }, [data.buffer]);\n }\n };\n};\n\n},{\"./mathlib\":1}],18:[function(_dereq_,module,exports){\n// Calculate Gaussian blur of an image using IIR filter\n// The method is taken from Intel's white paper and code example attached to it:\n// https://software.intel.com/en-us/articles/iir-gaussian-blur-filter\n// -implementation-using-intel-advanced-vector-extensions\n\nvar a0, a1, a2, a3, b1, b2, left_corner, right_corner;\n\nfunction gaussCoef(sigma) {\n if (sigma < 0.5) {\n sigma = 0.5;\n }\n\n var a = Math.exp(0.726 * 0.726) / sigma,\n g1 = Math.exp(-a),\n g2 = Math.exp(-2 * a),\n k = (1 - g1) * (1 - g1) / (1 + 2 * a * g1 - g2);\n\n a0 = k;\n a1 = k * (a - 1) * g1;\n a2 = k * (a + 1) * g1;\n a3 = -k * g2;\n b1 = 2 * g1;\n b2 = -g2;\n left_corner = (a0 + a1) / (1 - b1 - b2);\n right_corner = (a2 + a3) / (1 - b1 - b2);\n\n // Attempt to force type to FP32.\n return new Float32Array([ a0, a1, a2, a3, b1, b2, left_corner, right_corner ]);\n}\n\nfunction convolveMono16(src, out, line, coeff, width, height) {\n // takes src image and writes the blurred and transposed result into out\n\n var prev_src, curr_src, curr_out, prev_out, prev_prev_out;\n var src_index, out_index, line_index;\n var i, j;\n var coeff_a0, coeff_a1, coeff_b1, coeff_b2;\n\n for (i = 0; i < height; i++) {\n src_index = i * width;\n out_index = i;\n line_index = 0;\n\n // left to right\n prev_src = src[src_index];\n prev_prev_out = prev_src * coeff[6];\n prev_out = prev_prev_out;\n\n coeff_a0 = coeff[0];\n coeff_a1 = coeff[1];\n coeff_b1 = coeff[4];\n coeff_b2 = coeff[5];\n\n for (j = 0; j < width; j++) {\n curr_src = src[src_index];\n\n curr_out = curr_src * coeff_a0 +\n prev_src * coeff_a1 +\n prev_out * coeff_b1 +\n prev_prev_out * coeff_b2;\n\n prev_prev_out = prev_out;\n prev_out = curr_out;\n prev_src = curr_src;\n\n line[line_index] = prev_out;\n line_index++;\n src_index++;\n }\n\n src_index--;\n line_index--;\n out_index += height * (width - 1);\n\n // right to left\n prev_src = src[src_index];\n prev_prev_out = prev_src * coeff[7];\n prev_out = prev_prev_out;\n curr_src = prev_src;\n\n coeff_a0 = coeff[2];\n coeff_a1 = coeff[3];\n\n for (j = width - 1; j >= 0; j--) {\n curr_out = curr_src * coeff_a0 +\n prev_src * coeff_a1 +\n prev_out * coeff_b1 +\n prev_prev_out * coeff_b2;\n\n prev_prev_out = prev_out;\n prev_out = curr_out;\n\n prev_src = curr_src;\n curr_src = src[src_index];\n\n out[out_index] = line[line_index] + prev_out;\n\n src_index--;\n line_index--;\n out_index -= height;\n }\n }\n}\n\n\nfunction blurMono16(src, width, height, radius) {\n // Quick exit on zero radius\n if (!radius) { return; }\n\n var out = new Uint16Array(src.length),\n tmp_line = new Float32Array(Math.max(width, height));\n\n var coeff = gaussCoef(radius);\n\n convolveMono16(src, out, tmp_line, coeff, width, height);\n convolveMono16(out, src, tmp_line, coeff, height, width);\n}\n\nmodule.exports = blurMono16;\n\n},{}],19:[function(_dereq_,module,exports){\nif (typeof Object.create === 'function') {\n // implementation from standard node.js 'util' module\n module.exports = function inherits(ctor, superCtor) {\n if (superCtor) {\n ctor.super_ = superCtor;\n ctor.prototype = Object.create(superCtor.prototype, {\n constructor: {\n value: ctor,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n }\n };\n} else {\n // old school shim for old browsers\n module.exports = function inherits(ctor, superCtor) {\n if (superCtor) {\n ctor.super_ = superCtor;\n var TempCtor = function () {};\n TempCtor.prototype = superCtor.prototype;\n ctor.prototype = new TempCtor();\n ctor.prototype.constructor = ctor;\n }\n };\n}\n\n},{}],20:[function(_dereq_,module,exports){\n\n\nvar assign = _dereq_('object-assign');\nvar base64decode = _dereq_('./lib/base64decode');\nvar hasWebAssembly = _dereq_('./lib/wa_detect');\n\n\nvar DEFAULT_OPTIONS = {\n js: true,\n wasm: true\n};\n\n\nfunction MultiMath(options) {\n if (!(this instanceof MultiMath)) return new MultiMath(options);\n\n var opts = assign({}, DEFAULT_OPTIONS, options || {});\n\n this.options = opts;\n\n this.__cache = {};\n\n this.__init_promise = null;\n this.__modules = opts.modules || {};\n this.__memory = null;\n this.__wasm = {};\n\n this.__isLE = ((new Uint32Array((new Uint8Array([ 1, 0, 0, 0 ])).buffer))[0] === 1);\n\n if (!this.options.js && !this.options.wasm) {\n throw new Error('mathlib: at least \"js\" or \"wasm\" should be enabled');\n }\n}\n\n\nMultiMath.prototype.has_wasm = hasWebAssembly;\n\n\nMultiMath.prototype.use = function (module) {\n this.__modules[module.name] = module;\n\n // Pin the best possible implementation\n if (this.options.wasm && this.has_wasm() && module.wasm_fn) {\n this[module.name] = module.wasm_fn;\n } else {\n this[module.name] = module.fn;\n }\n\n return this;\n};\n\n\nMultiMath.prototype.init = function () {\n if (this.__init_promise) return this.__init_promise;\n\n if (!this.options.js && this.options.wasm && !this.has_wasm()) {\n return Promise.reject(new Error('mathlib: only \"wasm\" was enabled, but it\\'s not supported'));\n }\n\n var self = this;\n\n this.__init_promise = Promise.all(Object.keys(self.__modules).map(function (name) {\n var module = self.__modules[name];\n\n if (!self.options.wasm || !self.has_wasm() || !module.wasm_fn) return null;\n\n // If already compiled - exit\n if (self.__wasm[name]) return null;\n\n // Compile wasm source\n return WebAssembly.compile(self.__base64decode(module.wasm_src))\n .then(function (m) { self.__wasm[name] = m; });\n }))\n .then(function () { return self; });\n\n return this.__init_promise;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////\n// Methods below are for internal use from plugins\n\n\n// Simple decode base64 to typed array. Useful to load embedded webassembly\n// code. You probably don't need to call this method directly.\n//\nMultiMath.prototype.__base64decode = base64decode;\n\n\n// Increase current memory to include specified number of bytes. Do nothing if\n// size is already ok. You probably don't need to call this method directly,\n// because it will be invoked from `.__instance()`.\n//\nMultiMath.prototype.__reallocate = function mem_grow_to(bytes) {\n if (!this.__memory) {\n this.__memory = new WebAssembly.Memory({\n initial: Math.ceil(bytes / (64 * 1024))\n });\n return this.__memory;\n }\n\n var mem_size = this.__memory.buffer.byteLength;\n\n if (mem_size < bytes) {\n this.__memory.grow(Math.ceil((bytes - mem_size) / (64 * 1024)));\n }\n\n return this.__memory;\n};\n\n\n// Returns instantinated webassembly item by name, with specified memory size\n// and environment.\n// - use cache if available\n// - do sync module init, if async init was not called earlier\n// - allocate memory if not enougth\n// - can export functions to webassembly via \"env_extra\",\n// for example, { exp: Math.exp }\n//\nMultiMath.prototype.__instance = function instance(name, memsize, env_extra) {\n if (memsize) this.__reallocate(memsize);\n\n // If .init() was not called, do sync compile\n if (!this.__wasm[name]) {\n var module = this.__modules[name];\n this.__wasm[name] = new WebAssembly.Module(this.__base64decode(module.wasm_src));\n }\n\n if (!this.__cache[name]) {\n var env_base = {\n memoryBase: 0,\n memory: this.__memory,\n tableBase: 0,\n table: new WebAssembly.Table({ initial: 0, element: 'anyfunc' })\n };\n\n this.__cache[name] = new WebAssembly.Instance(this.__wasm[name], {\n env: assign(env_base, env_extra || {})\n });\n }\n\n return this.__cache[name];\n};\n\n\n// Helper to calculate memory aligh for pointers. Webassembly does not require\n// this, but you may wish to experiment. Default base = 8;\n//\nMultiMath.prototype.__align = function align(number, base) {\n base = base || 8;\n var reminder = number % base;\n return number + (reminder ? base - reminder : 0);\n};\n\n\nmodule.exports = MultiMath;\n\n},{\"./lib/base64decode\":21,\"./lib/wa_detect\":22,\"object-assign\":23}],21:[function(_dereq_,module,exports){\n\n\nvar BASE64_MAP = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n\n\nmodule.exports = function base64decode(str) {\n var input = str.replace(/[\\r\\n=]/g, ''), // remove CR/LF & padding to simplify scan\n max = input.length;\n\n var out = new Uint8Array((max * 3) >> 2);\n\n // Collect by 6*4 bits (3 bytes)\n\n var bits = 0;\n var ptr = 0;\n\n for (var idx = 0; idx < max; idx++) {\n if ((idx % 4 === 0) && idx) {\n out[ptr++] = (bits >> 16) & 0xFF;\n out[ptr++] = (bits >> 8) & 0xFF;\n out[ptr++] = bits & 0xFF;\n }\n\n bits = (bits << 6) | BASE64_MAP.indexOf(input.charAt(idx));\n }\n\n // Dump tail\n\n var tailbits = (max % 4) * 6;\n\n if (tailbits === 0) {\n out[ptr++] = (bits >> 16) & 0xFF;\n out[ptr++] = (bits >> 8) & 0xFF;\n out[ptr++] = bits & 0xFF;\n } else if (tailbits === 18) {\n out[ptr++] = (bits >> 10) & 0xFF;\n out[ptr++] = (bits >> 2) & 0xFF;\n } else if (tailbits === 12) {\n out[ptr++] = (bits >> 4) & 0xFF;\n }\n\n return out;\n};\n\n},{}],22:[function(_dereq_,module,exports){\n\n\nvar wa;\n\n\nmodule.exports = function hasWebAssembly() {\n // use cache if called before;\n if (typeof wa !== 'undefined') return wa;\n\n wa = false;\n\n if (typeof WebAssembly === 'undefined') return wa;\n\n // If WebAssenbly is disabled, code can throw on compile\n try {\n // https://github.com/brion/min-wasm-fail/blob/master/min-wasm-fail.in.js\n // Additional check that WA internals are correct\n\n /* eslint-disable comma-spacing, max-len */\n var bin = new Uint8Array([ 0,97,115,109,1,0,0,0,1,6,1,96,1,127,1,127,3,2,1,0,5,3,1,0,1,7,8,1,4,116,101,115,116,0,0,10,16,1,14,0,32,0,65,1,54,2,0,32,0,40,2,0,11 ]);\n var module = new WebAssembly.Module(bin);\n var instance = new WebAssembly.Instance(module, {});\n\n // test storing to and loading from a non-zero location via a parameter.\n // Safari on iOS 11.2.5 returns 0 unexpectedly at non-zero locations\n if (instance.exports.test(4) !== 0) wa = true;\n\n return wa;\n } catch (__) {}\n\n return wa;\n};\n\n},{}],23:[function(_dereq_,module,exports){\n/* eslint-disable no-unused-vars */\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n\tif (val === null || val === undefined) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nfunction shouldUseNative() {\n\ttry {\n\t\tif (!Object.assign) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Detect buggy property enumeration order in older V8 versions.\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\t\tvar test1 = new String('abc'); // eslint-disable-line no-new-wrappers\n\t\ttest1[5] = 'de';\n\t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test2 = {};\n\t\tfor (var i = 0; i < 10; i++) {\n\t\t\ttest2['_' + String.fromCharCode(i)] = i;\n\t\t}\n\t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n\t\t\treturn test2[n];\n\t\t});\n\t\tif (order2.join('') !== '0123456789') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test3 = {};\n\t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n\t\t\ttest3[letter] = letter;\n\t\t});\n\t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n\t\t\t\t'abcdefghijklmnopqrst') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (err) {\n\t\t// We don't expect any of the above to throw, but better to be safe.\n\t\treturn false;\n\t}\n}\n\nmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\n\tvar from;\n\tvar to = toObject(target);\n\tvar symbols;\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = Object(arguments[s]);\n\n\t\tfor (var key in from) {\n\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\tto[key] = from[key];\n\t\t\t}\n\t\t}\n\n\t\tif (getOwnPropertySymbols) {\n\t\t\tsymbols = getOwnPropertySymbols(from);\n\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to;\n};\n\n},{}],24:[function(_dereq_,module,exports){\nvar bundleFn = arguments[3];\nvar sources = arguments[4];\nvar cache = arguments[5];\n\nvar stringify = JSON.stringify;\n\nmodule.exports = function (fn, options) {\n var wkey;\n var cacheKeys = Object.keys(cache);\n\n for (var i = 0, l = cacheKeys.length; i < l; i++) {\n var key = cacheKeys[i];\n var exp = cache[key].exports;\n // Using babel as a transpiler to use esmodule, the export will always\n // be an object with the default export as a property of it. To ensure\n // the existing api and babel esmodule exports are both supported we\n // check for both\n if (exp === fn || exp && exp.default === fn) {\n wkey = key;\n break;\n }\n }\n\n if (!wkey) {\n wkey = Math.floor(Math.pow(16, 8) * Math.random()).toString(16);\n var wcache = {};\n for (var i = 0, l = cacheKeys.length; i < l; i++) {\n var key = cacheKeys[i];\n wcache[key] = key;\n }\n sources[wkey] = [\n 'function(require,module,exports){' + fn + '(self); }',\n wcache\n ];\n }\n var skey = Math.floor(Math.pow(16, 8) * Math.random()).toString(16);\n\n var scache = {}; scache[wkey] = wkey;\n sources[skey] = [\n 'function(require,module,exports){' +\n // try to call default if defined to also support babel esmodule exports\n 'var f = require(' + stringify(wkey) + ');' +\n '(f.default ? f.default : f)(self);' +\n '}',\n scache\n ];\n\n var workerSources = {};\n resolveSources(skey);\n\n function resolveSources(key) {\n workerSources[key] = true;\n\n for (var depPath in sources[key][1]) {\n var depKey = sources[key][1][depPath];\n if (!workerSources[depKey]) {\n resolveSources(depKey);\n }\n }\n }\n\n var src = '(' + bundleFn + ')({'\n + Object.keys(workerSources).map(function (key) {\n return stringify(key) + ':['\n + sources[key][0]\n + ',' + stringify(sources[key][1]) + ']'\n ;\n }).join(',')\n + '},{},[' + stringify(skey) + '])'\n ;\n\n var URL = window.URL || window.webkitURL || window.mozURL || window.msURL;\n\n var blob = new Blob([src], { type: 'text/javascript' });\n if (options && options.bare) { return blob; }\n var workerUrl = URL.createObjectURL(blob);\n var worker = new Worker(workerUrl);\n worker.objectURL = workerUrl;\n return worker;\n};\n\n},{}],\"/index.js\":[function(_dereq_,module,exports){\n\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== \"undefined\" && arr[Symbol.iterator] || arr[\"@@iterator\"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nvar assign = _dereq_('object-assign');\n\nvar webworkify = _dereq_('webworkify');\n\nvar MathLib = _dereq_('./lib/mathlib');\n\nvar Pool = _dereq_('./lib/pool');\n\nvar utils = _dereq_('./lib/utils');\n\nvar worker = _dereq_('./lib/worker');\n\nvar createStages = _dereq_('./lib/stepper');\n\nvar createRegions = _dereq_('./lib/tiler'); // Deduplicate pools & limiters with the same configs\n// when user creates multiple pica instances.\n\n\nvar singletones = {};\nvar NEED_SAFARI_FIX = false;\n\ntry {\n if (typeof navigator !== 'undefined' && navigator.userAgent) {\n NEED_SAFARI_FIX = navigator.userAgent.indexOf('Safari') >= 0;\n }\n} catch (e) {}\n\nvar concurrency = 1;\n\nif (typeof navigator !== 'undefined') {\n concurrency = Math.min(navigator.hardwareConcurrency || 1, 4);\n}\n\nvar DEFAULT_PICA_OPTS = {\n tile: 1024,\n concurrency: concurrency,\n features: ['js', 'wasm', 'ww'],\n idle: 2000,\n createCanvas: function createCanvas(width, height) {\n var tmpCanvas = document.createElement('canvas');\n tmpCanvas.width = width;\n tmpCanvas.height = height;\n return tmpCanvas;\n }\n};\nvar DEFAULT_RESIZE_OPTS = {\n quality: 3,\n alpha: false,\n unsharpAmount: 0,\n unsharpRadius: 0.0,\n unsharpThreshold: 0\n};\nvar CAN_NEW_IMAGE_DATA = false;\nvar CAN_CREATE_IMAGE_BITMAP = false;\nvar CAN_USE_CANVAS_GET_IMAGE_DATA = false;\nvar CAN_USE_OFFSCREEN_CANVAS = false;\nvar CAN_USE_CIB_REGION_FOR_IMAGE = false;\n\nfunction workerFabric() {\n return {\n value: webworkify(worker),\n destroy: function destroy() {\n this.value.terminate();\n\n if (typeof window !== 'undefined') {\n var url = window.URL || window.webkitURL || window.mozURL || window.msURL;\n\n if (url && url.revokeObjectURL && this.value.objectURL) {\n url.revokeObjectURL(this.value.objectURL);\n }\n }\n }\n };\n} ////////////////////////////////////////////////////////////////////////////////\n// API methods\n\n\nfunction Pica(options) {\n if (!(this instanceof Pica)) return new Pica(options);\n this.options = assign({}, DEFAULT_PICA_OPTS, options || {});\n var limiter_key = \"lk_\".concat(this.options.concurrency); // Share limiters to avoid multiple parallel workers when user creates\n // multiple pica instances.\n\n this.__limit = singletones[limiter_key] || utils.limiter(this.options.concurrency);\n if (!singletones[limiter_key]) singletones[limiter_key] = this.__limit; // List of supported features, according to options & browser/node.js\n\n this.features = {\n js: false,\n // pure JS implementation, can be disabled for testing\n wasm: false,\n // webassembly implementation for heavy functions\n cib: false,\n // resize via createImageBitmap (only FF at this moment)\n ww: false // webworkers\n\n };\n this.__workersPool = null; // Store requested features for webworkers\n\n this.__requested_features = [];\n this.__mathlib = null;\n}\n\nPica.prototype.init = function () {\n var _this = this;\n\n if (this.__initPromise) return this.__initPromise; // Test if we can create ImageData without canvas and memory copy\n\n if (typeof ImageData !== 'undefined' && typeof Uint8ClampedArray !== 'undefined') {\n try {\n /* eslint-disable no-new */\n new ImageData(new Uint8ClampedArray(400), 10, 10);\n CAN_NEW_IMAGE_DATA = true;\n } catch (__) {}\n } // ImageBitmap can be effective in 2 places:\n //\n // 1. Threaded jpeg unpack (basic)\n // 2. Built-in resize (blocked due problem in chrome, see issue #89)\n //\n // For basic use we also need ImageBitmap wo support .close() method,\n // see https://developer.mozilla.org/ru/docs/Web/API/ImageBitmap\n\n\n if (typeof ImageBitmap !== 'undefined') {\n if (ImageBitmap.prototype && ImageBitmap.prototype.close) {\n CAN_CREATE_IMAGE_BITMAP = true;\n } else {\n this.debug('ImageBitmap does not support .close(), disabled');\n }\n }\n\n var features = this.options.features.slice();\n\n if (features.indexOf('all') >= 0) {\n features = ['cib', 'wasm', 'js', 'ww'];\n }\n\n this.__requested_features = features;\n this.__mathlib = new MathLib(features); // Check WebWorker support if requested\n\n if (features.indexOf('ww') >= 0) {\n if (typeof window !== 'undefined' && 'Worker' in window) {\n // IE <= 11 don't allow to create webworkers from string. We should check it.\n // https://connect.microsoft.com/IE/feedback/details/801810/web-workers-from-blob-urls-in-ie-10-and-11\n try {\n var wkr = _dereq_('webworkify')(function () {});\n\n wkr.terminate();\n this.features.ww = true; // pool uniqueness depends on pool config + webworker config\n\n var wpool_key = \"wp_\".concat(JSON.stringify(this.options));\n\n if (singletones[wpool_key]) {\n this.__workersPool = singletones[wpool_key];\n } else {\n this.__workersPool = new Pool(workerFabric, this.options.idle);\n singletones[wpool_key] = this.__workersPool;\n }\n } catch (__) {}\n }\n }\n\n var initMath = this.__mathlib.init().then(function (mathlib) {\n // Copy detected features\n assign(_this.features, mathlib.features);\n });\n\n var checkCibResize;\n\n if (!CAN_CREATE_IMAGE_BITMAP) {\n checkCibResize = Promise.resolve(false);\n } else {\n checkCibResize = utils.cib_support(this.options.createCanvas).then(function (status) {\n if (_this.features.cib && features.indexOf('cib') < 0) {\n _this.debug('createImageBitmap() resize supported, but disabled by config');\n\n return;\n }\n\n if (features.indexOf('cib') >= 0) _this.features.cib = status;\n });\n }\n\n CAN_USE_CANVAS_GET_IMAGE_DATA = utils.can_use_canvas(this.options.createCanvas);\n var checkOffscreenCanvas;\n\n if (CAN_CREATE_IMAGE_BITMAP && CAN_NEW_IMAGE_DATA && features.indexOf('ww') !== -1) {\n checkOffscreenCanvas = utils.worker_offscreen_canvas_support();\n } else {\n checkOffscreenCanvas = Promise.resolve(false);\n }\n\n checkOffscreenCanvas = checkOffscreenCanvas.then(function (result) {\n CAN_USE_OFFSCREEN_CANVAS = result;\n }); // we use createImageBitmap to crop image data and pass it to workers,\n // so need to check whether function works correctly;\n // https://bugs.chromium.org/p/chromium/issues/detail?id=1220671\n\n var checkCibRegion = utils.cib_can_use_region().then(function (result) {\n CAN_USE_CIB_REGION_FOR_IMAGE = result;\n }); // Init math lib. That's async because can load some\n\n this.__initPromise = Promise.all([initMath, checkCibResize, checkOffscreenCanvas, checkCibRegion]).then(function () {\n return _this;\n });\n return this.__initPromise;\n}; // Call resizer in webworker or locally, depending on config\n\n\nPica.prototype.__invokeResize = function (tileOpts, opts) {\n var _this2 = this;\n\n // Share cache between calls:\n //\n // - wasm instance\n // - wasm memory object\n //\n opts.__mathCache = opts.__mathCache || {};\n return Promise.resolve().then(function () {\n if (!_this2.features.ww) {\n // not possible to have ImageBitmap here if user disabled WW\n return {\n data: _this2.__mathlib.resizeAndUnsharp(tileOpts, opts.__mathCache)\n };\n }\n\n return new Promise(function (resolve, reject) {\n var w = _this2.__workersPool.acquire();\n\n if (opts.cancelToken) opts.cancelToken[\"catch\"](function (err) {\n return reject(err);\n });\n\n w.value.onmessage = function (ev) {\n w.release();\n if (ev.data.err) reject(ev.data.err);else resolve(ev.data);\n };\n\n var transfer = [];\n if (tileOpts.src) transfer.push(tileOpts.src.buffer);\n if (tileOpts.srcBitmap) transfer.push(tileOpts.srcBitmap);\n w.value.postMessage({\n opts: tileOpts,\n features: _this2.__requested_features,\n preload: {\n wasm_nodule: _this2.__mathlib.__\n }\n }, transfer);\n });\n });\n}; // this function can return promise if createImageBitmap is used\n\n\nPica.prototype.__extractTileData = function (tile, from, opts, stageEnv, extractTo) {\n if (this.features.ww && CAN_USE_OFFSCREEN_CANVAS && ( // createImageBitmap doesn't work for images (Image, ImageBitmap) with Exif orientation in Chrome,\n // can use canvas because canvas doesn't have orientation;\n // see https://bugs.chromium.org/p/chromium/issues/detail?id=1220671\n utils.isCanvas(from) || CAN_USE_CIB_REGION_FOR_IMAGE)) {\n this.debug('Create tile for OffscreenCanvas');\n return createImageBitmap(stageEnv.srcImageBitmap || from, tile.x, tile.y, tile.width, tile.height).then(function (bitmap) {\n extractTo.srcBitmap = bitmap;\n return extractTo;\n });\n } // Extract tile RGBA buffer, depending on input type\n\n\n if (utils.isCanvas(from)) {\n if (!stageEnv.srcCtx) stageEnv.srcCtx = from.getContext('2d', {\n alpha: Boolean(opts.alpha)\n }); // If input is Canvas - extract region data directly\n\n this.debug('Get tile pixel data');\n extractTo.src = stageEnv.srcCtx.getImageData(tile.x, tile.y, tile.width, tile.height).data;\n return extractTo;\n } // If input is Image or decoded to ImageBitmap,\n // draw region to temporary canvas and extract data from it\n //\n // Note! Attempt to reuse this canvas causes significant slowdown in chrome\n //\n\n\n this.debug('Draw tile imageBitmap/image to temporary canvas');\n var tmpCanvas = this.options.createCanvas(tile.width, tile.height);\n var tmpCtx = tmpCanvas.getContext('2d', {\n alpha: Boolean(opts.alpha)\n });\n tmpCtx.globalCompositeOperation = 'copy';\n tmpCtx.drawImage(stageEnv.srcImageBitmap || from, tile.x, tile.y, tile.width, tile.height, 0, 0, tile.width, tile.height);\n this.debug('Get tile pixel data');\n extractTo.src = tmpCtx.getImageData(0, 0, tile.width, tile.height).data; // Safari 12 workaround\n // https://github.com/nodeca/pica/issues/199\n\n tmpCanvas.width = tmpCanvas.height = 0;\n return extractTo;\n};\n\nPica.prototype.__landTileData = function (tile, result, stageEnv) {\n var toImageData;\n this.debug('Convert raw rgba tile result to ImageData');\n\n if (result.bitmap) {\n stageEnv.toCtx.drawImage(result.bitmap, tile.toX, tile.toY);\n return null;\n }\n\n if (CAN_NEW_IMAGE_DATA) {\n // this branch is for modern browsers\n // If `new ImageData()` & Uint8ClampedArray suported\n toImageData = new ImageData(new Uint8ClampedArray(result.data), tile.toWidth, tile.toHeight);\n } else {\n // fallback for `node-canvas` and old browsers\n // (IE11 has ImageData but does not support `new ImageData()`)\n toImageData = stageEnv.toCtx.createImageData(tile.toWidth, tile.toHeight);\n\n if (toImageData.data.set) {\n toImageData.data.set(result.data);\n } else {\n // IE9 don't have `.set()`\n for (var i = toImageData.data.length - 1; i >= 0; i--) {\n toImageData.data[i] = result.data[i];\n }\n }\n }\n\n this.debug('Draw tile');\n\n if (NEED_SAFARI_FIX) {\n // Safari draws thin white stripes between tiles without this fix\n stageEnv.toCtx.putImageData(toImageData, tile.toX, tile.toY, tile.toInnerX - tile.toX, tile.toInnerY - tile.toY, tile.toInnerWidth + 1e-5, tile.toInnerHeight + 1e-5);\n } else {\n stageEnv.toCtx.putImageData(toImageData, tile.toX, tile.toY, tile.toInnerX - tile.toX, tile.toInnerY - tile.toY, tile.toInnerWidth, tile.toInnerHeight);\n }\n\n return null;\n};\n\nPica.prototype.__tileAndResize = function (from, to, opts) {\n var _this3 = this;\n\n var stageEnv = {\n srcCtx: null,\n srcImageBitmap: null,\n isImageBitmapReused: false,\n toCtx: null\n };\n\n var processTile = function processTile(tile) {\n return _this3.__limit(function () {\n if (opts.canceled) return opts.cancelToken;\n var tileOpts = {\n width: tile.width,\n height: tile.height,\n toWidth: tile.toWidth,\n toHeight: tile.toHeight,\n scaleX: tile.scaleX,\n scaleY: tile.scaleY,\n offsetX: tile.offsetX,\n offsetY: tile.offsetY,\n quality: opts.quality,\n alpha: opts.alpha,\n unsharpAmount: opts.unsharpAmount,\n unsharpRadius: opts.unsharpRadius,\n unsharpThreshold: opts.unsharpThreshold\n };\n\n _this3.debug('Invoke resize math');\n\n return Promise.resolve(tileOpts).then(function (tileOpts) {\n return _this3.__extractTileData(tile, from, opts, stageEnv, tileOpts);\n }).then(function (tileOpts) {\n _this3.debug('Invoke resize math');\n\n return _this3.__invokeResize(tileOpts, opts);\n }).then(function (result) {\n if (opts.canceled) return opts.cancelToken;\n stageEnv.srcImageData = null;\n return _this3.__landTileData(tile, result, stageEnv);\n });\n });\n }; // Need to normalize data source first. It can be canvas or image.\n // If image - try to decode in background if possible\n\n\n return Promise.resolve().then(function () {\n stageEnv.toCtx = to.getContext('2d', {\n alpha: Boolean(opts.alpha)\n });\n if (utils.isCanvas(from)) return null;\n\n if (utils.isImageBitmap(from)) {\n stageEnv.srcImageBitmap = from;\n stageEnv.isImageBitmapReused = true;\n return null;\n }\n\n if (utils.isImage(from)) {\n // try do decode image in background for faster next operations;\n // if we're using offscreen canvas, cib is called per tile, so not needed here\n if (!CAN_CREATE_IMAGE_BITMAP) return null;\n\n _this3.debug('Decode image via createImageBitmap');\n\n return createImageBitmap(from).then(function (imageBitmap) {\n stageEnv.srcImageBitmap = imageBitmap;\n }) // Suppress error to use fallback, if method fails\n // https://github.com/nodeca/pica/issues/190\n\n /* eslint-disable no-unused-vars */\n [\"catch\"](function (e) {\n return null;\n });\n }\n\n throw new Error('Pica: \".from\" should be Image, Canvas or ImageBitmap');\n }).then(function () {\n if (opts.canceled) return opts.cancelToken;\n\n _this3.debug('Calculate tiles'); //\n // Here we are with \"normalized\" source,\n // follow to tiling\n //\n\n\n var regions = createRegions({\n width: opts.width,\n height: opts.height,\n srcTileSize: _this3.options.tile,\n toWidth: opts.toWidth,\n toHeight: opts.toHeight,\n destTileBorder: opts.__destTileBorder\n });\n var jobs = regions.map(function (tile) {\n return processTile(tile);\n });\n\n function cleanup(stageEnv) {\n if (stageEnv.srcImageBitmap) {\n if (!stageEnv.isImageBitmapReused) stageEnv.srcImageBitmap.close();\n stageEnv.srcImageBitmap = null;\n }\n }\n\n _this3.debug('Process tiles');\n\n return Promise.all(jobs).then(function () {\n _this3.debug('Finished!');\n\n cleanup(stageEnv);\n return to;\n }, function (err) {\n cleanup(stageEnv);\n throw err;\n });\n });\n};\n\nPica.prototype.__processStages = function (stages, from, to, opts) {\n var _this4 = this;\n\n if (opts.canceled) return opts.cancelToken;\n\n var _stages$shift = stages.shift(),\n _stages$shift2 = _slicedToArray(_stages$shift, 2),\n toWidth = _stages$shift2[0],\n toHeight = _stages$shift2[1];\n\n var isLastStage = stages.length === 0;\n opts = assign({}, opts, {\n toWidth: toWidth,\n toHeight: toHeight,\n // only use user-defined quality for the last stage,\n // use simpler (Hamming) filter for the first stages where\n // scale factor is large enough (more than 2-3)\n quality: isLastStage ? opts.quality : Math.min(1, opts.quality)\n });\n var tmpCanvas;\n\n if (!isLastStage) {\n // create temporary canvas\n tmpCanvas = this.options.createCanvas(toWidth, toHeight);\n }\n\n return this.__tileAndResize(from, isLastStage ? to : tmpCanvas, opts).then(function () {\n if (isLastStage) return to;\n opts.width = toWidth;\n opts.height = toHeight;\n return _this4.__processStages(stages, tmpCanvas, to, opts);\n }).then(function (res) {\n if (tmpCanvas) {\n // Safari 12 workaround\n // https://github.com/nodeca/pica/issues/199\n tmpCanvas.width = tmpCanvas.height = 0;\n }\n\n return res;\n });\n};\n\nPica.prototype.__resizeViaCreateImageBitmap = function (from, to, opts) {\n var _this5 = this;\n\n var toCtx = to.getContext('2d', {\n alpha: Boolean(opts.alpha)\n });\n this.debug('Resize via createImageBitmap()');\n return createImageBitmap(from, {\n resizeWidth: opts.toWidth,\n resizeHeight: opts.toHeight,\n resizeQuality: utils.cib_quality_name(opts.quality)\n }).then(function (imageBitmap) {\n if (opts.canceled) return opts.cancelToken; // if no unsharp - draw directly to output canvas\n\n if (!opts.unsharpAmount) {\n toCtx.drawImage(imageBitmap, 0, 0);\n imageBitmap.close();\n toCtx = null;\n\n _this5.debug('Finished!');\n\n return to;\n }\n\n _this5.debug('Unsharp result');\n\n var tmpCanvas = _this5.options.createCanvas(opts.toWidth, opts.toHeight);\n\n var tmpCtx = tmpCanvas.getContext('2d', {\n alpha: Boolean(opts.alpha)\n });\n tmpCtx.drawImage(imageBitmap, 0, 0);\n imageBitmap.close();\n var iData = tmpCtx.getImageData(0, 0, opts.toWidth, opts.toHeight);\n\n _this5.__mathlib.unsharp_mask(iData.data, opts.toWidth, opts.toHeight, opts.unsharpAmount, opts.unsharpRadius, opts.unsharpThreshold);\n\n toCtx.putImageData(iData, 0, 0); // Safari 12 workaround\n // https://github.com/nodeca/pica/issues/199\n\n tmpCanvas.width = tmpCanvas.height = 0;\n iData = tmpCtx = tmpCanvas = toCtx = null;\n\n _this5.debug('Finished!');\n\n return to;\n });\n};\n\nPica.prototype.resize = function (from, to, options) {\n var _this6 = this;\n\n this.debug('Start resize...');\n var opts = assign({}, DEFAULT_RESIZE_OPTS);\n\n if (!isNaN(options)) {\n opts = assign(opts, {\n quality: options\n });\n } else if (options) {\n opts = assign(opts, options);\n }\n\n opts.toWidth = to.width;\n opts.toHeight = to.height;\n opts.width = from.naturalWidth || from.width;\n opts.height = from.naturalHeight || from.height; // Prevent stepper from infinite loop\n\n if (to.width === 0 || to.height === 0) {\n return Promise.reject(new Error(\"Invalid output size: \".concat(to.width, \"x\").concat(to.height)));\n }\n\n if (opts.unsharpRadius > 2) opts.unsharpRadius = 2;\n opts.canceled = false;\n\n if (opts.cancelToken) {\n // Wrap cancelToken to avoid successive resolve & set flag\n opts.cancelToken = opts.cancelToken.then(function (data) {\n opts.canceled = true;\n throw data;\n }, function (err) {\n opts.canceled = true;\n throw err;\n });\n }\n\n var DEST_TILE_BORDER = 3; // Max possible filter window size\n\n opts.__destTileBorder = Math.ceil(Math.max(DEST_TILE_BORDER, 2.5 * opts.unsharpRadius | 0));\n return this.init().then(function () {\n if (opts.canceled) return opts.cancelToken; // if createImageBitmap supports resize, just do it and return\n\n if (_this6.features.cib) {\n return _this6.__resizeViaCreateImageBitmap(from, to, opts);\n }\n\n if (!CAN_USE_CANVAS_GET_IMAGE_DATA) {\n var err = new Error('Pica: cannot use getImageData on canvas, ' + \"make sure fingerprinting protection isn't enabled\");\n err.code = 'ERR_GET_IMAGE_DATA';\n throw err;\n } //\n // No easy way, let's resize manually via arrays\n //\n\n\n var stages = createStages(opts.width, opts.height, opts.toWidth, opts.toHeight, _this6.options.tile, opts.__destTileBorder);\n return _this6.__processStages(stages, from, to, opts);\n });\n}; // RGBA buffer resize\n//\n\n\nPica.prototype.resizeBuffer = function (options) {\n var _this7 = this;\n\n var opts = assign({}, DEFAULT_RESIZE_OPTS, options);\n return this.init().then(function () {\n return _this7.__mathlib.resizeAndUnsharp(opts);\n });\n};\n\nPica.prototype.toBlob = function (canvas, mimeType, quality) {\n mimeType = mimeType || 'image/png';\n return new Promise(function (resolve) {\n if (canvas.toBlob) {\n canvas.toBlob(function (blob) {\n return resolve(blob);\n }, mimeType, quality);\n return;\n }\n\n if (canvas.convertToBlob) {\n resolve(canvas.convertToBlob({\n type: mimeType,\n quality: quality\n }));\n return;\n } // Fallback for old browsers\n\n\n var asString = atob(canvas.toDataURL(mimeType, quality).split(',')[1]);\n var len = asString.length;\n var asBuffer = new Uint8Array(len);\n\n for (var i = 0; i < len; i++) {\n asBuffer[i] = asString.charCodeAt(i);\n }\n\n resolve(new Blob([asBuffer], {\n type: mimeType\n }));\n });\n};\n\nPica.prototype.debug = function () {};\n\nmodule.exports = Pica;\n\n},{\"./lib/mathlib\":1,\"./lib/pool\":13,\"./lib/stepper\":14,\"./lib/tiler\":15,\"./lib/utils\":16,\"./lib/worker\":17,\"object-assign\":23,\"webworkify\":24}]},{},[])(\"/index.js\")\n});\n});\n\nvar image_traverse = createCommonjsModule(function (module) {\n\n//////////////////////////////////////////////////////////////////////////\n// Helpers\n//\nfunction error(message, code) {\n var err = new Error(message);\n err.code = code;\n return err;\n}\n\n\n// Convert number to 0xHH string\n//\nfunction to_hex(number) {\n var n = number.toString(16).toUpperCase();\n for (var i = 2 - n.length; i > 0; i--) n = '0' + n;\n return '0x' + n;\n}\n\n\nfunction utf8_encode(str) {\n try {\n return unescape(encodeURIComponent(str));\n } catch (_) {\n return str;\n }\n}\n\n\nfunction utf8_decode(str) {\n try {\n return decodeURIComponent(escape(str));\n } catch (_) {\n return str;\n }\n}\n\n\n// Check if input is a Uint8Array\n//\nfunction is_uint8array(bin) {\n return Object.prototype.toString.call(bin) === '[object Uint8Array]';\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n// Exif parser\n//\n// Input:\n// - jpeg_bin: Uint8Array - jpeg file\n// - exif_start: Number - start of TIFF header (after Exif\\0\\0)\n// - exif_end: Number - end of Exif segment\n// - on_entry: Number - callback\n//\nfunction ExifParser(jpeg_bin, exif_start, exif_end) {\n // Uint8Array, exif without signature (which isn't included in offsets)\n this.input = jpeg_bin.subarray(exif_start, exif_end);\n\n // offset correction for `on_entry` callback\n this.start = exif_start;\n\n // Check TIFF header (includes byte alignment and first IFD offset)\n var sig = String.fromCharCode.apply(null, this.input.subarray(0, 4));\n\n if (sig !== 'II\\x2A\\0' && sig !== 'MM\\0\\x2A') {\n throw error('invalid TIFF signature', 'EBADDATA');\n }\n\n // true if motorola (big endian) byte alignment, false if intel\n this.big_endian = sig[0] === 'M';\n}\n\n\nExifParser.prototype.each = function (on_entry) {\n // allow premature exit\n this.aborted = false;\n\n var offset = this.read_uint32(4);\n\n this.ifds_to_read = [ {\n id: 0,\n offset: offset\n } ];\n\n while (this.ifds_to_read.length > 0 && !this.aborted) {\n var i = this.ifds_to_read.shift();\n if (!i.offset) continue;\n this.scan_ifd(i.id, i.offset, on_entry);\n }\n};\n\n\nExifParser.prototype.filter = function (on_entry) {\n var ifds = {};\n\n // make sure IFD0 always exists\n ifds.ifd0 = { id: 0, entries: [] };\n\n this.each(function (entry) {\n if (on_entry(entry) === false && !entry.is_subifd_link) return;\n if (entry.is_subifd_link && entry.count !== 1 && entry.format !== 4) return; // filter out bogus links\n\n if (!ifds['ifd' + entry.ifd]) {\n ifds['ifd' + entry.ifd] = { id: entry.ifd, entries: [] };\n }\n\n ifds['ifd' + entry.ifd].entries.push(entry);\n });\n\n // thumbnails are not supported just yet, so delete all information related to it\n delete ifds.ifd1;\n\n // Calculate output size\n var length = 8;\n Object.keys(ifds).forEach(function (ifd_no) {\n length += 2;\n\n ifds[ifd_no].entries.forEach(function (entry) {\n length += 12 + (entry.data_length > 4 ? Math.ceil(entry.data_length / 2) * 2 : 0);\n });\n\n length += 4;\n });\n\n this.output = new Uint8Array(length);\n this.output[0] = this.output[1] = (this.big_endian ? 'M' : 'I').charCodeAt(0);\n this.write_uint16(2, 0x2A);\n\n var offset = 8;\n var self = this;\n this.write_uint32(4, offset);\n\n Object.keys(ifds).forEach(function (ifd_no) {\n ifds[ifd_no].written_offset = offset;\n\n var ifd_start = offset;\n var ifd_end = ifd_start + 2 + ifds[ifd_no].entries.length * 12 + 4;\n offset = ifd_end;\n\n self.write_uint16(ifd_start, ifds[ifd_no].entries.length);\n\n ifds[ifd_no].entries.sort(function (a, b) {\n // IFD entries must be in order of increasing tag IDs\n return a.tag - b.tag;\n }).forEach(function (entry, idx) {\n var entry_offset = ifd_start + 2 + idx * 12;\n\n self.write_uint16(entry_offset, entry.tag);\n self.write_uint16(entry_offset + 2, entry.format);\n self.write_uint32(entry_offset + 4, entry.count);\n\n if (entry.is_subifd_link) {\n // filled in later\n if (ifds['ifd' + entry.tag]) ifds['ifd' + entry.tag].link_offset = entry_offset + 8;\n } else if (entry.data_length <= 4) {\n self.output.set(\n self.input.subarray(entry.data_offset - self.start, entry.data_offset - self.start + 4),\n entry_offset + 8\n );\n } else {\n self.write_uint32(entry_offset + 8, offset);\n self.output.set(\n self.input.subarray(entry.data_offset - self.start, entry.data_offset - self.start + entry.data_length),\n offset\n );\n offset += Math.ceil(entry.data_length / 2) * 2;\n }\n });\n\n var next_ifd = ifds['ifd' + (ifds[ifd_no].id + 1)];\n if (next_ifd) next_ifd.link_offset = ifd_end - 4;\n });\n\n Object.keys(ifds).forEach(function (ifd_no) {\n if (ifds[ifd_no].written_offset && ifds[ifd_no].link_offset) {\n self.write_uint32(ifds[ifd_no].link_offset, ifds[ifd_no].written_offset);\n }\n });\n\n if (this.output.length !== offset) throw error('internal error: incorrect buffer size allocated');\n\n return this.output;\n};\n\n\nExifParser.prototype.read_uint16 = function (offset) {\n var d = this.input;\n if (offset + 2 > d.length) throw error('unexpected EOF', 'EBADDATA');\n\n return this.big_endian ?\n d[offset] * 0x100 + d[offset + 1] :\n d[offset] + d[offset + 1] * 0x100;\n};\n\n\nExifParser.prototype.read_uint32 = function (offset) {\n var d = this.input;\n if (offset + 4 > d.length) throw error('unexpected EOF', 'EBADDATA');\n\n return this.big_endian ?\n d[offset] * 0x1000000 + d[offset + 1] * 0x10000 + d[offset + 2] * 0x100 + d[offset + 3] :\n d[offset] + d[offset + 1] * 0x100 + d[offset + 2] * 0x10000 + d[offset + 3] * 0x1000000;\n};\n\n\nExifParser.prototype.write_uint16 = function (offset, value) {\n var d = this.output;\n\n if (this.big_endian) {\n d[offset] = (value >>> 8) & 0xFF;\n d[offset + 1] = value & 0xFF;\n } else {\n d[offset] = value & 0xFF;\n d[offset + 1] = (value >>> 8) & 0xFF;\n }\n};\n\n\nExifParser.prototype.write_uint32 = function (offset, value) {\n var d = this.output;\n\n if (this.big_endian) {\n d[offset] = (value >>> 24) & 0xFF;\n d[offset + 1] = (value >>> 16) & 0xFF;\n d[offset + 2] = (value >>> 8) & 0xFF;\n d[offset + 3] = value & 0xFF;\n } else {\n d[offset] = value & 0xFF;\n d[offset + 1] = (value >>> 8) & 0xFF;\n d[offset + 2] = (value >>> 16) & 0xFF;\n d[offset + 3] = (value >>> 24) & 0xFF;\n }\n};\n\n\nExifParser.prototype.is_subifd_link = function (ifd, tag) {\n return (ifd === 0 && tag === 0x8769) || // SubIFD\n (ifd === 0 && tag === 0x8825) || // GPS Info\n (ifd === 0x8769 && tag === 0xA005); // Interop IFD\n};\n\n\n// Returns byte length of a single component of a given format\n//\nExifParser.prototype.exif_format_length = function (format) {\n switch (format) {\n case 1: // byte\n case 2: // ascii\n case 6: // sbyte\n case 7: // undefined\n return 1;\n\n case 3: // short\n case 8: // sshort\n return 2;\n\n case 4: // long\n case 9: // slong\n case 11: // float\n return 4;\n\n case 5: // rational\n case 10: // srational\n case 12: // double\n return 8;\n\n default:\n // unknown type\n return 0;\n }\n};\n\n\n// Reads Exif data\n//\nExifParser.prototype.exif_format_read = function (format, offset) {\n var v;\n\n switch (format) {\n case 1: // byte\n case 2: // ascii\n v = this.input[offset];\n return v;\n\n case 6: // sbyte\n v = this.input[offset];\n return v | (v & 0x80) * 0x1fffffe;\n\n case 3: // short\n v = this.read_uint16(offset);\n return v;\n\n case 8: // sshort\n v = this.read_uint16(offset);\n return v | (v & 0x8000) * 0x1fffe;\n\n case 4: // long\n v = this.read_uint32(offset);\n return v;\n\n case 9: // slong\n v = this.read_uint32(offset);\n return v | 0;\n\n case 5: // rational\n case 10: // srational\n case 11: // float\n case 12: // double\n return null; // not implemented\n\n case 7: // undefined\n return null; // blob\n\n default:\n // unknown type\n return null;\n }\n};\n\n\nExifParser.prototype.scan_ifd = function (ifd_no, offset, on_entry) {\n var entry_count = this.read_uint16(offset);\n\n offset += 2;\n\n for (var i = 0; i < entry_count; i++) {\n var tag = this.read_uint16(offset);\n var format = this.read_uint16(offset + 2);\n var count = this.read_uint32(offset + 4);\n\n var comp_length = this.exif_format_length(format);\n var data_length = count * comp_length;\n var data_offset = data_length <= 4 ? offset + 8 : this.read_uint32(offset + 8);\n var is_subifd_link = false;\n\n if (data_offset + data_length > this.input.length) {\n throw error('unexpected EOF', 'EBADDATA');\n }\n\n var value = [];\n var comp_offset = data_offset;\n\n for (var j = 0; j < count; j++, comp_offset += comp_length) {\n var item = this.exif_format_read(format, comp_offset);\n if (item === null) {\n value = null;\n break;\n }\n value.push(item);\n }\n\n if (Array.isArray(value) && format === 2) {\n try {\n value = utf8_decode(String.fromCharCode.apply(null, value));\n } catch (_) {\n value = null;\n }\n\n if (value && value[value.length - 1] === '\\0') value = value.slice(0, -1);\n }\n\n if (this.is_subifd_link(ifd_no, tag)) {\n if (Array.isArray(value) && Number.isInteger(value[0]) && value[0] > 0) {\n this.ifds_to_read.push({\n id: tag,\n offset: value[0]\n });\n is_subifd_link = true;\n }\n }\n\n var entry = {\n is_big_endian: this.big_endian,\n ifd: ifd_no,\n tag: tag,\n format: format,\n count: count,\n entry_offset: offset + this.start,\n data_length: data_length,\n data_offset: data_offset + this.start,\n value: value,\n is_subifd_link: is_subifd_link\n };\n\n if (on_entry(entry) === false) {\n this.aborted = true;\n return;\n }\n\n offset += 12;\n }\n\n if (ifd_no === 0) {\n this.ifds_to_read.push({\n id: 1,\n offset: this.read_uint32(offset)\n });\n }\n};\n\n\n// Check whether input is a JPEG image\n//\n// Input:\n// - jpeg_bin: Uint8Array - jpeg file\n//\n// Returns true if it is and false otherwise\n//\nmodule.exports.is_jpeg = function (jpeg_bin) {\n return jpeg_bin.length >= 4 && jpeg_bin[0] === 0xFF && jpeg_bin[1] === 0xD8 && jpeg_bin[2] === 0xFF;\n};\n\n\n// Call an iterator on each segment in the given JPEG image\n//\n// Input:\n// - jpeg_bin: Uint8Array - jpeg file\n// - on_segment: Function - callback executed on each JPEG marker segment\n// - segment: Object\n// - code: Number - marker type (2nd byte, e.g. 0xE0 for APP0)\n// - offset: Number - offset of the first byte (0xFF) relative to `jpeg_bin` start\n// - length: Number - length of the entire marker segment including first two bytes and length\n// - 2 for standalone markers\n// - 4+length for markers with data\n//\n// Iteration stops when `EOI` (0xFFD9) marker is reached or if `on_segment`\n// function returns `false`.\n//\nmodule.exports.jpeg_segments_each = function (jpeg_bin, on_segment) {\n if (!is_uint8array(jpeg_bin)) {\n throw error('Invalid argument (jpeg_bin), Uint8Array expected', 'EINVAL');\n }\n\n if (typeof on_segment !== 'function') {\n throw error('Invalid argument (on_segment), Function expected', 'EINVAL');\n }\n\n if (!module.exports.is_jpeg(jpeg_bin)) {\n throw error('Unknown file format', 'ENOTJPEG');\n }\n\n var offset = 0, length = jpeg_bin.length, inside_scan = false;\n\n for (;;) {\n var segment_code, segment_length;\n\n if (offset + 1 >= length) throw error('Unexpected EOF', 'EBADDATA');\n var byte1 = jpeg_bin[offset];\n var byte2 = jpeg_bin[offset + 1];\n\n if (byte1 === 0xFF && byte2 === 0xFF) {\n // padding\n segment_code = 0xFF;\n segment_length = 1;\n\n } else if (byte1 === 0xFF && byte2 !== 0) {\n // marker\n segment_code = byte2;\n segment_length = 2;\n\n if ((0xD0 <= segment_code && segment_code <= 0xD9) || segment_code === 0x01) ; else {\n if (offset + 3 >= length) throw error('Unexpected EOF', 'EBADDATA');\n segment_length += jpeg_bin[offset + 2] * 0x100 + jpeg_bin[offset + 3];\n if (segment_length < 2) throw error('Invalid segment length', 'EBADDATA');\n if (offset + segment_length - 1 >= length) throw error('Unexpected EOF', 'EBADDATA');\n }\n\n if (inside_scan) {\n if (segment_code >= 0xD0 && segment_code <= 0xD7) ; else {\n inside_scan = false;\n }\n }\n\n if (segment_code === 0xDA /* SOS */) inside_scan = true;\n } else if (inside_scan) {\n // entropy-encoded segment\n for (var pos = offset + 1; ; pos++) {\n // scan until we find FF\n if (pos >= length) throw error('Unexpected EOF', 'EBADDATA');\n if (jpeg_bin[pos] === 0xFF) {\n if (pos + 1 >= length) throw error('Unexpected EOF', 'EBADDATA');\n if (jpeg_bin[pos + 1] !== 0) {\n segment_code = 0;\n segment_length = pos - offset;\n break;\n }\n }\n }\n } else {\n throw error('Unexpected byte at segment start: ' + to_hex(byte1) +\n ' (offset ' + to_hex(offset) + ')', 'EBADDATA');\n }\n\n if (on_segment({ code: segment_code, offset: offset, length: segment_length }) === false) break;\n if (segment_code === 0xD9 /* EOI */) break;\n offset += segment_length;\n }\n};\n\n\n// Replace or remove segments in the given JPEG image\n//\n// Input:\n// - jpeg_bin: Uint8Array - jpeg file\n// - on_segment: Function - callback executed on each JPEG marker segment\n// - segment: Object\n// - code: Number - marker type (2nd byte, e.g. 0xE0 for APP0)\n// - offset: Number - offset of the first byte (0xFF) relative to `jpeg_bin` start\n// - length: Number - length of the entire marker segment including first two bytes and length\n// - 2 for standalone markers\n// - 4+length for markers with data\n//\n// `on_segment` function should return one of the following:\n// - `false` - segment is removed from the output\n// - Uint8Array - segment is replaced with the new data\n// - [ Uint8Array ] - segment is replaced with the new data\n// - anything else - segment is copied to the output as is\n//\n// Any data after `EOI` (0xFFD9) marker is removed.\n//\nmodule.exports.jpeg_segments_filter = function (jpeg_bin, on_segment) {\n if (!is_uint8array(jpeg_bin)) {\n throw error('Invalid argument (jpeg_bin), Uint8Array expected', 'EINVAL');\n }\n\n if (typeof on_segment !== 'function') {\n throw error('Invalid argument (on_segment), Function expected', 'EINVAL');\n }\n\n var ranges = [];\n var out_length = 0;\n\n module.exports.jpeg_segments_each(jpeg_bin, function (segment) {\n var new_segment = on_segment(segment);\n\n if (is_uint8array(new_segment)) {\n ranges.push({ data: new_segment });\n out_length += new_segment.length;\n } else if (Array.isArray(new_segment)) {\n new_segment.filter(is_uint8array).forEach(function (s) {\n ranges.push({ data: s });\n out_length += s.length;\n });\n } else if (new_segment !== false) {\n var new_range = { start: segment.offset, end: segment.offset + segment.length };\n\n if (ranges.length > 0 && ranges[ranges.length - 1].end === new_range.start) {\n ranges[ranges.length - 1].end = new_range.end;\n } else {\n ranges.push(new_range);\n }\n\n out_length += segment.length;\n }\n });\n\n var result = new Uint8Array(out_length);\n var offset = 0;\n\n ranges.forEach(function (range) {\n var data = range.data || jpeg_bin.subarray(range.start, range.end);\n result.set(data, offset);\n offset += data.length;\n });\n\n return result;\n};\n\n\n// Call an iterator on each Exif entry in the given JPEG image\n//\n// Input:\n// - jpeg_bin: Uint8Array - jpeg file\n// - on_entry: Function - callback executed on each Exif entry\n// - entry: Object\n// - is_big_endian: Boolean - whether Exif uses big or little endian byte alignment\n// - ifd: Number - IFD identifier (0 for IFD0, 1 for IFD1, 0x8769 for SubIFD,\n// 0x8825 for GPS Info, 0xA005 for Interop IFD)\n// - tag: Number - exif entry tag (0x0110 - camera name, 0x0112 - orientation, etc. - see Exif spec)\n// - format: Number - exif entry format (1 - byte, 2 - ascii, 3 - short, etc. - see Exif spec)\n// - count: Number - number of components of the given format inside data\n// (usually 1, or string length for ascii format)\n// - entry_offset: Number - start of Exif entry (entry length is always 12, so not included)\n// - data_offset: Number - start of data attached to Exif entry (will overlap with entry if length <= 4)\n// - data_length: Number - length of data attached to Exif entry\n// - value: Array|String|Null - our best attempt at parsing data (not all formats supported right now)\n// - is_subifd_link: Boolean - whether this entry is recognized to be a link to subifd (can't filter these out)\n//\n// Iteration stops early if iterator returns `false`.\n//\n// If Exif wasn't found anywhere (before start of the image data, SOS),\n// iterator is never executed.\n//\nmodule.exports.jpeg_exif_tags_each = function (jpeg_bin, on_exif_entry) {\n if (!is_uint8array(jpeg_bin)) {\n throw error('Invalid argument (jpeg_bin), Uint8Array expected', 'EINVAL');\n }\n\n if (typeof on_exif_entry !== 'function') {\n throw error('Invalid argument (on_exif_entry), Function expected', 'EINVAL');\n }\n\n /* eslint-disable consistent-return */\n module.exports.jpeg_segments_each(jpeg_bin, function (segment) {\n if (segment.code === 0xDA /* SOS */) return false;\n\n // look for APP1 segment and compare header with 'Exif\\0\\0'\n if (segment.code === 0xE1 && segment.length >= 10 &&\n jpeg_bin[segment.offset + 4] === 0x45 && jpeg_bin[segment.offset + 5] === 0x78 &&\n jpeg_bin[segment.offset + 6] === 0x69 && jpeg_bin[segment.offset + 7] === 0x66 &&\n jpeg_bin[segment.offset + 8] === 0x00 && jpeg_bin[segment.offset + 9] === 0x00) {\n\n new ExifParser(jpeg_bin, segment.offset + 10, segment.offset + segment.length).each(on_exif_entry);\n return false;\n }\n });\n};\n\n\n// Remove Exif entries in the given JPEG image\n//\n// Input:\n// - jpeg_bin: Uint8Array - jpeg file\n// - on_entry: Function - callback executed on each Exif entry\n// - entry: Object\n// - is_big_endian: Boolean - whether Exif uses big or little endian byte alignment\n// - ifd: Number - IFD identifier (0 for IFD0, 1 for IFD1, 0x8769 for SubIFD,\n// 0x8825 for GPS Info, 0xA005 for Interop IFD)\n// - tag: Number - exif entry tag (0x0110 - camera name, 0x0112 - orientation, etc. - see Exif spec)\n// - format: Number - exif entry format (1 - byte, 2 - ascii, 3 - short, etc. - see Exif spec)\n// - count: Number - number of components of the given format inside data\n// (usually 1, or string length for ascii format)\n// - entry_offset: Number - start of Exif entry (entry length is always 12, so not included)\n// - data_offset: Number - start of data attached to Exif entry (will overlap with entry if length <= 4)\n// - data_length: Number - length of data attached to Exif entry\n// - value: Array|String|Null - our best attempt at parsing data (not all formats supported right now)\n// - is_subifd_link: Boolean - whether this entry is recognized to be a link to subifd (can't filter these out)\n//\n// This function removes following from Exif:\n// - all entries where iterator returned false (except subifd links which are mandatory)\n// - IFD1 and thumbnail image (the purpose of this function is to reduce file size,\n// so thumbnail is usually the first thing to go)\n// - all other data that isn't in IFD0, SubIFD, GPSIFD, InteropIFD\n// (theoretically possible proprietary extensions, I haven't seen any of these yet)\n//\n// Changing data inside Exif entries is NOT supported yet (modifying `entry` object inside callback may break stuff).\n//\n// If Exif wasn't found anywhere (before start of the image data, SOS),\n// iterator is never executed, and original JPEG is returned as is.\n//\nmodule.exports.jpeg_exif_tags_filter = function (jpeg_bin, on_exif_entry) {\n if (!is_uint8array(jpeg_bin)) {\n throw error('Invalid argument (jpeg_bin), Uint8Array expected', 'EINVAL');\n }\n\n if (typeof on_exif_entry !== 'function') {\n throw error('Invalid argument (on_exif_entry), Function expected', 'EINVAL');\n }\n\n var stop_search = false;\n\n return module.exports.jpeg_segments_filter(jpeg_bin, function (segment) {\n if (stop_search) return;\n if (segment.code === 0xDA /* SOS */) stop_search = true;\n\n // look for APP1 segment and compare header with 'Exif\\0\\0'\n if (segment.code === 0xE1 && segment.length >= 10 &&\n jpeg_bin[segment.offset + 4] === 0x45 && jpeg_bin[segment.offset + 5] === 0x78 &&\n jpeg_bin[segment.offset + 6] === 0x69 && jpeg_bin[segment.offset + 7] === 0x66 &&\n jpeg_bin[segment.offset + 8] === 0x00 && jpeg_bin[segment.offset + 9] === 0x00) {\n\n var new_exif = new ExifParser(jpeg_bin, segment.offset + 10, segment.offset + segment.length)\n .filter(on_exif_entry);\n if (!new_exif) return false;\n\n var header = new Uint8Array(10);\n\n header.set(jpeg_bin.slice(segment.offset, segment.offset + 10));\n header[2] = ((new_exif.length + 8) >>> 8) & 0xFF;\n header[3] = (new_exif.length + 8) & 0xFF;\n\n stop_search = true;\n return [ header, new_exif ];\n }\n });\n};\n\n\n// Inserts a custom comment marker segment into JPEG file.\n//\n// Input:\n// - jpeg_bin: Uint8Array - jpeg file\n// - comment: String\n//\n// Comment is inserted after first two bytes (FFD8, SOI).\n//\n// If JFIF (APP0) marker exists immediately after SOI (as mandated by the JFIF\n// spec), we insert comment after it instead.\n//\nmodule.exports.jpeg_add_comment = function (jpeg_bin, comment) {\n var comment_inserted = false, segment_count = 0;\n\n return module.exports.jpeg_segments_filter(jpeg_bin, function (segment) {\n segment_count++;\n if (segment_count === 1 && segment.code === 0xD8 /* SOI */) return;\n if (segment_count === 2 && segment.code === 0xE0 /* APP0 */) return;\n\n if (comment_inserted) return;\n comment = utf8_encode(comment);\n\n // comment segment\n var csegment = new Uint8Array(5 + comment.length);\n var offset = 0;\n\n csegment[offset++] = 0xFF;\n csegment[offset++] = 0xFE;\n csegment[offset++] = ((comment.length + 3) >>> 8) & 0xFF;\n csegment[offset++] = (comment.length + 3) & 0xFF;\n\n comment.split('').forEach(function (c) {\n csegment[offset++] = c.charCodeAt(0) & 0xFF;\n });\n\n csegment[offset++] = 0;\n comment_inserted = true;\n\n return [ csegment, jpeg_bin.subarray(segment.offset, segment.offset + segment.length) ];\n });\n};\n});\n\nfunction jpeg_patch_exif(env) {\n return this._getUint8Array(env.blob).then(function (data) {\n env.is_jpeg = image_traverse.is_jpeg(data);\n\n if (!env.is_jpeg) return Promise.resolve(env);\n\n env.orig_blob = env.blob;\n\n try {\n var exif_is_big_endian, orientation_offset;\n\n /* eslint-disable consistent-return */\n image_traverse.jpeg_exif_tags_each(data, function (entry) {\n if (entry.ifd === 0 && entry.tag === 0x112 && Array.isArray(entry.value)) {\n env.orientation = entry.value[0] || 1;\n exif_is_big_endian = entry.is_big_endian;\n orientation_offset = entry.data_offset;\n return false;\n }\n });\n\n if (orientation_offset) {\n var orientation_patch = exif_is_big_endian ?\n new Uint8Array([ 0, 1 ]) :\n new Uint8Array([ 1, 0 ]);\n\n env.blob = new Blob([\n data.slice(0, orientation_offset),\n orientation_patch,\n data.slice(orientation_offset + 2)\n ], { type: 'image/jpeg' });\n }\n } catch (_) {}\n\n return env;\n });\n}\n\n\nfunction jpeg_rotate_canvas(env) {\n if (!env.is_jpeg) return Promise.resolve(env);\n\n var orientation = env.orientation - 1;\n if (!orientation) return Promise.resolve(env);\n\n var canvas;\n\n if (orientation & 4) {\n canvas = this.pica.options.createCanvas(env.out_canvas.height, env.out_canvas.width);\n } else {\n canvas = this.pica.options.createCanvas(env.out_canvas.width, env.out_canvas.height);\n }\n\n var ctx = canvas.getContext('2d');\n\n ctx.save();\n\n if (orientation & 1) ctx.transform(-1, 0, 0, 1, canvas.width, 0);\n if (orientation & 2) ctx.transform(-1, 0, 0, -1, canvas.width, canvas.height);\n if (orientation & 4) ctx.transform(0, 1, 1, 0, 0, 0);\n\n ctx.drawImage(env.out_canvas, 0, 0);\n ctx.restore();\n\n // Safari 12 workaround\n // https://github.com/nodeca/pica/issues/199\n env.out_canvas.width = env.out_canvas.height = 0;\n\n env.out_canvas = canvas;\n\n return Promise.resolve(env);\n}\n\n\nfunction jpeg_attach_orig_segments(env) {\n if (!env.is_jpeg) return Promise.resolve(env);\n\n return Promise.all([\n this._getUint8Array(env.blob),\n this._getUint8Array(env.out_blob)\n ]).then(function (res) {\n var data = res[0];\n var data_out = res[1];\n\n if (!image_traverse.is_jpeg(data)) return Promise.resolve(env);\n\n var segments = [];\n\n image_traverse.jpeg_segments_each(data, function (segment) {\n if (segment.code === 0xDA /* SOS */) return false;\n segments.push(segment);\n });\n\n segments = segments\n .filter(function (segment) {\n // Drop ICC_PROFILE\n //\n if (segment.code === 0xE2) return false;\n\n // Keep all APPn segments excluding APP2 (ICC_PROFILE),\n // remove others because most of them depend on image data (DCT and such).\n //\n // APP0 - JFIF, APP1 - Exif, the rest are photoshop metadata and such\n //\n // See full list at https://www.w3.org/Graphics/JPEG/itu-t81.pdf (table B.1 on page 32)\n //\n if (segment.code >= 0xE0 && segment.code < 0xF0) return true;\n\n // Keep comments\n //\n if (segment.code === 0xFE) return true;\n\n return false;\n })\n .map(function (segment) {\n return data.slice(segment.offset, segment.offset + segment.length);\n });\n\n env.out_blob = new Blob(\n // intentionally omitting expected JFIF segment (offset 2 to 20)\n [ data_out.slice(0, 2) ].concat(segments).concat([ data_out.slice(20) ]),\n { type: 'image/jpeg' }\n );\n\n return env;\n });\n}\n\n\nfunction assign(reducer) {\n reducer.before('_blob_to_image', jpeg_patch_exif);\n reducer.after('_transform', jpeg_rotate_canvas);\n reducer.after('_create_blob', jpeg_attach_orig_segments);\n}\n\n\nvar jpeg_patch_exif_1 = jpeg_patch_exif;\nvar jpeg_rotate_canvas_1 = jpeg_rotate_canvas;\nvar jpeg_attach_orig_segments_1 = jpeg_attach_orig_segments;\nvar assign_1 = assign;\n\nvar jpeg_plugins = {\n\tjpeg_patch_exif: jpeg_patch_exif_1,\n\tjpeg_rotate_canvas: jpeg_rotate_canvas_1,\n\tjpeg_attach_orig_segments: jpeg_attach_orig_segments_1,\n\tassign: assign_1\n};\n\nfunction ImageBlobReduce(options) {\n if (!(this instanceof ImageBlobReduce)) return new ImageBlobReduce(options);\n\n options = options || {};\n\n this.pica = options.pica || pica({});\n this.initialized = false;\n\n this.utils = utils;\n}\n\n\nImageBlobReduce.prototype.use = function (plugin /*, params, ... */) {\n var args = [ this ].concat(Array.prototype.slice.call(arguments, 1));\n plugin.apply(plugin, args);\n return this;\n};\n\n\nImageBlobReduce.prototype.init = function () {\n this.use(jpeg_plugins.assign);\n};\n\n\nImageBlobReduce.prototype.toBlob = function (blob, options) {\n var opts = utils.assign({ max: Infinity }, options);\n var env = {\n blob: blob,\n opts: opts\n };\n\n if (!this.initialized) {\n this.init();\n this.initialized = true;\n }\n\n return Promise.resolve(env)\n .then(this._blob_to_image)\n .then(this._calculate_size)\n .then(this._transform)\n .then(this._cleanup)\n .then(this._create_blob)\n .then(function (_env) {\n // Safari 12 workaround\n // https://github.com/nodeca/pica/issues/199\n _env.out_canvas.width = _env.out_canvas.height = 0;\n\n return _env.out_blob;\n });\n};\n\n\nImageBlobReduce.prototype.toCanvas = function (blob, options) {\n var opts = utils.assign({ max: Infinity }, options);\n var env = {\n blob: blob,\n opts: opts\n };\n\n if (!this.initialized) {\n this.init();\n this.initialized = true;\n }\n\n return Promise.resolve(env)\n .then(this._blob_to_image)\n .then(this._calculate_size)\n .then(this._transform)\n .then(this._cleanup)\n .then(function (_env) { return _env.out_canvas; });\n};\n\n\nImageBlobReduce.prototype.before = function (method_name, fn) {\n if (!this[method_name]) throw new Error('Method \"' + method_name + '\" does not exist');\n if (typeof fn !== 'function') throw new Error('Invalid argument \"fn\", function expected');\n\n var old_fn = this[method_name];\n var self = this;\n\n this[method_name] = function (env) {\n return fn.call(self, env).then(function (_env) {\n return old_fn.call(self, _env);\n });\n };\n\n return this;\n};\n\n\nImageBlobReduce.prototype.after = function (method_name, fn) {\n if (!this[method_name]) throw new Error('Method \"' + method_name + '\" does not exist');\n if (typeof fn !== 'function') throw new Error('Invalid argument \"fn\", function expected');\n\n var old_fn = this[method_name];\n var self = this;\n\n this[method_name] = function (env) {\n return old_fn.call(self, env).then(function (_env) {\n return fn.call(self, _env);\n });\n };\n\n return this;\n};\n\n\nImageBlobReduce.prototype._blob_to_image = function (env) {\n var URL = window.URL || window.webkitURL || window.mozURL || window.msURL;\n\n env.image = document.createElement('img');\n env.image_url = URL.createObjectURL(env.blob);\n env.image.src = env.image_url;\n\n return new Promise(function (resolve, reject) {\n env.image.onerror = function () { reject(new Error('ImageBlobReduce: failed to create Image() from blob')); };\n env.image.onload = function () { resolve(env); };\n });\n};\n\n\nImageBlobReduce.prototype._calculate_size = function (env) {\n //\n // Note, if your need not \"symmetric\" resize logic, you MUST check\n // `env.orientation` (set by plugins) and swap width/height appropriately.\n //\n var scale_factor = env.opts.max / Math.max(env.image.width, env.image.height);\n\n if (scale_factor > 1) scale_factor = 1;\n\n env.transform_width = Math.max(Math.round(env.image.width * scale_factor), 1);\n env.transform_height = Math.max(Math.round(env.image.height * scale_factor), 1);\n\n // Info for user plugins, to check if scaling applied\n env.scale_factor = scale_factor;\n\n return Promise.resolve(env);\n};\n\n\nImageBlobReduce.prototype._transform = function (env) {\n env.out_canvas = this.pica.options.createCanvas(env.transform_width, env.transform_height);\n\n // Dim env temporary vars to prohibit use and avoid confusion when orientation\n // changed. You should take real size from canvas.\n env.transform_width = null;\n env.transform_height = null;\n\n // By default use alpha for png only\n var pica_opts = { alpha: env.blob.type === 'image/png' };\n\n // Extract pica options if been passed\n this.utils.assign(pica_opts, this.utils.pick_pica_resize_options(env.opts));\n\n return this.pica\n .resize(env.image, env.out_canvas, pica_opts)\n .then(function () { return env; });\n};\n\n\nImageBlobReduce.prototype._cleanup = function (env) {\n env.image.src = '';\n env.image = null;\n\n var URL = window.URL || window.webkitURL || window.mozURL || window.msURL;\n if (URL.revokeObjectURL) URL.revokeObjectURL(env.image_url);\n\n env.image_url = null;\n\n return Promise.resolve(env);\n};\n\n\nImageBlobReduce.prototype._create_blob = function (env) {\n return this.pica.toBlob(env.out_canvas, env.blob.type)\n .then(function (blob) {\n env.out_blob = blob;\n return env;\n });\n};\n\n\nImageBlobReduce.prototype._getUint8Array = function (blob) {\n if (blob.arrayBuffer) {\n return blob.arrayBuffer().then(function (buf) {\n return new Uint8Array(buf);\n });\n }\n\n return new Promise(function (resolve, reject) {\n var fr = new FileReader();\n\n fr.readAsArrayBuffer(blob);\n\n fr.onload = function () { resolve(new Uint8Array(fr.result)); };\n fr.onerror = function () {\n reject(new Error('ImageBlobReduce: failed to load data from input blob'));\n fr.abort();\n };\n fr.onabort = function () {\n reject(new Error('ImageBlobReduce: failed to load data from input blob (aborted)'));\n };\n });\n};\n\n\nImageBlobReduce.pica = pica;\n\nvar imageBlobReduce = ImageBlobReduce;\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (imageBlobReduce);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2ltYWdlLWJsb2ItcmVkdWNlL2Rpc3QvaW1hZ2UtYmxvYi1yZWR1Y2UuZXNtLm1qcy5qcyIsIm1hcHBpbmdzIjoiOzs7OztBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQkFBa0Isc0JBQXNCO0FBQ3hDOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLGNBQWMscUJBQXFCLGFBQWEsbUJBQW1CLGtCQUFrQixnQkFBZ0IsVUFBVSxVQUFVLDBEQUEwRCx3QkFBd0Isb0JBQW9CLDhDQUE4QyxrQ0FBa0MsWUFBWSxZQUFZLG1DQUFtQyxpQkFBaUIsZUFBZSx1QkFBdUIsb0JBQW9CLGtFQUFrRSxXQUFXLFlBQVksU0FBUyxTQUFTLEtBQUs7O0FBRXJpQjs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBLENBQUMsRUFBRSxtRUFBbUU7QUFDdEU7O0FBRUE7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCOztBQUV0QixpQkFBaUIsYUFBYTtBQUM5QixtQkFBbUI7O0FBRW5CLG9CQUFvQixlQUFlO0FBQ25DO0FBQ0E7QUFDQTtBQUNB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QTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUcsR0FBRztBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUcsR0FBRzs7QUFFTjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQSw2Q0FBNkM7QUFDN0M7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTCxHQUFHO0FBQ0gsR0FBRzs7O0FBR0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLElBQUk7OztBQUdKO0FBQ0E7QUFDQTtBQUNBLEtBQUssR0FBRzs7QUFFUjtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLDJFQUEyRTtBQUMzRTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsZ0RBQWdELFFBQVE7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztB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QUFHQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkM7QUFDN0M7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1COztBQUVuQjtBQUNBLG1CQUFtQjs7QUFFbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTs7QUFFQSxrQkFBa0IsaUJBQWlCO0FBQ25DO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxvQkFBb0IsV0FBVztBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQSxxRkFBcUY7QUFDckY7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDREQUE0RDtBQUM1RDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNO0FBQ047QUFDQSxtQ0FBbUM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUEscUJBQXFCLDREQUE0RDtBQUNqRjtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxvQkFBb0IsbUJBQW1CO0FBQ3ZDO0FBQ0EsTUFBTTtBQUNOO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0I7QUFDQSxPQUFPO0FBQ1AsTUFBTTtBQUNOLHdCQUF3Qjs7QUFFeEI7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsb0JBQW9CO0FBQ2pDO0FBQ0EsTUFBTTs7QUFFTjtBQUNBLEdBQUc7QUFDSDs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjs7QUFFQTtBQUNBLEdBQUc7QUFDSDs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUEscUNBQXFDO0FBQ3JDOztBQUVBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQSw0QkFBNEIsZUFBZTtBQUMzQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDs7O0FBR0E7QUFDQSw0QkFBNEIsZUFBZTtBQUMzQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLHlCQUF5QjtBQUNyRDs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHNDQUFzQztBQUN0QyxxQ0FBcUM7QUFDckMsR0FBRztBQUNIOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxvQkFBb0I7O0FBRXBCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHdCQUF3QixhQUFhO0FBQ3JDOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBOztBQUVBOztBQUVBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7O0FBR0E7O0FBRUE7O0FBRUEsaUVBQWUsZUFBZSxFQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9pbWFnZS1ibG9iLXJlZHVjZS9kaXN0L2ltYWdlLWJsb2ItcmVkdWNlLmVzbS5tanM/OTI4NSJdLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qISBpbWFnZS1ibG9iLXJlZHVjZSAzLjAuMSBodHRwczovL2dpdGh1Yi5jb20vbm9kZWNhL2ltYWdlLWJsb2ItcmVkdWNlIEBsaWNlbnNlIE1JVCAqL1xudmFyIGFzc2lnbiQxID0gZnVuY3Rpb24gYXNzaWduKHRvKSB7XG4gIHZhciBmcm9tO1xuXG4gIGZvciAodmFyIHMgPSAxOyBzIDwgYXJndW1lbnRzLmxlbmd0aDsgcysrKSB7XG4gICAgZnJvbSA9IE9iamVjdChhcmd1bWVudHNbc10pO1xuXG4gICAgZm9yICh2YXIga2V5IGluIGZyb20pIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZnJvbSwga2V5KSkgdG9ba2V5XSA9IGZyb21ba2V5XTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdG87XG59O1xuXG5cbmZ1bmN0aW9uIHBpY2soZnJvbSwgcHJvcHMpIHtcbiAgdmFyIHRvID0ge307XG5cbiAgcHJvcHMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChmcm9tLCBrZXkpKSB0b1trZXldID0gZnJvbVtrZXldO1xuICB9KTtcblxuICByZXR1cm4gdG87XG59XG5cblxuZnVuY3Rpb24gcGlja19waWNhX3Jlc2l6ZV9vcHRpb25zKGZyb20pIHtcbiAgcmV0dXJuIHBpY2soZnJvbSwgW1xuICAgICdhbHBoYScsXG4gICAgJ3Vuc2hhcnBBbW91bnQnLFxuICAgICd1bnNoYXJwUmFkaXVzJyxcbiAgICAndW5zaGFycFRocmVzaG9sZCcsXG4gICAgJ2NhbmNlbFRva2VuJ1xuICBdKTtcbn1cblxuXG52YXIgcGlja18xID0gcGljaztcbnZhciBwaWNrX3BpY2FfcmVzaXplX29wdGlvbnNfMSA9IHBpY2tfcGljYV9yZXNpemVfb3B0aW9ucztcblxudmFyIHV0aWxzID0ge1xuXHRhc3NpZ246IGFzc2lnbiQxLFxuXHRwaWNrOiBwaWNrXzEsXG5cdHBpY2tfcGljYV9yZXNpemVfb3B0aW9uczogcGlja19waWNhX3Jlc2l6ZV9vcHRpb25zXzFcbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZuKSB7XG4gIHZhciBtb2R1bGUgPSB7IGV4cG9ydHM6IHt9IH07XG5cdHJldHVybiBmbihtb2R1bGUsIG1vZHVsZS5leHBvcnRzKSwgbW9kdWxlLmV4cG9ydHM7XG59XG5cbmZ1bmN0aW9uIGNvbW1vbmpzUmVxdWlyZSAodGFyZ2V0KSB7XG5cdHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGR5bmFtaWNhbGx5IHJlcXVpcmUgXCInICsgdGFyZ2V0ICsgJ1wiLiBQbGVhc2UgY29uZmlndXJlIHRoZSBkeW5hbWljUmVxdWlyZVRhcmdldHMgb3B0aW9uIG9mIEByb2xsdXAvcGx1Z2luLWNvbW1vbmpzIGFwcHJvcHJpYXRlbHkgZm9yIHRoaXMgcmVxdWlyZSBjYWxsIHRvIGJlaGF2ZSBwcm9wZXJseS4nKTtcbn1cblxuLyohXG5cbnBpY2Fcbmh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlY2EvcGljYVxuXG4qL1xuXG52YXIgcGljYSA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHtcbihmdW5jdGlvbihmKXt7bW9kdWxlLmV4cG9ydHM9ZigpO319KShmdW5jdGlvbigpe3JldHVybiAoZnVuY3Rpb24oKXtmdW5jdGlvbiByKGUsbix0KXtmdW5jdGlvbiBvKGksZil7aWYoIW5baV0pe2lmKCFlW2ldKXt2YXIgYz1cImZ1bmN0aW9uXCI9PXR5cGVvZiBjb21tb25qc1JlcXVpcmUmJmNvbW1vbmpzUmVxdWlyZTtpZighZiYmYylyZXR1cm4gYyhpLCEwKTtpZih1KXJldHVybiB1KGksITApO3ZhciBhPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIraStcIidcIik7dGhyb3cgYS5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGF9dmFyIHA9bltpXT17ZXhwb3J0czp7fX07ZVtpXVswXS5jYWxsKHAuZXhwb3J0cyxmdW5jdGlvbihyKXt2YXIgbj1lW2ldWzFdW3JdO3JldHVybiBvKG58fHIpfSxwLHAuZXhwb3J0cyxyLGUsbix0KTt9cmV0dXJuIG5baV0uZXhwb3J0c31mb3IodmFyIHU9XCJmdW5jdGlvblwiPT10eXBlb2YgY29tbW9uanNSZXF1aXJlJiZjb21tb25qc1JlcXVpcmUsaT0wO2k8dC5sZW5ndGg7aSsrKW8odFtpXSk7cmV0dXJuIG99cmV0dXJuIHJ9KSgpKHsxOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblxudmFyIGluaGVyaXRzID0gX2RlcmVxXygnaW5oZXJpdHMnKTtcblxudmFyIE11bHRpbWF0aCA9IF9kZXJlcV8oJ211bHRpbWF0aCcpO1xuXG52YXIgbW1fdW5zaGFycF9tYXNrID0gX2RlcmVxXygnLi9tbV91bnNoYXJwX21hc2snKTtcblxudmFyIG1tX3Jlc2l6ZSA9IF9kZXJlcV8oJy4vbW1fcmVzaXplJyk7XG5cbmZ1bmN0aW9uIE1hdGhMaWIocmVxdWVzdGVkX2ZlYXR1cmVzKSB7XG4gIHZhciBfX3JlcXVlc3RlZF9mZWF0dXJlcyA9IHJlcXVlc3RlZF9mZWF0dXJlcyB8fCBbXTtcblxuICB2YXIgZmVhdHVyZXMgPSB7XG4gICAganM6IF9fcmVxdWVzdGVkX2ZlYXR1cmVzLmluZGV4T2YoJ2pzJykgPj0gMCxcbiAgICB3YXNtOiBfX3JlcXVlc3RlZF9mZWF0dXJlcy5pbmRleE9mKCd3YXNtJykgPj0gMFxuICB9O1xuICBNdWx0aW1hdGguY2FsbCh0aGlzLCBmZWF0dXJlcyk7XG4gIHRoaXMuZmVhdHVyZXMgPSB7XG4gICAganM6IGZlYXR1cmVzLmpzLFxuICAgIHdhc206IGZlYXR1cmVzLndhc20gJiYgdGhpcy5oYXNfd2FzbSgpXG4gIH07XG4gIHRoaXMudXNlKG1tX3Vuc2hhcnBfbWFzayk7XG4gIHRoaXMudXNlKG1tX3Jlc2l6ZSk7XG59XG5cbmluaGVyaXRzKE1hdGhMaWIsIE11bHRpbWF0aCk7XG5cbk1hdGhMaWIucHJvdG90eXBlLnJlc2l6ZUFuZFVuc2hhcnAgPSBmdW5jdGlvbiByZXNpemVBbmRVbnNoYXJwKG9wdGlvbnMsIGNhY2hlKSB7XG4gIHZhciByZXN1bHQgPSB0aGlzLnJlc2l6ZShvcHRpb25zLCBjYWNoZSk7XG5cbiAgaWYgKG9wdGlvbnMudW5zaGFycEFtb3VudCkge1xuICAgIHRoaXMudW5zaGFycF9tYXNrKHJlc3VsdCwgb3B0aW9ucy50b1dpZHRoLCBvcHRpb25zLnRvSGVpZ2h0LCBvcHRpb25zLnVuc2hhcnBBbW91bnQsIG9wdGlvbnMudW5zaGFycFJhZGl1cywgb3B0aW9ucy51bnNoYXJwVGhyZXNob2xkKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1hdGhMaWI7XG5cbn0se1wiLi9tbV9yZXNpemVcIjo0LFwiLi9tbV91bnNoYXJwX21hc2tcIjo5LFwiaW5oZXJpdHNcIjoxOSxcIm11bHRpbWF0aFwiOjIwfV0sMjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4vL3ZhciBGSVhFRF9GUkFDX0JJVFMgPSAxNDtcblxuZnVuY3Rpb24gY2xhbXBUbzgoaSkge1xuICByZXR1cm4gaSA8IDAgPyAwIDogaSA+IDI1NSA/IDI1NSA6IGk7XG59IC8vIENvbnZvbHZlIGltYWdlIGluIGhvcml6b250YWwgZGlyZWN0aW9ucyBhbmQgdHJhbnNwb3NlIG91dHB1dC4gSW4gdGhlb3J5LFxuLy8gdHJhbnNwb3NlIGFsbG93OlxuLy9cbi8vIC0gdXNlIHRoZSBzYW1lIGNvbnZvbHZlciBmb3IgYm90aCBwYXNzZXMgKHRoaXMgZmFpbHMgZHVlIGRpZmZlcmVudFxuLy8gICB0eXBlcyBvZiBpbnB1dCBhcnJheSBhbmQgdGVtcG9yYXJ5IGJ1ZmZlcilcbi8vIC0gbWFraW5nIHZlcnRpY2FsIHBhc3MgYnkgaG9yaXNvbmx0YWwgbGluZXMgaW5wcm92ZSBDUFUgY2FjaGUgdXNlLlxuLy9cbi8vIEJ1dCBpbiByZWFsIGxpZmUgdGhpcyBkb2Vzbid0IHdvcmsgOilcbi8vXG5cblxuZnVuY3Rpb24gY29udm9sdmVIb3Jpem9udGFsbHkoc3JjLCBkZXN0LCBzcmNXLCBzcmNILCBkZXN0VywgZmlsdGVycykge1xuICB2YXIgciwgZywgYiwgYTtcbiAgdmFyIGZpbHRlclB0ciwgZmlsdGVyU2hpZnQsIGZpbHRlclNpemU7XG4gIHZhciBzcmNQdHIsIHNyY1ksIGRlc3RYLCBmaWx0ZXJWYWw7XG4gIHZhciBzcmNPZmZzZXQgPSAwLFxuICAgICAgZGVzdE9mZnNldCA9IDA7IC8vIEZvciBlYWNoIHJvd1xuXG4gIGZvciAoc3JjWSA9IDA7IHNyY1kgPCBzcmNIOyBzcmNZKyspIHtcbiAgICBmaWx0ZXJQdHIgPSAwOyAvLyBBcHBseSBwcmVjb21wdXRlZCBmaWx0ZXJzIHRvIGVhY2ggZGVzdGluYXRpb24gcm93IHBvaW50XG5cbiAgICBmb3IgKGRlc3RYID0gMDsgZGVzdFggPCBkZXN0VzsgZGVzdFgrKykge1xuICAgICAgLy8gR2V0IHRoZSBmaWx0ZXIgdGhhdCBkZXRlcm1pbmVzIHRoZSBjdXJyZW50IG91dHB1dCBwaXhlbC5cbiAgICAgIGZpbHRlclNoaWZ0ID0gZmlsdGVyc1tmaWx0ZXJQdHIrK107XG4gICAgICBmaWx0ZXJTaXplID0gZmlsdGVyc1tmaWx0ZXJQdHIrK107XG4gICAgICBzcmNQdHIgPSBzcmNPZmZzZXQgKyBmaWx0ZXJTaGlmdCAqIDQgfCAwO1xuICAgICAgciA9IGcgPSBiID0gYSA9IDA7IC8vIEFwcGx5IHRoZSBmaWx0ZXIgdG8gdGhlIHJvdyB0byBnZXQgdGhlIGRlc3RpbmF0aW9uIHBpeGVsIHIsIGcsIGIsIGFcblxuICAgICAgZm9yICg7IGZpbHRlclNpemUgPiAwOyBmaWx0ZXJTaXplLS0pIHtcbiAgICAgICAgZmlsdGVyVmFsID0gZmlsdGVyc1tmaWx0ZXJQdHIrK107IC8vIFVzZSByZXZlcnNlIG9yZGVyIHRvIHdvcmthcm91bmQgZGVvcHRzIGluIG9sZCB2OCAobm9kZSB2LjEwKVxuICAgICAgICAvLyBCaWcgdGhhbmtzIHRvIEBtcmFsZXBoIChWeWFjaGVzbGF2IEVnb3JvdikgZm9yIHRoZSB0aXAuXG5cbiAgICAgICAgYSA9IGEgKyBmaWx0ZXJWYWwgKiBzcmNbc3JjUHRyICsgM10gfCAwO1xuICAgICAgICBiID0gYiArIGZpbHRlclZhbCAqIHNyY1tzcmNQdHIgKyAyXSB8IDA7XG4gICAgICAgIGcgPSBnICsgZmlsdGVyVmFsICogc3JjW3NyY1B0ciArIDFdIHwgMDtcbiAgICAgICAgciA9IHIgKyBmaWx0ZXJWYWwgKiBzcmNbc3JjUHRyXSB8IDA7XG4gICAgICAgIHNyY1B0ciA9IHNyY1B0ciArIDQgfCAwO1xuICAgICAgfSAvLyBCcmluZyB0aGlzIHZhbHVlIGJhY2sgaW4gcmFuZ2UuIEFsbCBvZiB0aGUgZmlsdGVyIHNjYWxpbmcgZmFjdG9yc1xuICAgICAgLy8gYXJlIGluIGZpeGVkIHBvaW50IHdpdGggRklYRURfRlJBQ19CSVRTIGJpdHMgb2YgZnJhY3Rpb25hbCBwYXJ0LlxuICAgICAgLy9cbiAgICAgIC8vICghKSBBZGQgMS8yIG9mIHZhbHVlIGJlZm9yZSBjbGFtcGluZyB0byBnZXQgcHJvcGVyIHJvdW5kaW5nLiBJbiBvdGhlclxuICAgICAgLy8gY2FzZSBicmlnaHRuZXNzIGxvc3Mgd2lsbCBiZSBub3RpY2VhYmxlIGlmIHlvdSByZXNpemUgaW1hZ2Ugd2l0aCB3aGl0ZVxuICAgICAgLy8gYm9yZGVyIGFuZCBwbGFjZSBpdCBvbiB3aGl0ZSBiYWNrZ3JvdW5kLlxuICAgICAgLy9cblxuXG4gICAgICBkZXN0W2Rlc3RPZmZzZXQgKyAzXSA9IGNsYW1wVG84KGEgKyAoMSA8PCAxMykgPj4gMTRcbiAgICAgIC8qRklYRURfRlJBQ19CSVRTKi9cbiAgICAgICk7XG4gICAgICBkZXN0W2Rlc3RPZmZzZXQgKyAyXSA9IGNsYW1wVG84KGIgKyAoMSA8PCAxMykgPj4gMTRcbiAgICAgIC8qRklYRURfRlJBQ19CSVRTKi9cbiAgICAgICk7XG4gICAgICBkZXN0W2Rlc3RPZmZzZXQgKyAxXSA9IGNsYW1wVG84KGcgKyAoMSA8PCAxMykgPj4gMTRcbiAgICAgIC8qRklYRURfRlJBQ19CSVRTKi9cbiAgICAgICk7XG4gICAgICBkZXN0W2Rlc3RPZmZzZXRdID0gY2xhbXBUbzgociArICgxIDw8IDEzKSA+PiAxNFxuICAgICAgLypGSVhFRF9GUkFDX0JJVFMqL1xuICAgICAgKTtcbiAgICAgIGRlc3RPZmZzZXQgPSBkZXN0T2Zmc2V0ICsgc3JjSCAqIDQgfCAwO1xuICAgIH1cblxuICAgIGRlc3RPZmZzZXQgPSAoc3JjWSArIDEpICogNCB8IDA7XG4gICAgc3JjT2Zmc2V0ID0gKHNyY1kgKyAxKSAqIHNyY1cgKiA0IHwgMDtcbiAgfVxufSAvLyBUZWNobmljYWxseSwgY29udm9sdmVycyBhcmUgdGhlIHNhbWUuIEJ1dCBpbnB1dCBhcnJheSBhbmQgdGVtcG9yYXJ5XG4vLyBidWZmZXIgY2FuIGJlIG9mIGRpZmZlcmVudCB0eXBlIChlc3BlY2lhbGx5LCBpbiBvbGQgYnJvd3NlcnMpLiBTbyxcbi8vIGtlZXAgY29kZSBpbiBzZXBhcmF0ZSBmdW5jdGlvbnMgdG8gYXZvaWQgZGVvcHRpbWl6YXRpb25zICYgc3BlZWQgbG9zcy5cblxuXG5mdW5jdGlvbiBjb252b2x2ZVZlcnRpY2FsbHkoc3JjLCBkZXN0LCBzcmNXLCBzcmNILCBkZXN0VywgZmlsdGVycykge1xuICB2YXIgciwgZywgYiwgYTtcbiAgdmFyIGZpbHRlclB0ciwgZmlsdGVyU2hpZnQsIGZpbHRlclNpemU7XG4gIHZhciBzcmNQdHIsIHNyY1ksIGRlc3RYLCBmaWx0ZXJWYWw7XG4gIHZhciBzcmNPZmZzZXQgPSAwLFxuICAgICAgZGVzdE9mZnNldCA9IDA7IC8vIEZvciBlYWNoIHJvd1xuXG4gIGZvciAoc3JjWSA9IDA7IHNyY1kgPCBzcmNIOyBzcmNZKyspIHtcbiAgICBmaWx0ZXJQdHIgPSAwOyAvLyBBcHBseSBwcmVjb21wdXRlZCBmaWx0ZXJzIHRvIGVhY2ggZGVzdGluYXRpb24gcm93IHBvaW50XG5cbiAgICBmb3IgKGRlc3RYID0gMDsgZGVzdFggPCBkZXN0VzsgZGVzdFgrKykge1xuICAgICAgLy8gR2V0IHRoZSBmaWx0ZXIgdGhhdCBkZXRlcm1pbmVzIHRoZSBjdXJyZW50IG91dHB1dCBwaXhlbC5cbiAgICAgIGZpbHRlclNoaWZ0ID0gZmlsdGVyc1tmaWx0ZXJQdHIrK107XG4gICAgICBmaWx0ZXJTaXplID0gZmlsdGVyc1tmaWx0ZXJQdHIrK107XG4gICAgICBzcmNQdHIgPSBzcmNPZmZzZXQgKyBmaWx0ZXJTaGlmdCAqIDQgfCAwO1xuICAgICAgciA9IGcgPSBiID0gYSA9IDA7IC8vIEFwcGx5IHRoZSBmaWx0ZXIgdG8gdGhlIHJvdyB0byBnZXQgdGhlIGRlc3RpbmF0aW9uIHBpeGVsIHIsIGcsIGIsIGFcblxuICAgICAgZm9yICg7IGZpbHRlclNpemUgPiAwOyBmaWx0ZXJTaXplLS0pIHtcbiAgICAgICAgZmlsdGVyVmFsID0gZmlsdGVyc1tmaWx0ZXJQdHIrK107IC8vIFVzZSByZXZlcnNlIG9yZGVyIHRvIHdvcmthcm91bmQgZGVvcHRzIGluIG9sZCB2OCAobm9kZSB2LjEwKVxuICAgICAgICAvLyBCaWcgdGhhbmtzIHRvIEBtcmFsZXBoIChWeWFjaGVzbGF2IEVnb3JvdikgZm9yIHRoZSB0aXAuXG5cbiAgICAgICAgYSA9IGEgKyBmaWx0ZXJWYWwgKiBzcmNbc3JjUHRyICsgM10gfCAwO1xuICAgICAgICBiID0gYiArIGZpbHRlclZhbCAqIHNyY1tzcmNQdHIgKyAyXSB8IDA7XG4gICAgICAgIGcgPSBnICsgZmlsdGVyVmFsICogc3JjW3NyY1B0ciArIDFdIHwgMDtcbiAgICAgICAgciA9IHIgKyBmaWx0ZXJWYWwgKiBzcmNbc3JjUHRyXSB8IDA7XG4gICAgICAgIHNyY1B0ciA9IHNyY1B0ciArIDQgfCAwO1xuICAgICAgfSAvLyBCcmluZyB0aGlzIHZhbHVlIGJhY2sgaW4gcmFuZ2UuIEFsbCBvZiB0aGUgZmlsdGVyIHNjYWxpbmcgZmFjdG9yc1xuICAgICAgLy8gYXJlIGluIGZpeGVkIHBvaW50IHdpdGggRklYRURfRlJBQ19CSVRTIGJpdHMgb2YgZnJhY3Rpb25hbCBwYXJ0LlxuICAgICAgLy9cbiAgICAgIC8vICghKSBBZGQgMS8yIG9mIHZhbHVlIGJlZm9yZSBjbGFtcGluZyB0byBnZXQgcHJvcGVyIHJvdW5kaW5nLiBJbiBvdGhlclxuICAgICAgLy8gY2FzZSBicmlnaHRuZXNzIGxvc3Mgd2lsbCBiZSBub3RpY2VhYmxlIGlmIHlvdSByZXNpemUgaW1hZ2Ugd2l0aCB3aGl0ZVxuICAgICAgLy8gYm9yZGVyIGFuZCBwbGFjZSBpdCBvbiB3aGl0ZSBiYWNrZ3JvdW5kLlxuICAgICAgLy9cblxuXG4gICAgICBkZXN0W2Rlc3RPZmZzZXQgKyAzXSA9IGNsYW1wVG84KGEgKyAoMSA8PCAxMykgPj4gMTRcbiAgICAgIC8qRklYRURfRlJBQ19CSVRTKi9cbiAgICAgICk7XG4gICAgICBkZXN0W2Rlc3RPZmZzZXQgKyAyXSA9IGNsYW1wVG84KGIgKyAoMSA8PCAxMykgPj4gMTRcbiAgICAgIC8qRklYRURfRlJBQ19CSVRTKi9cbiAgICAgICk7XG4gICAgICBkZXN0W2Rlc3RPZmZzZXQgKyAxXSA9IGNsYW1wVG84KGcgKyAoMSA8PCAxMykgPj4gMTRcbiAgICAgIC8qRklYRURfRlJBQ19CSVRTKi9cbiAgICAgICk7XG4gICAgICBkZXN0W2Rlc3RPZmZzZXRdID0gY2xhbXBUbzgociArICgxIDw8IDEzKSA+PiAxNFxuICAgICAgLypGSVhFRF9GUkFDX0JJVFMqL1xuICAgICAgKTtcbiAgICAgIGRlc3RPZmZzZXQgPSBkZXN0T2Zmc2V0ICsgc3JjSCAqIDQgfCAwO1xuICAgIH1cblxuICAgIGRlc3RPZmZzZXQgPSAoc3JjWSArIDEpICogNCB8IDA7XG4gICAgc3JjT2Zmc2V0ID0gKHNyY1kgKyAxKSAqIHNyY1cgKiA0IHwgMDtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgY29udm9sdmVIb3Jpem9udGFsbHk6IGNvbnZvbHZlSG9yaXpvbnRhbGx5LFxuICBjb252b2x2ZVZlcnRpY2FsbHk6IGNvbnZvbHZlVmVydGljYWxseVxufTtcblxufSx7fV0sMzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovXG5cbm1vZHVsZS5leHBvcnRzID0gJ0FHRnpiUUVBQUFBQURBWmtlV3hwYm1zQUFBQUFBQUVYQTJBQUFHQUdmMzkvZjM5L0FHQUhmMzkvZjM5L2Z3QUNEd0VEWlc1MkJtMWxiVzl5ZVFJQUFBTUVBd0FCQWdZR0FYOEFRUUFMQjFjRkVWOWZkMkZ6YlY5allXeHNYMk4wYjNKekFBQUlZMjl1ZG05c2RtVUFBUXBqYjI1MmIyeDJaVWhXQUFJTVgxOWtjMjlmYUdGdVpHeGxBd0FZWDE5M1lYTnRYMkZ3Y0d4NVgyUmhkR0ZmY21Wc2IyTnpBQUFLN0FNREF3QUJDOFlEQVE5L0FrQWdBMFVOQUNBRVJRMEFBMEFnRENFTlFRQWhFMEVBSVFjRFFDQUhRUUpxSVFZQ2Z5QUhRUUYwSUFWcUlnY3VBUUlpRkVVRVFFR0F3QUFoQ0VHQXdBQWhDVUdBd0FBaENrR0F3QUFoQ3lBR0RBRUxJQklnQnk0QkFHb2hDRUVBSVFzZ0ZDRUhRUUFoRGlBR0lRbEJBQ0VQUVFBaEVBTkFJQVVnQ1VFQmRHb3VBUUFpRVNBQUlBaEJBblJxS0FJQUlncEJHSFpzSUJCcUlSQWdDa0gvQVhFZ0VXd2dDMm9oQ3lBS1FSQjJRZjhCY1NBUmJDQVBhaUVQSUFwQkNIWkIvd0Z4SUJGc0lBNXFJUTRnQ0VFQmFpRUlJQWxCQVdvaENTQUhRUUZySWdjTkFBc2dDMEdBUUdzaENDQU9RWUJBYXlFSklBOUJnRUJySVFvZ0VFR0FRR3NoQ3lBR0lCUnFDeUVISUFFZ0RVRUNkR29nQ1VFT2RTSUdRZjhCSUFaQi93RklHeUlHUVFBZ0JrRUFTaHRCQ0hSQmdQNERjU0FLUVE1MUlnWkIvd0VnQmtIL0FVZ2JJZ1pCQUNBR1FRQktHMEVRZEVHQWdQd0hjU0FMUVE1MUlnWkIvd0VnQmtIL0FVZ2JJZ1pCQUNBR1FRQktHMEVZZEhKeUlBaEJEblVpQmtIL0FTQUdRZjhCU0JzaUJrRUFJQVpCQUVvYmNqWUNBQ0FESUExcUlRMGdFMEVCYWlJVElBUkhEUUFMSUF4QkFXb2lEQ0FDYkNFU0lBTWdERWNOQUFzTEN4NEFRUUFnQWlBRElBUWdCU0FBRUFFZ0FrRUFJQVFnQlNBR0lBRVFBUXM9JztcblxufSx7fV0sNDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBuYW1lOiAncmVzaXplJyxcbiAgZm46IF9kZXJlcV8oJy4vcmVzaXplJyksXG4gIHdhc21fZm46IF9kZXJlcV8oJy4vcmVzaXplX3dhc20nKSxcbiAgd2FzbV9zcmM6IF9kZXJlcV8oJy4vY29udm9sdmVfd2FzbV9iYXNlNjQnKVxufTtcblxufSx7XCIuL2NvbnZvbHZlX3dhc21fYmFzZTY0XCI6MyxcIi4vcmVzaXplXCI6NSxcIi4vcmVzaXplX3dhc21cIjo4fV0sNTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cbnZhciBjcmVhdGVGaWx0ZXJzID0gX2RlcmVxXygnLi9yZXNpemVfZmlsdGVyX2dlbicpO1xuXG52YXIgY29udm9sdmVIb3Jpem9udGFsbHkgPSBfZGVyZXFfKCcuL2NvbnZvbHZlJykuY29udm9sdmVIb3Jpem9udGFsbHk7XG5cbnZhciBjb252b2x2ZVZlcnRpY2FsbHkgPSBfZGVyZXFfKCcuL2NvbnZvbHZlJykuY29udm9sdmVWZXJ0aWNhbGx5O1xuXG5mdW5jdGlvbiByZXNldEFscGhhKGRzdCwgd2lkdGgsIGhlaWdodCkge1xuICB2YXIgcHRyID0gMyxcbiAgICAgIGxlbiA9IHdpZHRoICogaGVpZ2h0ICogNCB8IDA7XG5cbiAgd2hpbGUgKHB0ciA8IGxlbikge1xuICAgIGRzdFtwdHJdID0gMHhGRjtcbiAgICBwdHIgPSBwdHIgKyA0IHwgMDtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHJlc2l6ZShvcHRpb25zKSB7XG4gIHZhciBzcmMgPSBvcHRpb25zLnNyYztcbiAgdmFyIHNyY1cgPSBvcHRpb25zLndpZHRoO1xuICB2YXIgc3JjSCA9IG9wdGlvbnMuaGVpZ2h0O1xuICB2YXIgZGVzdFcgPSBvcHRpb25zLnRvV2lkdGg7XG4gIHZhciBkZXN0SCA9IG9wdGlvbnMudG9IZWlnaHQ7XG4gIHZhciBzY2FsZVggPSBvcHRpb25zLnNjYWxlWCB8fCBvcHRpb25zLnRvV2lkdGggLyBvcHRpb25zLndpZHRoO1xuICB2YXIgc2NhbGVZID0gb3B0aW9ucy5zY2FsZVkgfHwgb3B0aW9ucy50b0hlaWdodCAvIG9wdGlvbnMuaGVpZ2h0O1xuICB2YXIgb2Zmc2V0WCA9IG9wdGlvbnMub2Zmc2V0WCB8fCAwO1xuICB2YXIgb2Zmc2V0WSA9IG9wdGlvbnMub2Zmc2V0WSB8fCAwO1xuICB2YXIgZGVzdCA9IG9wdGlvbnMuZGVzdCB8fCBuZXcgVWludDhBcnJheShkZXN0VyAqIGRlc3RIICogNCk7XG4gIHZhciBxdWFsaXR5ID0gdHlwZW9mIG9wdGlvbnMucXVhbGl0eSA9PT0gJ3VuZGVmaW5lZCcgPyAzIDogb3B0aW9ucy5xdWFsaXR5O1xuICB2YXIgYWxwaGEgPSBvcHRpb25zLmFscGhhIHx8IGZhbHNlO1xuICB2YXIgZmlsdGVyc1ggPSBjcmVhdGVGaWx0ZXJzKHF1YWxpdHksIHNyY1csIGRlc3RXLCBzY2FsZVgsIG9mZnNldFgpLFxuICAgICAgZmlsdGVyc1kgPSBjcmVhdGVGaWx0ZXJzKHF1YWxpdHksIHNyY0gsIGRlc3RILCBzY2FsZVksIG9mZnNldFkpO1xuICB2YXIgdG1wID0gbmV3IFVpbnQ4QXJyYXkoZGVzdFcgKiBzcmNIICogNCk7IC8vIFRvIHVzZSBzaW5nbGUgZnVuY3Rpb24gd2UgbmVlZCBzcmMgJiB0bXAgb2YgdGhlIHNhbWUgdHlwZS5cbiAgLy8gQnV0IHNyYyBjYW4gYmUgQ2FudmFzUGl4ZWxBcnJheSwgYW5kIHRtcCAtIFVpbnQ4QXJyYXkuIFNvLCBrZWVwXG4gIC8vIHZlcnRpY2FsIGFuZCBob3Jpem9udGFsIHBhc3NlcyBzZXBhcmF0ZWx5IHRvIGF2b2lkIGRlb3B0aW1pemF0aW9uLlxuXG4gIGNvbnZvbHZlSG9yaXpvbnRhbGx5KHNyYywgdG1wLCBzcmNXLCBzcmNILCBkZXN0VywgZmlsdGVyc1gpO1xuICBjb252b2x2ZVZlcnRpY2FsbHkodG1wLCBkZXN0LCBzcmNILCBkZXN0VywgZGVzdEgsIGZpbHRlcnNZKTsgLy8gVGhhdCdzIGZhc3RlciB0aGFuIGRvaW5nIGNoZWNrcyBpbiBjb252b2x2ZXIuXG4gIC8vICEhISBOb3RlLCBjYW52YXMgZGF0YSBpcyBub3QgcHJlbXVsdGlwbGVkLiBXZSBkb24ndCBuZWVkIG90aGVyXG4gIC8vIGFscGhhIGNvcnJlY3Rpb25zLlxuXG4gIGlmICghYWxwaGEpIHJlc2V0QWxwaGEoZGVzdCwgZGVzdFcsIGRlc3RIKTtcbiAgcmV0dXJuIGRlc3Q7XG59O1xuXG59LHtcIi4vY29udm9sdmVcIjoyLFwiLi9yZXNpemVfZmlsdGVyX2dlblwiOjZ9XSw2OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblxudmFyIEZJTFRFUl9JTkZPID0gX2RlcmVxXygnLi9yZXNpemVfZmlsdGVyX2luZm8nKTsgLy8gUHJlY2lzaW9uIG9mIGZpeGVkIEZQIHZhbHVlc1xuXG5cbnZhciBGSVhFRF9GUkFDX0JJVFMgPSAxNDtcblxuZnVuY3Rpb24gdG9GaXhlZFBvaW50KG51bSkge1xuICByZXR1cm4gTWF0aC5yb3VuZChudW0gKiAoKDEgPDwgRklYRURfRlJBQ19CSVRTKSAtIDEpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiByZXNpemVGaWx0ZXJHZW4ocXVhbGl0eSwgc3JjU2l6ZSwgZGVzdFNpemUsIHNjYWxlLCBvZmZzZXQpIHtcbiAgdmFyIGZpbHRlckZ1bmN0aW9uID0gRklMVEVSX0lORk9bcXVhbGl0eV0uZmlsdGVyO1xuICB2YXIgc2NhbGVJbnZlcnRlZCA9IDEuMCAvIHNjYWxlO1xuICB2YXIgc2NhbGVDbGFtcGVkID0gTWF0aC5taW4oMS4wLCBzY2FsZSk7IC8vIEZvciB1cHNjYWxlXG4gIC8vIEZpbHRlciB3aW5kb3cgKGF2ZXJhZ2luZyBpbnRlcnZhbCksIHNjYWxlZCB0byBzcmMgaW1hZ2VcblxuICB2YXIgc3JjV2luZG93ID0gRklMVEVSX0lORk9bcXVhbGl0eV0ud2luIC8gc2NhbGVDbGFtcGVkO1xuICB2YXIgZGVzdFBpeGVsLCBzcmNQaXhlbCwgc3JjRmlyc3QsIHNyY0xhc3QsIGZpbHRlckVsZW1lbnRTaXplLCBmbG9hdEZpbHRlciwgZnhwRmlsdGVyLCB0b3RhbCwgcHhsLCBpZHgsIGZsb2F0VmFsLCBmaWx0ZXJUb3RhbCwgZmlsdGVyVmFsO1xuICB2YXIgbGVmdE5vdEVtcHR5LCByaWdodE5vdEVtcHR5LCBmaWx0ZXJTaGlmdCwgZmlsdGVyU2l6ZTtcbiAgdmFyIG1heEZpbHRlckVsZW1lbnRTaXplID0gTWF0aC5mbG9vcigoc3JjV2luZG93ICsgMSkgKiAyKTtcbiAgdmFyIHBhY2tlZEZpbHRlciA9IG5ldyBJbnQxNkFycmF5KChtYXhGaWx0ZXJFbGVtZW50U2l6ZSArIDIpICogZGVzdFNpemUpO1xuICB2YXIgcGFja2VkRmlsdGVyUHRyID0gMDtcbiAgdmFyIHNsb3dDb3B5ID0gIXBhY2tlZEZpbHRlci5zdWJhcnJheSB8fCAhcGFja2VkRmlsdGVyLnNldDsgLy8gRm9yIGVhY2ggZGVzdGluYXRpb24gcGl4ZWwgY2FsY3VsYXRlIHNvdXJjZSByYW5nZSBhbmQgYnVpbHQgZmlsdGVyIHZhbHVlc1xuXG4gIGZvciAoZGVzdFBpeGVsID0gMDsgZGVzdFBpeGVsIDwgZGVzdFNpemU7IGRlc3RQaXhlbCsrKSB7XG4gICAgLy8gU2NhbGluZyBzaG91bGQgYmUgZG9uZSByZWxhdGl2ZSB0byBjZW50cmFsIHBpeGVsIHBvaW50XG4gICAgc3JjUGl4ZWwgPSAoZGVzdFBpeGVsICsgMC41KSAqIHNjYWxlSW52ZXJ0ZWQgKyBvZmZzZXQ7XG4gICAgc3JjRmlyc3QgPSBNYXRoLm1heCgwLCBNYXRoLmZsb29yKHNyY1BpeGVsIC0gc3JjV2luZG93KSk7XG4gICAgc3JjTGFzdCA9IE1hdGgubWluKHNyY1NpemUgLSAxLCBNYXRoLmNlaWwoc3JjUGl4ZWwgKyBzcmNXaW5kb3cpKTtcbiAgICBmaWx0ZXJFbGVtZW50U2l6ZSA9IHNyY0xhc3QgLSBzcmNGaXJzdCArIDE7XG4gICAgZmxvYXRGaWx0ZXIgPSBuZXcgRmxvYXQzMkFycmF5KGZpbHRlckVsZW1lbnRTaXplKTtcbiAgICBmeHBGaWx0ZXIgPSBuZXcgSW50MTZBcnJheShmaWx0ZXJFbGVtZW50U2l6ZSk7XG4gICAgdG90YWwgPSAwLjA7IC8vIEZpbGwgZmlsdGVyIHZhbHVlcyBmb3IgY2FsY3VsYXRlZCByYW5nZVxuXG4gICAgZm9yIChweGwgPSBzcmNGaXJzdCwgaWR4ID0gMDsgcHhsIDw9IHNyY0xhc3Q7IHB4bCsrLCBpZHgrKykge1xuICAgICAgZmxvYXRWYWwgPSBmaWx0ZXJGdW5jdGlvbigocHhsICsgMC41IC0gc3JjUGl4ZWwpICogc2NhbGVDbGFtcGVkKTtcbiAgICAgIHRvdGFsICs9IGZsb2F0VmFsO1xuICAgICAgZmxvYXRGaWx0ZXJbaWR4XSA9IGZsb2F0VmFsO1xuICAgIH0gLy8gTm9ybWFsaXplIGZpbHRlciwgY29udmVydCB0byBmaXhlZCBwb2ludCBhbmQgYWNjdW11bGF0ZSBjb252ZXJzaW9uIGVycm9yXG5cblxuICAgIGZpbHRlclRvdGFsID0gMDtcblxuICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgZmxvYXRGaWx0ZXIubGVuZ3RoOyBpZHgrKykge1xuICAgICAgZmlsdGVyVmFsID0gZmxvYXRGaWx0ZXJbaWR4XSAvIHRvdGFsO1xuICAgICAgZmlsdGVyVG90YWwgKz0gZmlsdGVyVmFsO1xuICAgICAgZnhwRmlsdGVyW2lkeF0gPSB0b0ZpeGVkUG9pbnQoZmlsdGVyVmFsKTtcbiAgICB9IC8vIENvbXBlbnNhdGUgbm9ybWFsaXphdGlvbiBlcnJvciwgdG8gbWluaW1pemUgYnJpZ2h0bmVzcyBkcmlmdFxuXG5cbiAgICBmeHBGaWx0ZXJbZGVzdFNpemUgPj4gMV0gKz0gdG9GaXhlZFBvaW50KDEuMCAtIGZpbHRlclRvdGFsKTsgLy9cbiAgICAvLyBOb3cgcGFjayBmaWx0ZXIgdG8gdXNlYWJsZSBmb3JtXG4gICAgLy9cbiAgICAvLyAxLiBUcmltIGhlYWRpbmcgYW5kIHRhaWxpbmcgemVybyB2YWx1ZXMsIGFuZCBjb21wZW5zYXRlIHNoaXRmL2xlbmd0aFxuICAgIC8vIDIuIFB1dCBhbGwgdG8gc2luZ2xlIGFycmF5IGluIHRoaXMgZm9ybWF0OlxuICAgIC8vXG4gICAgLy8gICAgWyBwb3Mgc2hpZnQsIGRhdGEgbGVuZ3RoLCB2YWx1ZTEsIHZhbHVlMiwgdmFsdWUzLCAuLi4gXVxuICAgIC8vXG5cbiAgICBsZWZ0Tm90RW1wdHkgPSAwO1xuXG4gICAgd2hpbGUgKGxlZnROb3RFbXB0eSA8IGZ4cEZpbHRlci5sZW5ndGggJiYgZnhwRmlsdGVyW2xlZnROb3RFbXB0eV0gPT09IDApIHtcbiAgICAgIGxlZnROb3RFbXB0eSsrO1xuICAgIH1cblxuICAgIGlmIChsZWZ0Tm90RW1wdHkgPCBmeHBGaWx0ZXIubGVuZ3RoKSB7XG4gICAgICByaWdodE5vdEVtcHR5ID0gZnhwRmlsdGVyLmxlbmd0aCAtIDE7XG5cbiAgICAgIHdoaWxlIChyaWdodE5vdEVtcHR5ID4gMCAmJiBmeHBGaWx0ZXJbcmlnaHROb3RFbXB0eV0gPT09IDApIHtcbiAgICAgICAgcmlnaHROb3RFbXB0eS0tO1xuICAgICAgfVxuXG4gICAgICBmaWx0ZXJTaGlmdCA9IHNyY0ZpcnN0ICsgbGVmdE5vdEVtcHR5O1xuICAgICAgZmlsdGVyU2l6ZSA9IHJpZ2h0Tm90RW1wdHkgLSBsZWZ0Tm90RW1wdHkgKyAxO1xuICAgICAgcGFja2VkRmlsdGVyW3BhY2tlZEZpbHRlclB0cisrXSA9IGZpbHRlclNoaWZ0OyAvLyBzaGlmdFxuXG4gICAgICBwYWNrZWRGaWx0ZXJbcGFja2VkRmlsdGVyUHRyKytdID0gZmlsdGVyU2l6ZTsgLy8gc2l6ZVxuXG4gICAgICBpZiAoIXNsb3dDb3B5KSB7XG4gICAgICAgIHBhY2tlZEZpbHRlci5zZXQoZnhwRmlsdGVyLnN1YmFycmF5KGxlZnROb3RFbXB0eSwgcmlnaHROb3RFbXB0eSArIDEpLCBwYWNrZWRGaWx0ZXJQdHIpO1xuICAgICAgICBwYWNrZWRGaWx0ZXJQdHIgKz0gZmlsdGVyU2l6ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGZhbGxiYWNrIGZvciBvbGQgSUUgPCAxMSwgd2l0aG91dCBzdWJhcnJheS9zZXQgbWV0aG9kc1xuICAgICAgICBmb3IgKGlkeCA9IGxlZnROb3RFbXB0eTsgaWR4IDw9IHJpZ2h0Tm90RW1wdHk7IGlkeCsrKSB7XG4gICAgICAgICAgcGFja2VkRmlsdGVyW3BhY2tlZEZpbHRlclB0cisrXSA9IGZ4cEZpbHRlcltpZHhdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHplcm8gZGF0YSwgd3JpdGUgaGVhZGVyIG9ubHlcbiAgICAgIHBhY2tlZEZpbHRlcltwYWNrZWRGaWx0ZXJQdHIrK10gPSAwOyAvLyBzaGlmdFxuXG4gICAgICBwYWNrZWRGaWx0ZXJbcGFja2VkRmlsdGVyUHRyKytdID0gMDsgLy8gc2l6ZVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwYWNrZWRGaWx0ZXI7XG59O1xuXG59LHtcIi4vcmVzaXplX2ZpbHRlcl9pbmZvXCI6N31dLDc6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXG5tb2R1bGUuZXhwb3J0cyA9IFt7XG4gIC8vIE5lYXJlc3QgbmVpYm9yIChCb3gpXG4gIHdpbjogMC41LFxuICBmaWx0ZXI6IGZ1bmN0aW9uIGZpbHRlcih4KSB7XG4gICAgcmV0dXJuIHggPj0gLTAuNSAmJiB4IDwgMC41ID8gMS4wIDogMC4wO1xuICB9XG59LCB7XG4gIC8vIEhhbW1pbmdcbiAgd2luOiAxLjAsXG4gIGZpbHRlcjogZnVuY3Rpb24gZmlsdGVyKHgpIHtcbiAgICBpZiAoeCA8PSAtMS4wIHx8IHggPj0gMS4wKSB7XG4gICAgICByZXR1cm4gMC4wO1xuICAgIH1cblxuICAgIGlmICh4ID4gLTEuMTkyMDkyOTBFLTA3ICYmIHggPCAxLjE5MjA5MjkwRS0wNykge1xuICAgICAgcmV0dXJuIDEuMDtcbiAgICB9XG5cbiAgICB2YXIgeHBpID0geCAqIE1hdGguUEk7XG4gICAgcmV0dXJuIE1hdGguc2luKHhwaSkgLyB4cGkgKiAoMC41NCArIDAuNDYgKiBNYXRoLmNvcyh4cGkgLyAxLjApKTtcbiAgfVxufSwge1xuICAvLyBMYW5jem9zLCB3aW4gPSAyXG4gIHdpbjogMi4wLFxuICBmaWx0ZXI6IGZ1bmN0aW9uIGZpbHRlcih4KSB7XG4gICAgaWYgKHggPD0gLTIuMCB8fCB4ID49IDIuMCkge1xuICAgICAgcmV0dXJuIDAuMDtcbiAgICB9XG5cbiAgICBpZiAoeCA+IC0xLjE5MjA5MjkwRS0wNyAmJiB4IDwgMS4xOTIwOTI5MEUtMDcpIHtcbiAgICAgIHJldHVybiAxLjA7XG4gICAgfVxuXG4gICAgdmFyIHhwaSA9IHggKiBNYXRoLlBJO1xuICAgIHJldHVybiBNYXRoLnNpbih4cGkpIC8geHBpICogTWF0aC5zaW4oeHBpIC8gMi4wKSAvICh4cGkgLyAyLjApO1xuICB9XG59LCB7XG4gIC8vIExhbmN6b3MsIHdpbiA9IDNcbiAgd2luOiAzLjAsXG4gIGZpbHRlcjogZnVuY3Rpb24gZmlsdGVyKHgpIHtcbiAgICBpZiAoeCA8PSAtMy4wIHx8IHggPj0gMy4wKSB7XG4gICAgICByZXR1cm4gMC4wO1xuICAgIH1cblxuICAgIGlmICh4ID4gLTEuMTkyMDkyOTBFLTA3ICYmIHggPCAxLjE5MjA5MjkwRS0wNykge1xuICAgICAgcmV0dXJuIDEuMDtcbiAgICB9XG5cbiAgICB2YXIgeHBpID0geCAqIE1hdGguUEk7XG4gICAgcmV0dXJuIE1hdGguc2luKHhwaSkgLyB4cGkgKiBNYXRoLnNpbih4cGkgLyAzLjApIC8gKHhwaSAvIDMuMCk7XG4gIH1cbn1dO1xuXG59LHt9XSw4OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblxudmFyIGNyZWF0ZUZpbHRlcnMgPSBfZGVyZXFfKCcuL3Jlc2l6ZV9maWx0ZXJfZ2VuJyk7XG5cbmZ1bmN0aW9uIHJlc2V0QWxwaGEoZHN0LCB3aWR0aCwgaGVpZ2h0KSB7XG4gIHZhciBwdHIgPSAzLFxuICAgICAgbGVuID0gd2lkdGggKiBoZWlnaHQgKiA0IHwgMDtcblxuICB3aGlsZSAocHRyIDwgbGVuKSB7XG4gICAgZHN0W3B0cl0gPSAweEZGO1xuICAgIHB0ciA9IHB0ciArIDQgfCAwO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFzVWludDhBcnJheShzcmMpIHtcbiAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHNyYy5idWZmZXIsIDAsIHNyYy5ieXRlTGVuZ3RoKTtcbn1cblxudmFyIElTX0xFID0gdHJ1ZTsgLy8gc2hvdWxkIG5vdCBjcmFzaCBldmVyeXRoaW5nIG9uIG1vZHVsZSBsb2FkIGluIG9sZCBicm93c2Vyc1xuXG50cnkge1xuICBJU19MRSA9IG5ldyBVaW50MzJBcnJheShuZXcgVWludDhBcnJheShbMSwgMCwgMCwgMF0pLmJ1ZmZlcilbMF0gPT09IDE7XG59IGNhdGNoIChfXykge31cblxuZnVuY3Rpb24gY29weUludDE2YXNMRShzcmMsIHRhcmdldCwgdGFyZ2V0X29mZnNldCkge1xuICBpZiAoSVNfTEUpIHtcbiAgICB0YXJnZXQuc2V0KGFzVWludDhBcnJheShzcmMpLCB0YXJnZXRfb2Zmc2V0KTtcbiAgICByZXR1cm47XG4gIH1cblxuICBmb3IgKHZhciBwdHIgPSB0YXJnZXRfb2Zmc2V0LCBpID0gMDsgaSA8IHNyYy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkYXRhID0gc3JjW2ldO1xuICAgIHRhcmdldFtwdHIrK10gPSBkYXRhICYgMHhGRjtcbiAgICB0YXJnZXRbcHRyKytdID0gZGF0YSA+PiA4ICYgMHhGRjtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHJlc2l6ZV93YXNtKG9wdGlvbnMpIHtcbiAgdmFyIHNyYyA9IG9wdGlvbnMuc3JjO1xuICB2YXIgc3JjVyA9IG9wdGlvbnMud2lkdGg7XG4gIHZhciBzcmNIID0gb3B0aW9ucy5oZWlnaHQ7XG4gIHZhciBkZXN0VyA9IG9wdGlvbnMudG9XaWR0aDtcbiAgdmFyIGRlc3RIID0gb3B0aW9ucy50b0hlaWdodDtcbiAgdmFyIHNjYWxlWCA9IG9wdGlvbnMuc2NhbGVYIHx8IG9wdGlvbnMudG9XaWR0aCAvIG9wdGlvbnMud2lkdGg7XG4gIHZhciBzY2FsZVkgPSBvcHRpb25zLnNjYWxlWSB8fCBvcHRpb25zLnRvSGVpZ2h0IC8gb3B0aW9ucy5oZWlnaHQ7XG4gIHZhciBvZmZzZXRYID0gb3B0aW9ucy5vZmZzZXRYIHx8IDAuMDtcbiAgdmFyIG9mZnNldFkgPSBvcHRpb25zLm9mZnNldFkgfHwgMC4wO1xuICB2YXIgZGVzdCA9IG9wdGlvbnMuZGVzdCB8fCBuZXcgVWludDhBcnJheShkZXN0VyAqIGRlc3RIICogNCk7XG4gIHZhciBxdWFsaXR5ID0gdHlwZW9mIG9wdGlvbnMucXVhbGl0eSA9PT0gJ3VuZGVmaW5lZCcgPyAzIDogb3B0aW9ucy5xdWFsaXR5O1xuICB2YXIgYWxwaGEgPSBvcHRpb25zLmFscGhhIHx8IGZhbHNlO1xuICB2YXIgZmlsdGVyc1ggPSBjcmVhdGVGaWx0ZXJzKHF1YWxpdHksIHNyY1csIGRlc3RXLCBzY2FsZVgsIG9mZnNldFgpLFxuICAgICAgZmlsdGVyc1kgPSBjcmVhdGVGaWx0ZXJzKHF1YWxpdHksIHNyY0gsIGRlc3RILCBzY2FsZVksIG9mZnNldFkpOyAvLyBkZXN0aW5hdGlvbiBpcyAwIHRvby5cblxuICB2YXIgc3JjX29mZnNldCA9IDA7IC8vIGJ1ZmZlciBiZXR3ZWVuIGNvbnZvbHZlIHBhc3Nlc1xuXG4gIHZhciB0bXBfb2Zmc2V0ID0gdGhpcy5fX2FsaWduKHNyY19vZmZzZXQgKyBNYXRoLm1heChzcmMuYnl0ZUxlbmd0aCwgZGVzdC5ieXRlTGVuZ3RoKSk7XG5cbiAgdmFyIGZpbHRlcnNYX29mZnNldCA9IHRoaXMuX19hbGlnbih0bXBfb2Zmc2V0ICsgc3JjSCAqIGRlc3RXICogNCk7XG5cbiAgdmFyIGZpbHRlcnNZX29mZnNldCA9IHRoaXMuX19hbGlnbihmaWx0ZXJzWF9vZmZzZXQgKyBmaWx0ZXJzWC5ieXRlTGVuZ3RoKTtcblxuICB2YXIgYWxsb2NfYnl0ZXMgPSBmaWx0ZXJzWV9vZmZzZXQgKyBmaWx0ZXJzWS5ieXRlTGVuZ3RoO1xuXG4gIHZhciBpbnN0YW5jZSA9IHRoaXMuX19pbnN0YW5jZSgncmVzaXplJywgYWxsb2NfYnl0ZXMpOyAvL1xuICAvLyBGaWxsIG1lbW9yeSBibG9jayB3aXRoIGRhdGEgdG8gcHJvY2Vzc1xuICAvL1xuXG5cbiAgdmFyIG1lbSA9IG5ldyBVaW50OEFycmF5KHRoaXMuX19tZW1vcnkuYnVmZmVyKTtcbiAgdmFyIG1lbTMyID0gbmV3IFVpbnQzMkFycmF5KHRoaXMuX19tZW1vcnkuYnVmZmVyKTsgLy8gMzItYml0IGNvcHkgaXMgbXVjaCBmYXN0ZXIgaW4gY2hyb21lXG5cbiAgdmFyIHNyYzMyID0gbmV3IFVpbnQzMkFycmF5KHNyYy5idWZmZXIpO1xuICBtZW0zMi5zZXQoc3JjMzIpOyAvLyBXZSBzaG91bGQgZ3VhcmFudGVlIExFIGJ5dGVzIG9yZGVyLiBGaWx0ZXJzIGFyZSBub3QgYmlnLCBzb1xuICAvLyBzcGVlZCBkaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCB2cyBkaXJlY3QgLnNldCgpXG5cbiAgY29weUludDE2YXNMRShmaWx0ZXJzWCwgbWVtLCBmaWx0ZXJzWF9vZmZzZXQpO1xuICBjb3B5SW50MTZhc0xFKGZpbHRlcnNZLCBtZW0sIGZpbHRlcnNZX29mZnNldCk7IC8vXG4gIC8vIE5vdyBjYWxsIHdlYmFzc2VtYmx5IG1ldGhvZFxuICAvLyBlbXNkayBkb2VzIG1ldGhvZCBuYW1lcyB3aXRoICdfJ1xuXG4gIHZhciBmbiA9IGluc3RhbmNlLmV4cG9ydHMuY29udm9sdmVIViB8fCBpbnN0YW5jZS5leHBvcnRzLl9jb252b2x2ZUhWO1xuICBmbihmaWx0ZXJzWF9vZmZzZXQsIGZpbHRlcnNZX29mZnNldCwgdG1wX29mZnNldCwgc3JjVywgc3JjSCwgZGVzdFcsIGRlc3RIKTsgLy9cbiAgLy8gQ29weSBkYXRhIGJhY2sgdG8gdHlwZWQgYXJyYXlcbiAgLy9cbiAgLy8gMzItYml0IGNvcHkgaXMgbXVjaCBmYXN0ZXIgaW4gY2hyb21lXG5cbiAgdmFyIGRlc3QzMiA9IG5ldyBVaW50MzJBcnJheShkZXN0LmJ1ZmZlcik7XG4gIGRlc3QzMi5zZXQobmV3IFVpbnQzMkFycmF5KHRoaXMuX19tZW1vcnkuYnVmZmVyLCAwLCBkZXN0SCAqIGRlc3RXKSk7IC8vIFRoYXQncyBmYXN0ZXIgdGhhbiBkb2luZyBjaGVja3MgaW4gY29udm9sdmVyLlxuICAvLyAhISEgTm90ZSwgY2FudmFzIGRhdGEgaXMgbm90IHByZW11bHRpcGxlZC4gV2UgZG9uJ3QgbmVlZCBvdGhlclxuICAvLyBhbHBoYSBjb3JyZWN0aW9ucy5cblxuICBpZiAoIWFscGhhKSByZXNldEFscGhhKGRlc3QsIGRlc3RXLCBkZXN0SCk7XG4gIHJldHVybiBkZXN0O1xufTtcblxufSx7XCIuL3Jlc2l6ZV9maWx0ZXJfZ2VuXCI6Nn1dLDk6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgbmFtZTogJ3Vuc2hhcnBfbWFzaycsXG4gIGZuOiBfZGVyZXFfKCcuL3Vuc2hhcnBfbWFzaycpLFxuICB3YXNtX2ZuOiBfZGVyZXFfKCcuL3Vuc2hhcnBfbWFza193YXNtJyksXG4gIHdhc21fc3JjOiBfZGVyZXFfKCcuL3Vuc2hhcnBfbWFza193YXNtX2Jhc2U2NCcpXG59O1xuXG59LHtcIi4vdW5zaGFycF9tYXNrXCI6MTAsXCIuL3Vuc2hhcnBfbWFza193YXNtXCI6MTEsXCIuL3Vuc2hhcnBfbWFza193YXNtX2Jhc2U2NFwiOjEyfV0sMTA6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXG52YXIgZ2x1cl9tb25vMTYgPSBfZGVyZXFfKCdnbHVyL21vbm8xNicpO1xuXG5mdW5jdGlvbiBoc3ZfdjE2KGltZywgd2lkdGgsIGhlaWdodCkge1xuICB2YXIgc2l6ZSA9IHdpZHRoICogaGVpZ2h0O1xuICB2YXIgb3V0ID0gbmV3IFVpbnQxNkFycmF5KHNpemUpO1xuICB2YXIgciwgZywgYiwgbWF4O1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgciA9IGltZ1s0ICogaV07XG4gICAgZyA9IGltZ1s0ICogaSArIDFdO1xuICAgIGIgPSBpbWdbNCAqIGkgKyAyXTtcbiAgICBtYXggPSByID49IGcgJiYgciA+PSBiID8gciA6IGcgPj0gYiAmJiBnID49IHIgPyBnIDogYjtcbiAgICBvdXRbaV0gPSBtYXggPDwgODtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gdW5zaGFycChpbWcsIHdpZHRoLCBoZWlnaHQsIGFtb3VudCwgcmFkaXVzLCB0aHJlc2hvbGQpIHtcbiAgdmFyIHYxLCB2Miwgdm11bDtcbiAgdmFyIGRpZmYsIGlUaW1lczQ7XG5cbiAgaWYgKGFtb3VudCA9PT0gMCB8fCByYWRpdXMgPCAwLjUpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAocmFkaXVzID4gMi4wKSB7XG4gICAgcmFkaXVzID0gMi4wO1xuICB9XG5cbiAgdmFyIGJyaWdodG5lc3MgPSBoc3ZfdjE2KGltZywgd2lkdGgsIGhlaWdodCk7XG4gIHZhciBibHVyZWQgPSBuZXcgVWludDE2QXJyYXkoYnJpZ2h0bmVzcyk7IC8vIGNvcHksIGJlY2F1c2UgYmx1ciBtb2RpZnkgc3JjXG5cbiAgZ2x1cl9tb25vMTYoYmx1cmVkLCB3aWR0aCwgaGVpZ2h0LCByYWRpdXMpO1xuICB2YXIgYW1vdW50RnAgPSBhbW91bnQgLyAxMDAgKiAweDEwMDAgKyAwLjUgfCAwO1xuICB2YXIgdGhyZXNob2xkRnAgPSB0aHJlc2hvbGQgPDwgODtcbiAgdmFyIHNpemUgPSB3aWR0aCAqIGhlaWdodDtcbiAgLyogZXNsaW50LWRpc2FibGUgaW5kZW50ICovXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcbiAgICB2MSA9IGJyaWdodG5lc3NbaV07XG4gICAgZGlmZiA9IHYxIC0gYmx1cmVkW2ldO1xuXG4gICAgaWYgKE1hdGguYWJzKGRpZmYpID49IHRocmVzaG9sZEZwKSB7XG4gICAgICAvLyBhZGQgdW5zaGFycCBtYXNrIHRvIHRoZSBicmlnaHRuZXNzIGNoYW5uZWxcbiAgICAgIHYyID0gdjEgKyAoYW1vdW50RnAgKiBkaWZmICsgMHg4MDAgPj4gMTIpOyAvLyBCb3RoIHYxIGFuZCB2MiBhcmUgd2l0aGluIFswLjAgLi4gMjU1LjBdICgwMDAwLUZGMDApIHJhbmdlLCBuZXZlciBnb2luZyBpbnRvXG4gICAgICAvLyBbMjU1LjAwMyAuLiAyNTUuOTk2XSAoRkYwMS1GRkZGKS4gVGhpcyBhbGxvd3MgdG8gcm91bmQgdGhpcyB2YWx1ZSBhcyAoeCsuNSl8MFxuICAgICAgLy8gbGF0ZXIgd2l0aG91dCBvdmVyZmxvd2luZy5cblxuICAgICAgdjIgPSB2MiA+IDB4ZmYwMCA/IDB4ZmYwMCA6IHYyO1xuICAgICAgdjIgPSB2MiA8IDB4MDAwMCA/IDB4MDAwMCA6IHYyOyAvLyBBdm9pZCBkaXZpc2lvbiBieSAwLiBWPTAgbWVhbnMgcmdiKDAsMCwwKSwgdW5zaGFycCB3aXRoIHVuc2hhcnBBbW91bnQ+MCBjYW5ub3RcbiAgICAgIC8vIGNoYW5nZSB0aGlzIHZhbHVlIChiZWNhdXNlIGRpZmYgYmV0d2VlbiBjb2xvcnMgZ2V0cyBpbmZsYXRlZCksIHNvIG5vIG5lZWQgdG8gdmVyaWZ5IGNvcnJlY3RuZXNzLlxuXG4gICAgICB2MSA9IHYxICE9PSAwID8gdjEgOiAxOyAvLyBNdWx0aXBseWluZyBWIGluIEhTViBtb2RlbCBieSBhIGNvbnN0YW50IGlzIGVxdWl2YWxlbnQgdG8gbXVsdGlwbHlpbmcgZWFjaCBjb21wb25lbnRcbiAgICAgIC8vIGluIFJHQiBieSB0aGUgc2FtZSBjb25zdGFudCAoc2FtZSBmb3IgSFNMKSwgc2VlIGFsc286XG4gICAgICAvLyBodHRwczovL2JlZXNidXp6LmJpei9jb2RlLzE2LWhzdi1jb2xvci10cmFuc2Zvcm1zXG5cbiAgICAgIHZtdWwgPSAodjIgPDwgMTIpIC8gdjEgfCAwOyAvLyBSZXN1bHQgd2lsbCBiZSBpbiBbMC4uMjU1XSByYW5nZSBiZWNhdXNlOlxuICAgICAgLy8gIC0gYWxsIG51bWJlcnMgYXJlIHBvc2l0aXZlXG4gICAgICAvLyAgLSByLGcsYiA8PSAodjEvMjU2KVxuICAgICAgLy8gIC0gcixnLGIsKHYxLzI1NiksKHYyLzI1NikgPD0gMjU1XG4gICAgICAvLyBTbyBoaWdoZXN0IHRoaXMgbnVtYmVyIGNhbiBnZXQgaXMgWCoyNTUvWCswLjU9MjU1LjUgd2hpY2ggaXMgPCAyNTYgYW5kIHJvdW5kcyBkb3duLlxuXG4gICAgICBpVGltZXM0ID0gaSAqIDQ7XG4gICAgICBpbWdbaVRpbWVzNF0gPSBpbWdbaVRpbWVzNF0gKiB2bXVsICsgMHg4MDAgPj4gMTI7IC8vIFJcblxuICAgICAgaW1nW2lUaW1lczQgKyAxXSA9IGltZ1tpVGltZXM0ICsgMV0gKiB2bXVsICsgMHg4MDAgPj4gMTI7IC8vIEdcblxuICAgICAgaW1nW2lUaW1lczQgKyAyXSA9IGltZ1tpVGltZXM0ICsgMl0gKiB2bXVsICsgMHg4MDAgPj4gMTI7IC8vIEJcbiAgICB9XG4gIH1cbn07XG5cbn0se1wiZ2x1ci9tb25vMTZcIjoxOH1dLDExOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB1bnNoYXJwKGltZywgd2lkdGgsIGhlaWdodCwgYW1vdW50LCByYWRpdXMsIHRocmVzaG9sZCkge1xuICBpZiAoYW1vdW50ID09PSAwIHx8IHJhZGl1cyA8IDAuNSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChyYWRpdXMgPiAyLjApIHtcbiAgICByYWRpdXMgPSAyLjA7XG4gIH1cblxuICB2YXIgcGl4ZWxzID0gd2lkdGggKiBoZWlnaHQ7XG4gIHZhciBpbWdfYnl0ZXNfY250ID0gcGl4ZWxzICogNDtcbiAgdmFyIGhzdl9ieXRlc19jbnQgPSBwaXhlbHMgKiAyO1xuICB2YXIgYmx1cl9ieXRlc19jbnQgPSBwaXhlbHMgKiAyO1xuICB2YXIgYmx1cl9saW5lX2J5dGVfY250ID0gTWF0aC5tYXgod2lkdGgsIGhlaWdodCkgKiA0OyAvLyBmbG9hdDMyIGFycmF5XG5cbiAgdmFyIGJsdXJfY29lZmZzX2J5dGVfY250ID0gOCAqIDQ7IC8vIGZsb2F0MzIgYXJyYXlcblxuICB2YXIgaW1nX29mZnNldCA9IDA7XG4gIHZhciBoc3Zfb2Zmc2V0ID0gaW1nX2J5dGVzX2NudDtcbiAgdmFyIGJsdXJfb2Zmc2V0ID0gaHN2X29mZnNldCArIGhzdl9ieXRlc19jbnQ7XG4gIHZhciBibHVyX3RtcF9vZmZzZXQgPSBibHVyX29mZnNldCArIGJsdXJfYnl0ZXNfY250O1xuICB2YXIgYmx1cl9saW5lX29mZnNldCA9IGJsdXJfdG1wX29mZnNldCArIGJsdXJfYnl0ZXNfY250O1xuICB2YXIgYmx1cl9jb2VmZnNfb2Zmc2V0ID0gYmx1cl9saW5lX29mZnNldCArIGJsdXJfbGluZV9ieXRlX2NudDtcblxuICB2YXIgaW5zdGFuY2UgPSB0aGlzLl9faW5zdGFuY2UoJ3Vuc2hhcnBfbWFzaycsIGltZ19ieXRlc19jbnQgKyBoc3ZfYnl0ZXNfY250ICsgYmx1cl9ieXRlc19jbnQgKiAyICsgYmx1cl9saW5lX2J5dGVfY250ICsgYmx1cl9jb2VmZnNfYnl0ZV9jbnQsIHtcbiAgICBleHA6IE1hdGguZXhwXG4gIH0pOyAvLyAzMi1iaXQgY29weSBpcyBtdWNoIGZhc3RlciBpbiBjaHJvbWVcblxuXG4gIHZhciBpbWczMiA9IG5ldyBVaW50MzJBcnJheShpbWcuYnVmZmVyKTtcbiAgdmFyIG1lbTMyID0gbmV3IFVpbnQzMkFycmF5KHRoaXMuX19tZW1vcnkuYnVmZmVyKTtcbiAgbWVtMzIuc2V0KGltZzMyKTsgLy8gSFNMXG5cbiAgdmFyIGZuID0gaW5zdGFuY2UuZXhwb3J0cy5oc3ZfdjE2IHx8IGluc3RhbmNlLmV4cG9ydHMuX2hzdl92MTY7XG4gIGZuKGltZ19vZmZzZXQsIGhzdl9vZmZzZXQsIHdpZHRoLCBoZWlnaHQpOyAvLyBCTFVSXG5cbiAgZm4gPSBpbnN0YW5jZS5leHBvcnRzLmJsdXJNb25vMTYgfHwgaW5zdGFuY2UuZXhwb3J0cy5fYmx1ck1vbm8xNjtcbiAgZm4oaHN2X29mZnNldCwgYmx1cl9vZmZzZXQsIGJsdXJfdG1wX29mZnNldCwgYmx1cl9saW5lX29mZnNldCwgYmx1cl9jb2VmZnNfb2Zmc2V0LCB3aWR0aCwgaGVpZ2h0LCByYWRpdXMpOyAvLyBVTlNIQVJQXG5cbiAgZm4gPSBpbnN0YW5jZS5leHBvcnRzLnVuc2hhcnAgfHwgaW5zdGFuY2UuZXhwb3J0cy5fdW5zaGFycDtcbiAgZm4oaW1nX29mZnNldCwgaW1nX29mZnNldCwgaHN2X29mZnNldCwgYmx1cl9vZmZzZXQsIHdpZHRoLCBoZWlnaHQsIGFtb3VudCwgdGhyZXNob2xkKTsgLy8gMzItYml0IGNvcHkgaXMgbXVjaCBmYXN0ZXIgaW4gY2hyb21lXG5cbiAgaW1nMzIuc2V0KG5ldyBVaW50MzJBcnJheSh0aGlzLl9fbWVtb3J5LmJ1ZmZlciwgMCwgcGl4ZWxzKSk7XG59O1xuXG59LHt9XSwxMjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovXG5cbm1vZHVsZS5leHBvcnRzID0gJ0FHRnpiUUVBQUFBQURBWmtlV3hwYm1zQUFBQUFBQUUwQjJBQUFHQUVmMzkvZndCZ0JuOS9mMzkvZndCZ0NIOS9mMzkvZjM5L0FHQUlmMzkvZjM5L2YzMEFZQUo5ZndCZ0FYd0JmQUlaQWdObGJuWURaWGh3QUFZRFpXNTJCbTFsYlc5eWVRSUFBQU1IQmdBRkFnUUJBd1lHQVg4QVFRQUxCNG9CQ0JGZlgzZGhjMjFmWTJGc2JGOWpkRzl5Y3dBQkZsOWZZblZwYkdSZloyRjFjM05wWVc1ZlkyOWxabk1BQWc1ZlgyZGhkWE56TVRaZmJHbHVaUUFEQ21Kc2RYSk5iMjV2TVRZQUJBZG9jM1pmZGpFMkFBVUhkVzV6YUdGeWNBQUdERjlmWkhOdlgyaGhibVJzWlFNQUdGOWZkMkZ6YlY5aGNIQnNlVjlrWVhSaFgzSmxiRzlqY3dBQkNzVU1CZ01BQVF2V0FRRUhmQ0FCUk51R3VrT0NHdnMvSUFDN295SUNSQUFBQUFBQUFBREFvaEFBSWdXMmpEZ0NGQ0FCSUFLYUVBQWlBeUFEb0NJR3RqZ0NFQ0FCUkFBQUFBQUFBUEEvSUFPaElnUWdCS0lnQXlBQ0lBS2dva1FBQUFBQUFBRHdQNkFnQmFHaklnUzJPQUlBSUFFZ0JTQUVtcUlpQjdZNEFnd2dBU0FESUFKRUFBQUFBQUFBOEQrZ0lBU2lvaUlJdGpnQ0NDQUJJQU1nQWtRQUFBQUFBQUR3djZBZ0JLS2lJZ0syT0FJRUlBRWdCeUFJb0NBRlJBQUFBQUFBQVBBL0lBYWhvQ0lEbzdZNEFod2dBU0FFSUFLZ0lBT2p0amdDR0F1R0JRTUdmd2w4QW4wZ0F5b0NEQ0VWSUFNcUFnZ2hGaUFES2dJVXV5RVJJQU1xQWhDN0lSQUNRQ0FFUVFGcklnaEJBRWdpQ1FSQUlBSWhCeUFBSVFZTUFRc2dBaUFBTHdFQXVDSVBJQU1xQWhpN29pSU1JQkdpSWcwZ0RDQVFvaUFQSUFNcUFnUzdJaE9pSWhRZ0F5b0NBTHNpRWlBUG9xQ2dvQ0lPdGpnQ0FDQUNRUVJxSVFjZ0FFRUNhaUVHSUFoRkRRQWdDRUVCSUFoQkFVZ2JJZ3BCZjNNaEN3Si9JQVFnQ210QkFYRkZCRUFnRGlFTklBZ01BUXNnQWlBTklBNGdFS0lnRkNBU0lBQXZBUUs0SWcraW9LQ2dJZzIyT0FJRUlBSkJDR29oQnlBQVFRUnFJUVlnRGlFTUlBUkJBbXNMSVFJZ0MwRUFJQVJyUmcwQUEwQWdCeUFNSUJHaUlBMGdFS0lnRHlBVG9pQVNJQVl2QVFDNElnNmlvS0NnSWd5Mk9BSUFJQWNnRFNBUm9pQU1JQkNpSUE0Z0U2SWdFaUFHTHdFQ3VDSVBvcUNnb0NJTnRqZ0NCQ0FIUVFocUlRY2dCa0VFYWlFR0lBSkJBa29oQUNBQ1FRSnJJUUlnQUEwQUN3c0NRQ0FKRFFBZ0FTQUZJQWhzUVFGMGFpSUFBbjhnQmtFQ2F5OEJBQ0lDdUNJTklCVzdJaEtpSUEwZ0Zyc2lFNktnSUEwZ0F5b0NITHVpSWd3Z0VLS2dJQXdnRWFLZ0lnOGdCMEVFYXlJSEtnSUF1NkFpRGtRQUFBQUFBQUR3UVdNZ0RrUUFBQUFBQUFBQUFHWnhCRUFnRHFzTUFRdEJBQXM3QVFBZ0NFVU5BQ0FHUVFScklRWkJBQ0FGYTBFQmRDRUJBMEFDZnlBTklCS2lJQUpCLy84RGNiZ2lEU0FUb3FBZ0R5SU9JQkNpb0NBTUlCR2lvQ0lQSUFkQkJHc2lCeW9DQUx1Z0lneEVBQUFBQUFBQThFRmpJQXhFQUFBQUFBQUFBQUJtY1FSQUlBeXJEQUVMUVFBTElRTWdCaThCQUNFQ0lBQWdBV29pQUNBRE93RUFJQVpCQW1zaEJpQUlRUUZLSVFNZ0RpRU1JQWhCQVdzaENDQUREUUFMQ3d2UkFnSUJmd2Q4QWtBZ0IwTUFBQUFBV3cwQUlBUkUyNGE2UTRJYSt6OGdCME1BQUFBL2w3dWpJZ2xFQUFBQUFBQUFBTUNpRUFBaURMYU1PQUlVSUFRZ0Nab1FBQ0lLSUFxZ0lnMjJPQUlRSUFSRUFBQUFBQUFBOEQ4Z0NxRWlDeUFMb2lBS0lBa2dDYUNpUkFBQUFBQUFBUEEvb0NBTW9hTWlDN1k0QWdBZ0JDQU1JQXVhb2lJT3RqZ0NEQ0FFSUFvZ0NVUUFBQUFBQUFEd1A2QWdDNktpSWcrMk9BSUlJQVFnQ2lBSlJBQUFBQUFBQVBDL29DQUxvcUlpQ2JZNEFnUWdCQ0FPSUErZ0lBeEVBQUFBQUFBQThEOGdEYUdnSWdxanRqZ0NIQ0FFSUFzZ0NhQWdDcU8yT0FJWUlBWUVRQU5BSUFBZ0JTQUliRUVCZEdvZ0FpQUlRUUYwYWlBRElBUWdCU0FHRUFNZ0NFRUJhaUlJSUFaSERRQUxDeUFGUlEwQVFRQWhDQU5BSUFJZ0JpQUliRUVCZEdvZ0FTQUlRUUYwYWlBRElBUWdCaUFGRUFNZ0NFRUJhaUlJSUFWSERRQUxDd3R4QVFOL0lBSWdBMndpQlFSQUEwQWdBU0FBS0FJQUlnUkJFSFpCL3dGeElnSWdBaUFFUVFoMlFmOEJjU0lESUFNZ0JFSC9BWEVpQkVrYklBSWdBMHNiSWdZZ0JpQUVJQUlnQkVzYklBTWdCRXNiUVFoME93RUFJQUZCQW1vaEFTQUFRUVJxSVFBZ0JVRUJheUlGRFFBTEN3dVpBZ0lEZndGOElBUWdCV3doQkFKL0lBYXpRd0FBZ0VXVVF3QUF5RUtWdTBRQUFBQUFBQURnUDZBaUM1bEVBQUFBQUFBQTRFRmpCRUFnQzZvTUFRdEJnSUNBZ0hnTElRVWdCQVJBSUFkQkNIUWhDVUVBSVFZRFFDQUpJQUlnQmtFQmRDSUhhaThCQUNJQklBTWdCMm92QVFCcklnY2dCMEVmZFNJSWFpQUljMDBFUUNBQUlBWkJBblFpQ0dvaUNpQUZJQWRzUVlBUWFrRU1kU0FCYWlJSFFZRCtBeUFIUVlEK0EwZ2JJZ2RCQUNBSFFRQktHMEVNZENBQlFRRWdBUnR1SWdFZ0NpMEFBR3hCZ0JCcVFReDJPZ0FBSUFBZ0NFRUJjbW9pQnlBQklBY3RBQUJzUVlBUWFrRU1kam9BQUNBQUlBaEJBbkpxSWdjZ0FTQUhMUUFBYkVHQUVHcEJESFk2QUFBTElBWkJBV29pQmlBRVJ3MEFDd3NMJztcblxufSx7fV0sMTM6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXG52YXIgR0NfSU5URVJWQUwgPSAxMDA7XG5cbmZ1bmN0aW9uIFBvb2woY3JlYXRlLCBpZGxlKSB7XG4gIHRoaXMuY3JlYXRlID0gY3JlYXRlO1xuICB0aGlzLmF2YWlsYWJsZSA9IFtdO1xuICB0aGlzLmFjcXVpcmVkID0ge307XG4gIHRoaXMubGFzdElkID0gMTtcbiAgdGhpcy50aW1lb3V0SWQgPSAwO1xuICB0aGlzLmlkbGUgPSBpZGxlIHx8IDIwMDA7XG59XG5cblBvb2wucHJvdG90eXBlLmFjcXVpcmUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgdmFyIHJlc291cmNlO1xuXG4gIGlmICh0aGlzLmF2YWlsYWJsZS5sZW5ndGggIT09IDApIHtcbiAgICByZXNvdXJjZSA9IHRoaXMuYXZhaWxhYmxlLnBvcCgpO1xuICB9IGVsc2Uge1xuICAgIHJlc291cmNlID0gdGhpcy5jcmVhdGUoKTtcbiAgICByZXNvdXJjZS5pZCA9IHRoaXMubGFzdElkKys7XG5cbiAgICByZXNvdXJjZS5yZWxlYXNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF90aGlzLnJlbGVhc2UocmVzb3VyY2UpO1xuICAgIH07XG4gIH1cblxuICB0aGlzLmFjcXVpcmVkW3Jlc291cmNlLmlkXSA9IHJlc291cmNlO1xuICByZXR1cm4gcmVzb3VyY2U7XG59O1xuXG5Qb29sLnByb3RvdHlwZS5yZWxlYXNlID0gZnVuY3Rpb24gKHJlc291cmNlKSB7XG4gIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gIGRlbGV0ZSB0aGlzLmFjcXVpcmVkW3Jlc291cmNlLmlkXTtcbiAgcmVzb3VyY2UubGFzdFVzZWQgPSBEYXRlLm5vdygpO1xuICB0aGlzLmF2YWlsYWJsZS5wdXNoKHJlc291cmNlKTtcblxuICBpZiAodGhpcy50aW1lb3V0SWQgPT09IDApIHtcbiAgICB0aGlzLnRpbWVvdXRJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF90aGlzMi5nYygpO1xuICAgIH0sIEdDX0lOVEVSVkFMKTtcbiAgfVxufTtcblxuUG9vbC5wcm90b3R5cGUuZ2MgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gIHZhciBub3cgPSBEYXRlLm5vdygpO1xuICB0aGlzLmF2YWlsYWJsZSA9IHRoaXMuYXZhaWxhYmxlLmZpbHRlcihmdW5jdGlvbiAocmVzb3VyY2UpIHtcbiAgICBpZiAobm93IC0gcmVzb3VyY2UubGFzdFVzZWQgPiBfdGhpczMuaWRsZSkge1xuICAgICAgcmVzb3VyY2UuZGVzdHJveSgpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9KTtcblxuICBpZiAodGhpcy5hdmFpbGFibGUubGVuZ3RoICE9PSAwKSB7XG4gICAgdGhpcy50aW1lb3V0SWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBfdGhpczMuZ2MoKTtcbiAgICB9LCBHQ19JTlRFUlZBTCk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy50aW1lb3V0SWQgPSAwO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFBvb2w7XG5cbn0se31dLDE0OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbi8vIG1pbiBzaXplID0gMSBjYW4gY29uc3VtZSBsYXJnZSBhbW91bnQgb2YgbWVtb3J5XG5cbnZhciBNSU5fSU5ORVJfVElMRV9TSVpFID0gMjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjcmVhdGVTdGFnZXMoZnJvbVdpZHRoLCBmcm9tSGVpZ2h0LCB0b1dpZHRoLCB0b0hlaWdodCwgc3JjVGlsZVNpemUsIGRlc3RUaWxlQm9yZGVyKSB7XG4gIHZhciBzY2FsZVggPSB0b1dpZHRoIC8gZnJvbVdpZHRoO1xuICB2YXIgc2NhbGVZID0gdG9IZWlnaHQgLyBmcm9tSGVpZ2h0OyAvLyBkZXJpdmVkIGZyb20gY3JlYXRlUmVnaW9ucyBlcXVhdGlvbjpcbiAgLy8gaW5uZXJUaWxlV2lkdGggPSBwaXhlbEZsb29yKHNyY1RpbGVTaXplICogc2NhbGVYKSAtIDIgKiBkZXN0VGlsZUJvcmRlcjtcblxuICB2YXIgbWluU2NhbGUgPSAoMiAqIGRlc3RUaWxlQm9yZGVyICsgTUlOX0lOTkVSX1RJTEVfU0laRSArIDEpIC8gc3JjVGlsZVNpemU7IC8vIHJlZnVzZSB0byBzY2FsZSBpbWFnZSBtdWx0aXBsZSB0aW1lcyBieSBsZXNzIHRoYW4gdHdpY2UgZWFjaCB0aW1lLFxuICAvLyBpdCBjb3VsZCBvbmx5IGhhcHBlbiBiZWNhdXNlIG9mIGludmFsaWQgb3B0aW9uc1xuXG4gIGlmIChtaW5TY2FsZSA+IDAuNSkgcmV0dXJuIFtbdG9XaWR0aCwgdG9IZWlnaHRdXTtcbiAgdmFyIHN0YWdlQ291bnQgPSBNYXRoLmNlaWwoTWF0aC5sb2coTWF0aC5taW4oc2NhbGVYLCBzY2FsZVkpKSAvIE1hdGgubG9nKG1pblNjYWxlKSk7IC8vIG5vIGFkZGl0aW9uYWwgcmVzaXplcyBhcmUgbmVjZXNzYXJ5LFxuICAvLyBzdGFnZUNvdW50IGNhbiBiZSB6ZXJvIG9yIGJlIG5lZ2F0aXZlIHdoZW4gZW5sYXJnaW5nIHRoZSBpbWFnZVxuXG4gIGlmIChzdGFnZUNvdW50IDw9IDEpIHJldHVybiBbW3RvV2lkdGgsIHRvSGVpZ2h0XV07XG4gIHZhciByZXN1bHQgPSBbXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0YWdlQ291bnQ7IGkrKykge1xuICAgIHZhciB3aWR0aCA9IE1hdGgucm91bmQoTWF0aC5wb3coTWF0aC5wb3coZnJvbVdpZHRoLCBzdGFnZUNvdW50IC0gaSAtIDEpICogTWF0aC5wb3codG9XaWR0aCwgaSArIDEpLCAxIC8gc3RhZ2VDb3VudCkpO1xuICAgIHZhciBoZWlnaHQgPSBNYXRoLnJvdW5kKE1hdGgucG93KE1hdGgucG93KGZyb21IZWlnaHQsIHN0YWdlQ291bnQgLSBpIC0gMSkgKiBNYXRoLnBvdyh0b0hlaWdodCwgaSArIDEpLCAxIC8gc3RhZ2VDb3VudCkpO1xuICAgIHJlc3VsdC5wdXNoKFt3aWR0aCwgaGVpZ2h0XSk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxufSx7fV0sMTU6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuLypcbiAqIHBpeGVsRmxvb3IgYW5kIHBpeGVsQ2VpbCBhcmUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgTWF0aC5mbG9vciBhbmQgTWF0aC5jZWlsXG4gKiBmdW5jdGlvbnMgd2hpY2ggdGFrZSBpbnRvIGFjY291bnQgZmxvYXRpbmcgcG9pbnQgYXJpdGhtZXRpYyBlcnJvcnMuXG4gKiBUaG9zZSBlcnJvcnMgY2FuIGNhdXNlIHVuZGVzaXJlZCBpbmNyZW1lbnRzL2RlY3JlbWVudHMgb2Ygc2l6ZXMgYW5kIG9mZnNldHM6XG4gKiBNYXRoLmNlaWwoMzYgLyAoMzYgLyA1MDApKSA9IDUwMVxuICogcGl4ZWxDZWlsKDM2IC8gKDM2IC8gNTAwKSkgPSA1MDBcbiAqL1xuXG52YXIgUElYRUxfRVBTSUxPTiA9IDFlLTU7XG5cbmZ1bmN0aW9uIHBpeGVsRmxvb3IoeCkge1xuICB2YXIgbmVhcmVzdCA9IE1hdGgucm91bmQoeCk7XG5cbiAgaWYgKE1hdGguYWJzKHggLSBuZWFyZXN0KSA8IFBJWEVMX0VQU0lMT04pIHtcbiAgICByZXR1cm4gbmVhcmVzdDtcbiAgfVxuXG4gIHJldHVybiBNYXRoLmZsb29yKHgpO1xufVxuXG5mdW5jdGlvbiBwaXhlbENlaWwoeCkge1xuICB2YXIgbmVhcmVzdCA9IE1hdGgucm91bmQoeCk7XG5cbiAgaWYgKE1hdGguYWJzKHggLSBuZWFyZXN0KSA8IFBJWEVMX0VQU0lMT04pIHtcbiAgICByZXR1cm4gbmVhcmVzdDtcbiAgfVxuXG4gIHJldHVybiBNYXRoLmNlaWwoeCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY3JlYXRlUmVnaW9ucyhvcHRpb25zKSB7XG4gIHZhciBzY2FsZVggPSBvcHRpb25zLnRvV2lkdGggLyBvcHRpb25zLndpZHRoO1xuICB2YXIgc2NhbGVZID0gb3B0aW9ucy50b0hlaWdodCAvIG9wdGlvbnMuaGVpZ2h0O1xuICB2YXIgaW5uZXJUaWxlV2lkdGggPSBwaXhlbEZsb29yKG9wdGlvbnMuc3JjVGlsZVNpemUgKiBzY2FsZVgpIC0gMiAqIG9wdGlvbnMuZGVzdFRpbGVCb3JkZXI7XG4gIHZhciBpbm5lclRpbGVIZWlnaHQgPSBwaXhlbEZsb29yKG9wdGlvbnMuc3JjVGlsZVNpemUgKiBzY2FsZVkpIC0gMiAqIG9wdGlvbnMuZGVzdFRpbGVCb3JkZXI7IC8vIHByZXZlbnQgaW5maW5pdGUgbG9vcCwgdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuXG5cbiAgaWYgKGlubmVyVGlsZVdpZHRoIDwgMSB8fCBpbm5lclRpbGVIZWlnaHQgPCAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnRlcm5hbCBlcnJvciBpbiBwaWNhOiB0YXJnZXQgdGlsZSB3aWR0aC9oZWlnaHQgaXMgdG9vIHNtYWxsLicpO1xuICB9XG5cbiAgdmFyIHgsIHk7XG4gIHZhciBpbm5lclgsIGlubmVyWSwgdG9UaWxlV2lkdGgsIHRvVGlsZUhlaWdodDtcbiAgdmFyIHRpbGVzID0gW107XG4gIHZhciB0aWxlOyAvLyB3ZSBnbyB0b3AtdG8tZG93biBpbnN0ZWFkIG9mIGxlZnQtdG8tcmlnaHQgdG8gbWFrZSBpbWFnZSBkaXNwbGF5ZWQgZnJvbSB0b3AgdG9cbiAgLy8gZG9lc24gaW4gdGhlIGJyb3dzZXJcblxuICBmb3IgKGlubmVyWSA9IDA7IGlubmVyWSA8IG9wdGlvbnMudG9IZWlnaHQ7IGlubmVyWSArPSBpbm5lclRpbGVIZWlnaHQpIHtcbiAgICBmb3IgKGlubmVyWCA9IDA7IGlubmVyWCA8IG9wdGlvbnMudG9XaWR0aDsgaW5uZXJYICs9IGlubmVyVGlsZVdpZHRoKSB7XG4gICAgICB4ID0gaW5uZXJYIC0gb3B0aW9ucy5kZXN0VGlsZUJvcmRlcjtcblxuICAgICAgaWYgKHggPCAwKSB7XG4gICAgICAgIHggPSAwO1xuICAgICAgfVxuXG4gICAgICB0b1RpbGVXaWR0aCA9IGlubmVyWCArIGlubmVyVGlsZVdpZHRoICsgb3B0aW9ucy5kZXN0VGlsZUJvcmRlciAtIHg7XG5cbiAgICAgIGlmICh4ICsgdG9UaWxlV2lkdGggPj0gb3B0aW9ucy50b1dpZHRoKSB7XG4gICAgICAgIHRvVGlsZVdpZHRoID0gb3B0aW9ucy50b1dpZHRoIC0geDtcbiAgICAgIH1cblxuICAgICAgeSA9IGlubmVyWSAtIG9wdGlvbnMuZGVzdFRpbGVCb3JkZXI7XG5cbiAgICAgIGlmICh5IDwgMCkge1xuICAgICAgICB5ID0gMDtcbiAgICAgIH1cblxuICAgICAgdG9UaWxlSGVpZ2h0ID0gaW5uZXJZICsgaW5uZXJUaWxlSGVpZ2h0ICsgb3B0aW9ucy5kZXN0VGlsZUJvcmRlciAtIHk7XG5cbiAgICAgIGlmICh5ICsgdG9UaWxlSGVpZ2h0ID49IG9wdGlvbnMudG9IZWlnaHQpIHtcbiAgICAgICAgdG9UaWxlSGVpZ2h0ID0gb3B0aW9ucy50b0hlaWdodCAtIHk7XG4gICAgICB9XG5cbiAgICAgIHRpbGUgPSB7XG4gICAgICAgIHRvWDogeCxcbiAgICAgICAgdG9ZOiB5LFxuICAgICAgICB0b1dpZHRoOiB0b1RpbGVXaWR0aCxcbiAgICAgICAgdG9IZWlnaHQ6IHRvVGlsZUhlaWdodCxcbiAgICAgICAgdG9Jbm5lclg6IGlubmVyWCxcbiAgICAgICAgdG9Jbm5lclk6IGlubmVyWSxcbiAgICAgICAgdG9Jbm5lcldpZHRoOiBpbm5lclRpbGVXaWR0aCxcbiAgICAgICAgdG9Jbm5lckhlaWdodDogaW5uZXJUaWxlSGVpZ2h0LFxuICAgICAgICBvZmZzZXRYOiB4IC8gc2NhbGVYIC0gcGl4ZWxGbG9vcih4IC8gc2NhbGVYKSxcbiAgICAgICAgb2Zmc2V0WTogeSAvIHNjYWxlWSAtIHBpeGVsRmxvb3IoeSAvIHNjYWxlWSksXG4gICAgICAgIHNjYWxlWDogc2NhbGVYLFxuICAgICAgICBzY2FsZVk6IHNjYWxlWSxcbiAgICAgICAgeDogcGl4ZWxGbG9vcih4IC8gc2NhbGVYKSxcbiAgICAgICAgeTogcGl4ZWxGbG9vcih5IC8gc2NhbGVZKSxcbiAgICAgICAgd2lkdGg6IHBpeGVsQ2VpbCh0b1RpbGVXaWR0aCAvIHNjYWxlWCksXG4gICAgICAgIGhlaWdodDogcGl4ZWxDZWlsKHRvVGlsZUhlaWdodCAvIHNjYWxlWSlcbiAgICAgIH07XG4gICAgICB0aWxlcy5wdXNoKHRpbGUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aWxlcztcbn07XG5cbn0se31dLDE2OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblxuZnVuY3Rpb24gb2JqQ2xhc3Mob2JqKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKTtcbn1cblxubW9kdWxlLmV4cG9ydHMuaXNDYW52YXMgPSBmdW5jdGlvbiBpc0NhbnZhcyhlbGVtZW50KSB7XG4gIHZhciBjbmFtZSA9IG9iakNsYXNzKGVsZW1lbnQpO1xuICByZXR1cm4gY25hbWUgPT09ICdbb2JqZWN0IEhUTUxDYW52YXNFbGVtZW50XSdcbiAgLyogYnJvd3NlciAqL1xuICB8fCBjbmFtZSA9PT0gJ1tvYmplY3QgT2Zmc2NyZWVuQ2FudmFzXScgfHwgY25hbWUgPT09ICdbb2JqZWN0IENhbnZhc10nXG4gIC8qIG5vZGUtY2FudmFzICovXG4gIDtcbn07XG5cbm1vZHVsZS5leHBvcnRzLmlzSW1hZ2UgPSBmdW5jdGlvbiBpc0ltYWdlKGVsZW1lbnQpIHtcbiAgcmV0dXJuIG9iakNsYXNzKGVsZW1lbnQpID09PSAnW29iamVjdCBIVE1MSW1hZ2VFbGVtZW50XSc7XG59O1xuXG5tb2R1bGUuZXhwb3J0cy5pc0ltYWdlQml0bWFwID0gZnVuY3Rpb24gaXNJbWFnZUJpdG1hcChlbGVtZW50KSB7XG4gIHJldHVybiBvYmpDbGFzcyhlbGVtZW50KSA9PT0gJ1tvYmplY3QgSW1hZ2VCaXRtYXBdJztcbn07XG5cbm1vZHVsZS5leHBvcnRzLmxpbWl0ZXIgPSBmdW5jdGlvbiBsaW1pdGVyKGNvbmN1cnJlbmN5KSB7XG4gIHZhciBhY3RpdmUgPSAwLFxuICAgICAgcXVldWUgPSBbXTtcblxuICBmdW5jdGlvbiByb2xsKCkge1xuICAgIGlmIChhY3RpdmUgPCBjb25jdXJyZW5jeSAmJiBxdWV1ZS5sZW5ndGgpIHtcbiAgICAgIGFjdGl2ZSsrO1xuICAgICAgcXVldWUuc2hpZnQoKSgpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiBsaW1pdChmbikge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBxdWV1ZS5wdXNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZm4oKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgICAgYWN0aXZlLS07XG4gICAgICAgICAgcm9sbCgpO1xuICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgYWN0aXZlLS07XG4gICAgICAgICAgcm9sbCgpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgcm9sbCgpO1xuICAgIH0pO1xuICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMuY2liX3F1YWxpdHlfbmFtZSA9IGZ1bmN0aW9uIGNpYl9xdWFsaXR5X25hbWUobnVtKSB7XG4gIHN3aXRjaCAobnVtKSB7XG4gICAgY2FzZSAwOlxuICAgICAgcmV0dXJuICdwaXhlbGF0ZWQnO1xuXG4gICAgY2FzZSAxOlxuICAgICAgcmV0dXJuICdsb3cnO1xuXG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuICdtZWRpdW0nO1xuICB9XG5cbiAgcmV0dXJuICdoaWdoJztcbn07XG5cbm1vZHVsZS5leHBvcnRzLmNpYl9zdXBwb3J0ID0gZnVuY3Rpb24gY2liX3N1cHBvcnQoY3JlYXRlQ2FudmFzKSB7XG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodHlwZW9mIGNyZWF0ZUltYWdlQml0bWFwID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHZhciBjID0gY3JlYXRlQ2FudmFzKDEwMCwgMTAwKTtcbiAgICByZXR1cm4gY3JlYXRlSW1hZ2VCaXRtYXAoYywgMCwgMCwgMTAwLCAxMDAsIHtcbiAgICAgIHJlc2l6ZVdpZHRoOiAxMCxcbiAgICAgIHJlc2l6ZUhlaWdodDogMTAsXG4gICAgICByZXNpemVRdWFsaXR5OiAnaGlnaCdcbiAgICB9KS50aGVuKGZ1bmN0aW9uIChiaXRtYXApIHtcbiAgICAgIHZhciBzdGF0dXMgPSBiaXRtYXAud2lkdGggPT09IDEwOyAvLyBCcmFuY2ggYmVsb3cgaXMgZmlsdGVyZWQgb24gdXBwZXIgbGV2ZWwuIFdlIGRvIG5vdCBjYWxsIHJlc2l6ZVxuICAgICAgLy8gZGV0ZWN0aW9uIGZvciBiYXNpYyBJbWFnZUJpdG1hcC5cbiAgICAgIC8vXG4gICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSW1hZ2VCaXRtYXBcbiAgICAgIC8vIG9sZCBDcm9tZSA1MSBoYXMgSW1hZ2VCaXRtYXAgd2l0aG91dCAuY2xvc2UoKS4gVGhlbiB0aGlzIGNvZGVcbiAgICAgIC8vIHdpbGwgdGhyb3cgYW5kIHJldHVybiAnZmFsc2UnIGFzIGV4cGVjdGVkLlxuICAgICAgLy9cblxuICAgICAgYml0bWFwLmNsb3NlKCk7XG4gICAgICBjID0gbnVsbDtcbiAgICAgIHJldHVybiBzdGF0dXM7XG4gICAgfSk7XG4gIH0pW1wiY2F0Y2hcIl0oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cy53b3JrZXJfb2Zmc2NyZWVuX2NhbnZhc19zdXBwb3J0ID0gZnVuY3Rpb24gd29ya2VyX29mZnNjcmVlbl9jYW52YXNfc3VwcG9ydCgpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICBpZiAodHlwZW9mIE9mZnNjcmVlbkNhbnZhcyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIC8vIGlmIE9mZnNjcmVlbkNhbnZhcyBpcyBwcmVzZW50LCB3ZSBhc3N1bWUgYnJvd3NlciBzdXBwb3J0cyBXb3JrZXIgYW5kIGJ1aWx0LWluIFByb21pc2UgYXMgd2VsbFxuICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gd29ya2VyUGF5bG9hZChzZWxmKSB7XG4gICAgICBpZiAodHlwZW9mIGNyZWF0ZUltYWdlQml0bWFwID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKGZhbHNlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNhbnZhcyA9IG5ldyBPZmZzY3JlZW5DYW52YXMoMTAsIDEwKTsgLy8gdGVzdCB0aGF0IDJkIGNvbnRleHQgY2FuIGJlIHVzZWQgaW4gd29ya2VyXG5cbiAgICAgICAgdmFyIGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgICBjdHgucmVjdCgwLCAwLCAxLCAxKTsgLy8gdGVzdCB0aGF0IGNpYiBjYW4gYmUgdXNlZCB0byByZXR1cm4gaW1hZ2UgYml0bWFwIGZyb20gd29ya2VyXG5cbiAgICAgICAgcmV0dXJuIGNyZWF0ZUltYWdlQml0bWFwKGNhbnZhcywgMCwgMCwgMSwgMSk7XG4gICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHNlbGYucG9zdE1lc3NhZ2UodHJ1ZSk7XG4gICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBzZWxmLnBvc3RNZXNzYWdlKGZhbHNlKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHZhciBjb2RlID0gYnRvYShcIihcIi5jb25jYXQod29ya2VyUGF5bG9hZC50b1N0cmluZygpLCBcIikoc2VsZik7XCIpKTtcbiAgICB2YXIgdyA9IG5ldyBXb3JrZXIoXCJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsXCIuY29uY2F0KGNvZGUpKTtcblxuICAgIHcub25tZXNzYWdlID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZShldi5kYXRhKTtcbiAgICB9O1xuXG4gICAgdy5vbmVycm9yID0gcmVqZWN0O1xuICB9KS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9KTtcbn07IC8vIENoZWNrIGlmIGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpLmdldEltYWdlRGF0YSBjYW4gYmUgdXNlZCxcbi8vIEZpcmVGb3ggcmFuZG9taXplcyB0aGUgb3V0cHV0IG9mIHRoYXQgZnVuY3Rpb24gaW4gYHByaXZhY3kucmVzaXN0RmluZ2VycHJpbnRpbmdgIG1vZGVcblxuXG5tb2R1bGUuZXhwb3J0cy5jYW5fdXNlX2NhbnZhcyA9IGZ1bmN0aW9uIGNhbl91c2VfY2FudmFzKGNyZWF0ZUNhbnZhcykge1xuICB2YXIgdXNhYmxlID0gZmFsc2U7XG5cbiAgdHJ5IHtcbiAgICB2YXIgY2FudmFzID0gY3JlYXRlQ2FudmFzKDIsIDEpO1xuICAgIHZhciBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICB2YXIgZCA9IGN0eC5jcmVhdGVJbWFnZURhdGEoMiwgMSk7XG4gICAgZC5kYXRhWzBdID0gMTI7XG4gICAgZC5kYXRhWzFdID0gMjM7XG4gICAgZC5kYXRhWzJdID0gMzQ7XG4gICAgZC5kYXRhWzNdID0gMjU1O1xuICAgIGQuZGF0YVs0XSA9IDQ1O1xuICAgIGQuZGF0YVs1XSA9IDU2O1xuICAgIGQuZGF0YVs2XSA9IDY3O1xuICAgIGQuZGF0YVs3XSA9IDI1NTtcbiAgICBjdHgucHV0SW1hZ2VEYXRhKGQsIDAsIDApO1xuICAgIGQgPSBudWxsO1xuICAgIGQgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIDIsIDEpO1xuXG4gICAgaWYgKGQuZGF0YVswXSA9PT0gMTIgJiYgZC5kYXRhWzFdID09PSAyMyAmJiBkLmRhdGFbMl0gPT09IDM0ICYmIGQuZGF0YVszXSA9PT0gMjU1ICYmIGQuZGF0YVs0XSA9PT0gNDUgJiYgZC5kYXRhWzVdID09PSA1NiAmJiBkLmRhdGFbNl0gPT09IDY3ICYmIGQuZGF0YVs3XSA9PT0gMjU1KSB7XG4gICAgICB1c2FibGUgPSB0cnVlO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7fVxuXG4gIHJldHVybiB1c2FibGU7XG59OyAvLyBDaGVjayBpZiBjcmVhdGVJbWFnZUJpdG1hcChpbWcsIHN4LCBzeSwgc3csIHNoKSBzaWduYXR1cmUgd29ya3MgY29ycmVjdGx5XG4vLyB3aXRoIEpQRUcgaW1hZ2VzIG9yaWVudGVkIHdpdGggRXhpZjtcbi8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTEyMjA2NzFcbi8vIFRPRE86IHJlbW92ZSBhZnRlciBpdCdzIGZpeGVkIGluIGNocm9tZSBmb3IgYXQgbGVhc3QgMiByZWxlYXNlc1xuXG5cbm1vZHVsZS5leHBvcnRzLmNpYl9jYW5fdXNlX3JlZ2lvbiA9IGZ1bmN0aW9uIGNpYl9jYW5fdXNlX3JlZ2lvbigpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgaWYgKHR5cGVvZiBjcmVhdGVJbWFnZUJpdG1hcCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBpbWFnZSA9IG5ldyBJbWFnZSgpO1xuICAgIGltYWdlLnNyYyA9ICdkYXRhOmltYWdlL2pwZWc7YmFzZTY0LCcgKyAnLzlqLzRRQmlSWGhwWmdBQVRVMEFLZ0FBQUFnQUJRRVNBQU1BQUFBQkFBWUFBQUVhQUFVQUFBQUJBQUFBU2dFYkFBVUFBJyArICdBQUJBQUFBVWdFb0FBTUFBQUFCQUFJQUFBSVRBQU1BQUFBQkFBRUFBQUFBQUFBQUFBQklBQUFBQVFBQUFFZ0FBQUFCLzknICsgJ3NBUXdBRUF3TUVBd01FQkFNRUJRUUVCUVlLQndZR0JnWU5DUW9JQ2c4TkVCQVBEUThPRVJNWUZCRVNGeElPRHhVY0ZSYycgKyAnWkdSc2JHeEFVSFI4ZEdoOFlHaHNhLzlzQVF3RUVCUVVHQlFZTUJ3Y01HaEVQRVJvYUdob2FHaG9hR2hvYUdob2FHaG9hJyArICdHaG9hR2hvYUdob2FHaG9hR2hvYUdob2FHaG9hR2hvYUdob2FHaG9hR2hvYS84SUFFUWdBQVFBQ0F3RVJBQUlSQVFNUkEnICsgJ2YvRUFCUUFBUUFBQUFBQUFBQUFBQUFBQUFBQUFBZi94QUFVQVFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBLzlvQURBTUJBQScgKyAnSVFBeEFBQUFGL1AvL0VBQlFRQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUQvMmdBSUFRRUFBUVVDZi8vRUFCUVJBUUFBQUFBJyArICdBQUFBQUFBQUFBQUFBQUFELzJnQUlBUU1CQVQ4QmYvL0VBQlFSQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUQvMmdBSUFRSUInICsgJ0FUOEJmLy9FQUJRUUFRQUFBQUFBQUFBQUFBQUFBQUFBQUFELzJnQUlBUUVBQmo4Q2YvL0VBQlFRQVFBQUFBQUFBQUFBQScgKyAnQUFBQUFBQUFBRC8yZ0FJQVFFQUFUOGhmLy9hQUF3REFRQUNBQU1BQUFBUUgvL0VBQlFSQVFBQUFBQUFBQUFBQUFBQUFBJyArICdBQUFBRC8yZ0FJQVFNQkFUOFFmLy9FQUJRUkFRQUFBQUFBQUFBQUFBQUFBQUFBQUFELzJnQUlBUUlCQVQ4UWYvL0VBQlEnICsgJ1FBUUFBQUFBQUFBQUFBQUFBQUFBQUFBRC8yZ0FJQVFFQUFUOFFmLy9aJztcblxuICAgIGltYWdlLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGNyZWF0ZUltYWdlQml0bWFwKGltYWdlLCAwLCAwLCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0KS50aGVuKGZ1bmN0aW9uIChiaXRtYXApIHtcbiAgICAgICAgaWYgKGJpdG1hcC53aWR0aCA9PT0gaW1hZ2Uud2lkdGggJiYgYml0bWFwLmhlaWdodCA9PT0gaW1hZ2UuaGVpZ2h0KSB7XG4gICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZShmYWxzZSk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgaW1hZ2Uub25lcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiByZXNvbHZlKGZhbHNlKTtcbiAgICB9O1xuICB9KTtcbn07XG5cbn0se31dLDE3OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBNYXRoTGliID0gX2RlcmVxXygnLi9tYXRobGliJyk7XG5cbiAgdmFyIG1hdGhMaWI7XG4gIC8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVmICovXG5cbiAgb25tZXNzYWdlID0gZnVuY3Rpb24gb25tZXNzYWdlKGV2KSB7XG4gICAgdmFyIHRpbGVPcHRzID0gZXYuZGF0YS5vcHRzO1xuICAgIHZhciByZXR1cm5CaXRtYXAgPSBmYWxzZTtcblxuICAgIGlmICghdGlsZU9wdHMuc3JjICYmIHRpbGVPcHRzLnNyY0JpdG1hcCkge1xuICAgICAgdmFyIGNhbnZhcyA9IG5ldyBPZmZzY3JlZW5DYW52YXModGlsZU9wdHMud2lkdGgsIHRpbGVPcHRzLmhlaWdodCk7XG4gICAgICB2YXIgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJywge1xuICAgICAgICBhbHBoYTogQm9vbGVhbih0aWxlT3B0cy5hbHBoYSlcbiAgICAgIH0pO1xuICAgICAgY3R4LmRyYXdJbWFnZSh0aWxlT3B0cy5zcmNCaXRtYXAsIDAsIDApO1xuICAgICAgdGlsZU9wdHMuc3JjID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCB0aWxlT3B0cy53aWR0aCwgdGlsZU9wdHMuaGVpZ2h0KS5kYXRhO1xuICAgICAgY2FudmFzLndpZHRoID0gY2FudmFzLmhlaWdodCA9IDA7XG4gICAgICBjYW52YXMgPSBudWxsO1xuICAgICAgdGlsZU9wdHMuc3JjQml0bWFwLmNsb3NlKCk7XG4gICAgICB0aWxlT3B0cy5zcmNCaXRtYXAgPSBudWxsO1xuICAgICAgcmV0dXJuQml0bWFwID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoIW1hdGhMaWIpIG1hdGhMaWIgPSBuZXcgTWF0aExpYihldi5kYXRhLmZlYXR1cmVzKTsgLy8gVXNlIG11bHRpbWF0aCdzIHN5bmMgYXV0by1pbml0LiBBdm9pZCBQcm9taXNlIHVzZSBpbiBvbGQgYnJvd3NlcnMsXG4gICAgLy8gYmVjYXVzZSBwb2x5ZmlsbHMgYXJlIG5vdCBwcm9wYWdhdGVkIHRvIHdlYndvcmtlci5cblxuICAgIHZhciBkYXRhID0gbWF0aExpYi5yZXNpemVBbmRVbnNoYXJwKHRpbGVPcHRzKTtcblxuICAgIGlmIChyZXR1cm5CaXRtYXApIHtcbiAgICAgIHZhciB0b0ltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEobmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGRhdGEpLCB0aWxlT3B0cy50b1dpZHRoLCB0aWxlT3B0cy50b0hlaWdodCk7XG5cbiAgICAgIHZhciBfY2FudmFzID0gbmV3IE9mZnNjcmVlbkNhbnZhcyh0aWxlT3B0cy50b1dpZHRoLCB0aWxlT3B0cy50b0hlaWdodCk7XG5cbiAgICAgIHZhciBfY3R4ID0gX2NhbnZhcy5nZXRDb250ZXh0KCcyZCcsIHtcbiAgICAgICAgYWxwaGE6IEJvb2xlYW4odGlsZU9wdHMuYWxwaGEpXG4gICAgICB9KTtcblxuICAgICAgX2N0eC5wdXRJbWFnZURhdGEodG9JbWFnZURhdGEsIDAsIDApO1xuXG4gICAgICBjcmVhdGVJbWFnZUJpdG1hcChfY2FudmFzKS50aGVuKGZ1bmN0aW9uIChiaXRtYXApIHtcbiAgICAgICAgcG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgIGJpdG1hcDogYml0bWFwXG4gICAgICAgIH0sIFtiaXRtYXBdKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBwb3N0TWVzc2FnZSh7XG4gICAgICAgIGRhdGE6IGRhdGFcbiAgICAgIH0sIFtkYXRhLmJ1ZmZlcl0pO1xuICAgIH1cbiAgfTtcbn07XG5cbn0se1wiLi9tYXRobGliXCI6MX1dLDE4OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbi8vIENhbGN1bGF0ZSBHYXVzc2lhbiBibHVyIG9mIGFuIGltYWdlIHVzaW5nIElJUiBmaWx0ZXJcbi8vIFRoZSBtZXRob2QgaXMgdGFrZW4gZnJvbSBJbnRlbCdzIHdoaXRlIHBhcGVyIGFuZCBjb2RlIGV4YW1wbGUgYXR0YWNoZWQgdG8gaXQ6XG4vLyBodHRwczovL3NvZnR3YXJlLmludGVsLmNvbS9lbi11cy9hcnRpY2xlcy9paXItZ2F1c3NpYW4tYmx1ci1maWx0ZXJcbi8vIC1pbXBsZW1lbnRhdGlvbi11c2luZy1pbnRlbC1hZHZhbmNlZC12ZWN0b3ItZXh0ZW5zaW9uc1xuXG52YXIgYTAsIGExLCBhMiwgYTMsIGIxLCBiMiwgbGVmdF9jb3JuZXIsIHJpZ2h0X2Nvcm5lcjtcblxuZnVuY3Rpb24gZ2F1c3NDb2VmKHNpZ21hKSB7XG4gIGlmIChzaWdtYSA8IDAuNSkge1xuICAgIHNpZ21hID0gMC41O1xuICB9XG5cbiAgdmFyIGEgPSBNYXRoLmV4cCgwLjcyNiAqIDAuNzI2KSAvIHNpZ21hLFxuICAgICAgZzEgPSBNYXRoLmV4cCgtYSksXG4gICAgICBnMiA9IE1hdGguZXhwKC0yICogYSksXG4gICAgICBrID0gKDEgLSBnMSkgKiAoMSAtIGcxKSAvICgxICsgMiAqIGEgKiBnMSAtIGcyKTtcblxuICBhMCA9IGs7XG4gIGExID0gayAqIChhIC0gMSkgKiBnMTtcbiAgYTIgPSBrICogKGEgKyAxKSAqIGcxO1xuICBhMyA9IC1rICogZzI7XG4gIGIxID0gMiAqIGcxO1xuICBiMiA9IC1nMjtcbiAgbGVmdF9jb3JuZXIgPSAoYTAgKyBhMSkgLyAoMSAtIGIxIC0gYjIpO1xuICByaWdodF9jb3JuZXIgPSAoYTIgKyBhMykgLyAoMSAtIGIxIC0gYjIpO1xuXG4gIC8vIEF0dGVtcHQgdG8gZm9yY2UgdHlwZSB0byBGUDMyLlxuICByZXR1cm4gbmV3IEZsb2F0MzJBcnJheShbIGEwLCBhMSwgYTIsIGEzLCBiMSwgYjIsIGxlZnRfY29ybmVyLCByaWdodF9jb3JuZXIgXSk7XG59XG5cbmZ1bmN0aW9uIGNvbnZvbHZlTW9ubzE2KHNyYywgb3V0LCBsaW5lLCBjb2VmZiwgd2lkdGgsIGhlaWdodCkge1xuICAvLyB0YWtlcyBzcmMgaW1hZ2UgYW5kIHdyaXRlcyB0aGUgYmx1cnJlZCBhbmQgdHJhbnNwb3NlZCByZXN1bHQgaW50byBvdXRcblxuICB2YXIgcHJldl9zcmMsIGN1cnJfc3JjLCBjdXJyX291dCwgcHJldl9vdXQsIHByZXZfcHJldl9vdXQ7XG4gIHZhciBzcmNfaW5kZXgsIG91dF9pbmRleCwgbGluZV9pbmRleDtcbiAgdmFyIGksIGo7XG4gIHZhciBjb2VmZl9hMCwgY29lZmZfYTEsIGNvZWZmX2IxLCBjb2VmZl9iMjtcblxuICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHtcbiAgICBzcmNfaW5kZXggPSBpICogd2lkdGg7XG4gICAgb3V0X2luZGV4ID0gaTtcbiAgICBsaW5lX2luZGV4ID0gMDtcblxuICAgIC8vIGxlZnQgdG8gcmlnaHRcbiAgICBwcmV2X3NyYyA9IHNyY1tzcmNfaW5kZXhdO1xuICAgIHByZXZfcHJldl9vdXQgPSBwcmV2X3NyYyAqIGNvZWZmWzZdO1xuICAgIHByZXZfb3V0ID0gcHJldl9wcmV2X291dDtcblxuICAgIGNvZWZmX2EwID0gY29lZmZbMF07XG4gICAgY29lZmZfYTEgPSBjb2VmZlsxXTtcbiAgICBjb2VmZl9iMSA9IGNvZWZmWzRdO1xuICAgIGNvZWZmX2IyID0gY29lZmZbNV07XG5cbiAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykge1xuICAgICAgY3Vycl9zcmMgPSBzcmNbc3JjX2luZGV4XTtcblxuICAgICAgY3Vycl9vdXQgPSBjdXJyX3NyYyAqIGNvZWZmX2EwICtcbiAgICAgICAgICAgICAgICAgcHJldl9zcmMgKiBjb2VmZl9hMSArXG4gICAgICAgICAgICAgICAgIHByZXZfb3V0ICogY29lZmZfYjEgK1xuICAgICAgICAgICAgICAgICBwcmV2X3ByZXZfb3V0ICogY29lZmZfYjI7XG5cbiAgICAgIHByZXZfcHJldl9vdXQgPSBwcmV2X291dDtcbiAgICAgIHByZXZfb3V0ID0gY3Vycl9vdXQ7XG4gICAgICBwcmV2X3NyYyA9IGN1cnJfc3JjO1xuXG4gICAgICBsaW5lW2xpbmVfaW5kZXhdID0gcHJldl9vdXQ7XG4gICAgICBsaW5lX2luZGV4Kys7XG4gICAgICBzcmNfaW5kZXgrKztcbiAgICB9XG5cbiAgICBzcmNfaW5kZXgtLTtcbiAgICBsaW5lX2luZGV4LS07XG4gICAgb3V0X2luZGV4ICs9IGhlaWdodCAqICh3aWR0aCAtIDEpO1xuXG4gICAgLy8gcmlnaHQgdG8gbGVmdFxuICAgIHByZXZfc3JjID0gc3JjW3NyY19pbmRleF07XG4gICAgcHJldl9wcmV2X291dCA9IHByZXZfc3JjICogY29lZmZbN107XG4gICAgcHJldl9vdXQgPSBwcmV2X3ByZXZfb3V0O1xuICAgIGN1cnJfc3JjID0gcHJldl9zcmM7XG5cbiAgICBjb2VmZl9hMCA9IGNvZWZmWzJdO1xuICAgIGNvZWZmX2ExID0gY29lZmZbM107XG5cbiAgICBmb3IgKGogPSB3aWR0aCAtIDE7IGogPj0gMDsgai0tKSB7XG4gICAgICBjdXJyX291dCA9IGN1cnJfc3JjICogY29lZmZfYTAgK1xuICAgICAgICAgICAgICAgICBwcmV2X3NyYyAqIGNvZWZmX2ExICtcbiAgICAgICAgICAgICAgICAgcHJldl9vdXQgKiBjb2VmZl9iMSArXG4gICAgICAgICAgICAgICAgIHByZXZfcHJldl9vdXQgKiBjb2VmZl9iMjtcblxuICAgICAgcHJldl9wcmV2X291dCA9IHByZXZfb3V0O1xuICAgICAgcHJldl9vdXQgPSBjdXJyX291dDtcblxuICAgICAgcHJldl9zcmMgPSBjdXJyX3NyYztcbiAgICAgIGN1cnJfc3JjID0gc3JjW3NyY19pbmRleF07XG5cbiAgICAgIG91dFtvdXRfaW5kZXhdID0gbGluZVtsaW5lX2luZGV4XSArIHByZXZfb3V0O1xuXG4gICAgICBzcmNfaW5kZXgtLTtcbiAgICAgIGxpbmVfaW5kZXgtLTtcbiAgICAgIG91dF9pbmRleCAtPSBoZWlnaHQ7XG4gICAgfVxuICB9XG59XG5cblxuZnVuY3Rpb24gYmx1ck1vbm8xNihzcmMsIHdpZHRoLCBoZWlnaHQsIHJhZGl1cykge1xuICAvLyBRdWljayBleGl0IG9uIHplcm8gcmFkaXVzXG4gIGlmICghcmFkaXVzKSB7IHJldHVybjsgfVxuXG4gIHZhciBvdXQgICAgICA9IG5ldyBVaW50MTZBcnJheShzcmMubGVuZ3RoKSxcbiAgICAgIHRtcF9saW5lID0gbmV3IEZsb2F0MzJBcnJheShNYXRoLm1heCh3aWR0aCwgaGVpZ2h0KSk7XG5cbiAgdmFyIGNvZWZmID0gZ2F1c3NDb2VmKHJhZGl1cyk7XG5cbiAgY29udm9sdmVNb25vMTYoc3JjLCBvdXQsIHRtcF9saW5lLCBjb2VmZiwgd2lkdGgsIGhlaWdodCk7XG4gIGNvbnZvbHZlTW9ubzE2KG91dCwgc3JjLCB0bXBfbGluZSwgY29lZmYsIGhlaWdodCwgd2lkdGgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJsdXJNb25vMTY7XG5cbn0se31dLDE5OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbmlmICh0eXBlb2YgT2JqZWN0LmNyZWF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAvLyBpbXBsZW1lbnRhdGlvbiBmcm9tIHN0YW5kYXJkIG5vZGUuanMgJ3V0aWwnIG1vZHVsZVxuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGlmIChzdXBlckN0b3IpIHtcbiAgICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yO1xuICAgICAgY3Rvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ3Rvci5wcm90b3R5cGUsIHtcbiAgICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgICB2YWx1ZTogY3RvcixcbiAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9O1xufSBlbHNlIHtcbiAgLy8gb2xkIHNjaG9vbCBzaGltIGZvciBvbGQgYnJvd3NlcnNcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBpZiAoc3VwZXJDdG9yKSB7XG4gICAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvcjtcbiAgICAgIHZhciBUZW1wQ3RvciA9IGZ1bmN0aW9uICgpIHt9O1xuICAgICAgVGVtcEN0b3IucHJvdG90eXBlID0gc3VwZXJDdG9yLnByb3RvdHlwZTtcbiAgICAgIGN0b3IucHJvdG90eXBlID0gbmV3IFRlbXBDdG9yKCk7XG4gICAgICBjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGN0b3I7XG4gICAgfVxuICB9O1xufVxuXG59LHt9XSwyMDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cblxudmFyIGFzc2lnbiAgICAgICAgID0gX2RlcmVxXygnb2JqZWN0LWFzc2lnbicpO1xudmFyIGJhc2U2NGRlY29kZSAgID0gX2RlcmVxXygnLi9saWIvYmFzZTY0ZGVjb2RlJyk7XG52YXIgaGFzV2ViQXNzZW1ibHkgPSBfZGVyZXFfKCcuL2xpYi93YV9kZXRlY3QnKTtcblxuXG52YXIgREVGQVVMVF9PUFRJT05TID0ge1xuICBqczogdHJ1ZSxcbiAgd2FzbTogdHJ1ZVxufTtcblxuXG5mdW5jdGlvbiBNdWx0aU1hdGgob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgTXVsdGlNYXRoKSkgcmV0dXJuIG5ldyBNdWx0aU1hdGgob3B0aW9ucyk7XG5cbiAgdmFyIG9wdHMgPSBhc3NpZ24oe30sIERFRkFVTFRfT1BUSU9OUywgb3B0aW9ucyB8fCB7fSk7XG5cbiAgdGhpcy5vcHRpb25zICAgICAgICAgPSBvcHRzO1xuXG4gIHRoaXMuX19jYWNoZSAgICAgICAgID0ge307XG5cbiAgdGhpcy5fX2luaXRfcHJvbWlzZSAgPSBudWxsO1xuICB0aGlzLl9fbW9kdWxlcyAgICAgICA9IG9wdHMubW9kdWxlcyB8fCB7fTtcbiAgdGhpcy5fX21lbW9yeSAgICAgICAgPSBudWxsO1xuICB0aGlzLl9fd2FzbSAgICAgICAgICA9IHt9O1xuXG4gIHRoaXMuX19pc0xFID0gKChuZXcgVWludDMyQXJyYXkoKG5ldyBVaW50OEFycmF5KFsgMSwgMCwgMCwgMCBdKSkuYnVmZmVyKSlbMF0gPT09IDEpO1xuXG4gIGlmICghdGhpcy5vcHRpb25zLmpzICYmICF0aGlzLm9wdGlvbnMud2FzbSkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWF0aGxpYjogYXQgbGVhc3QgXCJqc1wiIG9yIFwid2FzbVwiIHNob3VsZCBiZSBlbmFibGVkJyk7XG4gIH1cbn1cblxuXG5NdWx0aU1hdGgucHJvdG90eXBlLmhhc193YXNtID0gaGFzV2ViQXNzZW1ibHk7XG5cblxuTXVsdGlNYXRoLnByb3RvdHlwZS51c2UgPSBmdW5jdGlvbiAobW9kdWxlKSB7XG4gIHRoaXMuX19tb2R1bGVzW21vZHVsZS5uYW1lXSA9IG1vZHVsZTtcblxuICAvLyBQaW4gdGhlIGJlc3QgcG9zc2libGUgaW1wbGVtZW50YXRpb25cbiAgaWYgKHRoaXMub3B0aW9ucy53YXNtICYmIHRoaXMuaGFzX3dhc20oKSAmJiBtb2R1bGUud2FzbV9mbikge1xuICAgIHRoaXNbbW9kdWxlLm5hbWVdID0gbW9kdWxlLndhc21fZm47XG4gIH0gZWxzZSB7XG4gICAgdGhpc1ttb2R1bGUubmFtZV0gPSBtb2R1bGUuZm47XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cblxuTXVsdGlNYXRoLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5fX2luaXRfcHJvbWlzZSkgcmV0dXJuIHRoaXMuX19pbml0X3Byb21pc2U7XG5cbiAgaWYgKCF0aGlzLm9wdGlvbnMuanMgJiYgdGhpcy5vcHRpb25zLndhc20gJiYgIXRoaXMuaGFzX3dhc20oKSkge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ21hdGhsaWI6IG9ubHkgXCJ3YXNtXCIgd2FzIGVuYWJsZWQsIGJ1dCBpdFxcJ3Mgbm90IHN1cHBvcnRlZCcpKTtcbiAgfVxuXG4gIHZhciBzZWxmID0gdGhpcztcblxuICB0aGlzLl9faW5pdF9wcm9taXNlID0gUHJvbWlzZS5hbGwoT2JqZWN0LmtleXMoc2VsZi5fX21vZHVsZXMpLm1hcChmdW5jdGlvbiAobmFtZSkge1xuICAgIHZhciBtb2R1bGUgPSBzZWxmLl9fbW9kdWxlc1tuYW1lXTtcblxuICAgIGlmICghc2VsZi5vcHRpb25zLndhc20gfHwgIXNlbGYuaGFzX3dhc20oKSB8fCAhbW9kdWxlLndhc21fZm4pIHJldHVybiBudWxsO1xuXG4gICAgLy8gSWYgYWxyZWFkeSBjb21waWxlZCAtIGV4aXRcbiAgICBpZiAoc2VsZi5fX3dhc21bbmFtZV0pIHJldHVybiBudWxsO1xuXG4gICAgLy8gQ29tcGlsZSB3YXNtIHNvdXJjZVxuICAgIHJldHVybiBXZWJBc3NlbWJseS5jb21waWxlKHNlbGYuX19iYXNlNjRkZWNvZGUobW9kdWxlLndhc21fc3JjKSlcbiAgICAgIC50aGVuKGZ1bmN0aW9uIChtKSB7IHNlbGYuX193YXNtW25hbWVdID0gbTsgfSk7XG4gIH0pKVxuICAgIC50aGVuKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHNlbGY7IH0pO1xuXG4gIHJldHVybiB0aGlzLl9faW5pdF9wcm9taXNlO1xufTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gTWV0aG9kcyBiZWxvdyBhcmUgZm9yIGludGVybmFsIHVzZSBmcm9tIHBsdWdpbnNcblxuXG4vLyBTaW1wbGUgZGVjb2RlIGJhc2U2NCB0byB0eXBlZCBhcnJheS4gVXNlZnVsIHRvIGxvYWQgZW1iZWRkZWQgd2ViYXNzZW1ibHlcbi8vIGNvZGUuIFlvdSBwcm9iYWJseSBkb24ndCBuZWVkIHRvIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuXG4vL1xuTXVsdGlNYXRoLnByb3RvdHlwZS5fX2Jhc2U2NGRlY29kZSA9IGJhc2U2NGRlY29kZTtcblxuXG4vLyBJbmNyZWFzZSBjdXJyZW50IG1lbW9yeSB0byBpbmNsdWRlIHNwZWNpZmllZCBudW1iZXIgb2YgYnl0ZXMuIERvIG5vdGhpbmcgaWZcbi8vIHNpemUgaXMgYWxyZWFkeSBvay4gWW91IHByb2JhYmx5IGRvbid0IG5lZWQgdG8gY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseSxcbi8vIGJlY2F1c2UgaXQgd2lsbCBiZSBpbnZva2VkIGZyb20gYC5fX2luc3RhbmNlKClgLlxuLy9cbk11bHRpTWF0aC5wcm90b3R5cGUuX19yZWFsbG9jYXRlID0gZnVuY3Rpb24gbWVtX2dyb3dfdG8oYnl0ZXMpIHtcbiAgaWYgKCF0aGlzLl9fbWVtb3J5KSB7XG4gICAgdGhpcy5fX21lbW9yeSA9IG5ldyBXZWJBc3NlbWJseS5NZW1vcnkoe1xuICAgICAgaW5pdGlhbDogTWF0aC5jZWlsKGJ5dGVzIC8gKDY0ICogMTAyNCkpXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuX19tZW1vcnk7XG4gIH1cblxuICB2YXIgbWVtX3NpemUgPSB0aGlzLl9fbWVtb3J5LmJ1ZmZlci5ieXRlTGVuZ3RoO1xuXG4gIGlmIChtZW1fc2l6ZSA8IGJ5dGVzKSB7XG4gICAgdGhpcy5fX21lbW9yeS5ncm93KE1hdGguY2VpbCgoYnl0ZXMgLSBtZW1fc2l6ZSkgLyAoNjQgKiAxMDI0KSkpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuX19tZW1vcnk7XG59O1xuXG5cbi8vIFJldHVybnMgaW5zdGFudGluYXRlZCB3ZWJhc3NlbWJseSBpdGVtIGJ5IG5hbWUsIHdpdGggc3BlY2lmaWVkIG1lbW9yeSBzaXplXG4vLyBhbmQgZW52aXJvbm1lbnQuXG4vLyAtIHVzZSBjYWNoZSBpZiBhdmFpbGFibGVcbi8vIC0gZG8gc3luYyBtb2R1bGUgaW5pdCwgaWYgYXN5bmMgaW5pdCB3YXMgbm90IGNhbGxlZCBlYXJsaWVyXG4vLyAtIGFsbG9jYXRlIG1lbW9yeSBpZiBub3QgZW5vdWd0aFxuLy8gLSBjYW4gZXhwb3J0IGZ1bmN0aW9ucyB0byB3ZWJhc3NlbWJseSB2aWEgXCJlbnZfZXh0cmFcIixcbi8vICAgZm9yIGV4YW1wbGUsIHsgZXhwOiBNYXRoLmV4cCB9XG4vL1xuTXVsdGlNYXRoLnByb3RvdHlwZS5fX2luc3RhbmNlID0gZnVuY3Rpb24gaW5zdGFuY2UobmFtZSwgbWVtc2l6ZSwgZW52X2V4dHJhKSB7XG4gIGlmIChtZW1zaXplKSB0aGlzLl9fcmVhbGxvY2F0ZShtZW1zaXplKTtcblxuICAvLyBJZiAuaW5pdCgpIHdhcyBub3QgY2FsbGVkLCBkbyBzeW5jIGNvbXBpbGVcbiAgaWYgKCF0aGlzLl9fd2FzbVtuYW1lXSkge1xuICAgIHZhciBtb2R1bGUgPSB0aGlzLl9fbW9kdWxlc1tuYW1lXTtcbiAgICB0aGlzLl9fd2FzbVtuYW1lXSA9IG5ldyBXZWJBc3NlbWJseS5Nb2R1bGUodGhpcy5fX2Jhc2U2NGRlY29kZShtb2R1bGUud2FzbV9zcmMpKTtcbiAgfVxuXG4gIGlmICghdGhpcy5fX2NhY2hlW25hbWVdKSB7XG4gICAgdmFyIGVudl9iYXNlID0ge1xuICAgICAgbWVtb3J5QmFzZTogMCxcbiAgICAgIG1lbW9yeTogdGhpcy5fX21lbW9yeSxcbiAgICAgIHRhYmxlQmFzZTogMCxcbiAgICAgIHRhYmxlOiBuZXcgV2ViQXNzZW1ibHkuVGFibGUoeyBpbml0aWFsOiAwLCBlbGVtZW50OiAnYW55ZnVuYycgfSlcbiAgICB9O1xuXG4gICAgdGhpcy5fX2NhY2hlW25hbWVdID0gbmV3IFdlYkFzc2VtYmx5Lkluc3RhbmNlKHRoaXMuX193YXNtW25hbWVdLCB7XG4gICAgICBlbnY6IGFzc2lnbihlbnZfYmFzZSwgZW52X2V4dHJhIHx8IHt9KVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuX19jYWNoZVtuYW1lXTtcbn07XG5cblxuLy8gSGVscGVyIHRvIGNhbGN1bGF0ZSBtZW1vcnkgYWxpZ2ggZm9yIHBvaW50ZXJzLiBXZWJhc3NlbWJseSBkb2VzIG5vdCByZXF1aXJlXG4vLyB0aGlzLCBidXQgeW91IG1heSB3aXNoIHRvIGV4cGVyaW1lbnQuIERlZmF1bHQgYmFzZSA9IDg7XG4vL1xuTXVsdGlNYXRoLnByb3RvdHlwZS5fX2FsaWduID0gZnVuY3Rpb24gYWxpZ24obnVtYmVyLCBiYXNlKSB7XG4gIGJhc2UgPSBiYXNlIHx8IDg7XG4gIHZhciByZW1pbmRlciA9IG51bWJlciAlIGJhc2U7XG4gIHJldHVybiBudW1iZXIgKyAocmVtaW5kZXIgPyBiYXNlIC0gcmVtaW5kZXIgOiAwKTtcbn07XG5cblxubW9kdWxlLmV4cG9ydHMgPSBNdWx0aU1hdGg7XG5cbn0se1wiLi9saWIvYmFzZTY0ZGVjb2RlXCI6MjEsXCIuL2xpYi93YV9kZXRlY3RcIjoyMixcIm9iamVjdC1hc3NpZ25cIjoyM31dLDIxOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblxuXG52YXIgQkFTRTY0X01BUCA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJztcblxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGJhc2U2NGRlY29kZShzdHIpIHtcbiAgdmFyIGlucHV0ID0gc3RyLnJlcGxhY2UoL1tcXHJcXG49XS9nLCAnJyksIC8vIHJlbW92ZSBDUi9MRiAmIHBhZGRpbmcgdG8gc2ltcGxpZnkgc2NhblxuICAgICAgbWF4ICAgPSBpbnB1dC5sZW5ndGg7XG5cbiAgdmFyIG91dCA9IG5ldyBVaW50OEFycmF5KChtYXggKiAzKSA+PiAyKTtcblxuICAvLyBDb2xsZWN0IGJ5IDYqNCBiaXRzICgzIGJ5dGVzKVxuXG4gIHZhciBiaXRzID0gMDtcbiAgdmFyIHB0ciAgPSAwO1xuXG4gIGZvciAodmFyIGlkeCA9IDA7IGlkeCA8IG1heDsgaWR4KyspIHtcbiAgICBpZiAoKGlkeCAlIDQgPT09IDApICYmIGlkeCkge1xuICAgICAgb3V0W3B0cisrXSA9IChiaXRzID4+IDE2KSAmIDB4RkY7XG4gICAgICBvdXRbcHRyKytdID0gKGJpdHMgPj4gOCkgJiAweEZGO1xuICAgICAgb3V0W3B0cisrXSA9IGJpdHMgJiAweEZGO1xuICAgIH1cblxuICAgIGJpdHMgPSAoYml0cyA8PCA2KSB8IEJBU0U2NF9NQVAuaW5kZXhPZihpbnB1dC5jaGFyQXQoaWR4KSk7XG4gIH1cblxuICAvLyBEdW1wIHRhaWxcblxuICB2YXIgdGFpbGJpdHMgPSAobWF4ICUgNCkgKiA2O1xuXG4gIGlmICh0YWlsYml0cyA9PT0gMCkge1xuICAgIG91dFtwdHIrK10gPSAoYml0cyA+PiAxNikgJiAweEZGO1xuICAgIG91dFtwdHIrK10gPSAoYml0cyA+PiA4KSAmIDB4RkY7XG4gICAgb3V0W3B0cisrXSA9IGJpdHMgJiAweEZGO1xuICB9IGVsc2UgaWYgKHRhaWxiaXRzID09PSAxOCkge1xuICAgIG91dFtwdHIrK10gPSAoYml0cyA+PiAxMCkgJiAweEZGO1xuICAgIG91dFtwdHIrK10gPSAoYml0cyA+PiAyKSAmIDB4RkY7XG4gIH0gZWxzZSBpZiAodGFpbGJpdHMgPT09IDEyKSB7XG4gICAgb3V0W3B0cisrXSA9IChiaXRzID4+IDQpICYgMHhGRjtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59O1xuXG59LHt9XSwyMjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cblxudmFyIHdhO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaGFzV2ViQXNzZW1ibHkoKSB7XG4gIC8vIHVzZSBjYWNoZSBpZiBjYWxsZWQgYmVmb3JlO1xuICBpZiAodHlwZW9mIHdhICE9PSAndW5kZWZpbmVkJykgcmV0dXJuIHdhO1xuXG4gIHdhID0gZmFsc2U7XG5cbiAgaWYgKHR5cGVvZiBXZWJBc3NlbWJseSA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybiB3YTtcblxuICAvLyBJZiBXZWJBc3NlbmJseSBpcyBkaXNhYmxlZCwgY29kZSBjYW4gdGhyb3cgb24gY29tcGlsZVxuICB0cnkge1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9icmlvbi9taW4td2FzbS1mYWlsL2Jsb2IvbWFzdGVyL21pbi13YXNtLWZhaWwuaW4uanNcbiAgICAvLyBBZGRpdGlvbmFsIGNoZWNrIHRoYXQgV0EgaW50ZXJuYWxzIGFyZSBjb3JyZWN0XG5cbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBjb21tYS1zcGFjaW5nLCBtYXgtbGVuICovXG4gICAgdmFyIGJpbiAgICAgID0gbmV3IFVpbnQ4QXJyYXkoWyAwLDk3LDExNSwxMDksMSwwLDAsMCwxLDYsMSw5NiwxLDEyNywxLDEyNywzLDIsMSwwLDUsMywxLDAsMSw3LDgsMSw0LDExNiwxMDEsMTE1LDExNiwwLDAsMTAsMTYsMSwxNCwwLDMyLDAsNjUsMSw1NCwyLDAsMzIsMCw0MCwyLDAsMTEgXSk7XG4gICAgdmFyIG1vZHVsZSAgID0gbmV3IFdlYkFzc2VtYmx5Lk1vZHVsZShiaW4pO1xuICAgIHZhciBpbnN0YW5jZSA9IG5ldyBXZWJBc3NlbWJseS5JbnN0YW5jZShtb2R1bGUsIHt9KTtcblxuICAgIC8vIHRlc3Qgc3RvcmluZyB0byBhbmQgbG9hZGluZyBmcm9tIGEgbm9uLXplcm8gbG9jYXRpb24gdmlhIGEgcGFyYW1ldGVyLlxuICAgIC8vIFNhZmFyaSBvbiBpT1MgMTEuMi41IHJldHVybnMgMCB1bmV4cGVjdGVkbHkgYXQgbm9uLXplcm8gbG9jYXRpb25zXG4gICAgaWYgKGluc3RhbmNlLmV4cG9ydHMudGVzdCg0KSAhPT0gMCkgd2EgPSB0cnVlO1xuXG4gICAgcmV0dXJuIHdhO1xuICB9IGNhdGNoIChfXykge31cblxuICByZXR1cm4gd2E7XG59O1xuXG59LHt9XSwyMzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xudmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIHByb3BJc0VudW1lcmFibGUgPSBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXG5mdW5jdGlvbiB0b09iamVjdCh2YWwpIHtcblx0aWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ09iamVjdC5hc3NpZ24gY2Fubm90IGJlIGNhbGxlZCB3aXRoIG51bGwgb3IgdW5kZWZpbmVkJyk7XG5cdH1cblxuXHRyZXR1cm4gT2JqZWN0KHZhbCk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFVzZU5hdGl2ZSgpIHtcblx0dHJ5IHtcblx0XHRpZiAoIU9iamVjdC5hc3NpZ24pIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBEZXRlY3QgYnVnZ3kgcHJvcGVydHkgZW51bWVyYXRpb24gb3JkZXIgaW4gb2xkZXIgVjggdmVyc2lvbnMuXG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD00MTE4XG5cdFx0dmFyIHRlc3QxID0gbmV3IFN0cmluZygnYWJjJyk7ICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ldy13cmFwcGVyc1xuXHRcdHRlc3QxWzVdID0gJ2RlJztcblx0XHRpZiAoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGVzdDEpWzBdID09PSAnNScpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zMDU2XG5cdFx0dmFyIHRlc3QyID0ge307XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XG5cdFx0XHR0ZXN0MlsnXycgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpXSA9IGk7XG5cdFx0fVxuXHRcdHZhciBvcmRlcjIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0ZXN0MikubWFwKGZ1bmN0aW9uIChuKSB7XG5cdFx0XHRyZXR1cm4gdGVzdDJbbl07XG5cdFx0fSk7XG5cdFx0aWYgKG9yZGVyMi5qb2luKCcnKSAhPT0gJzAxMjM0NTY3ODknKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzA1NlxuXHRcdHZhciB0ZXN0MyA9IHt9O1xuXHRcdCdhYmNkZWZnaGlqa2xtbm9wcXJzdCcuc3BsaXQoJycpLmZvckVhY2goZnVuY3Rpb24gKGxldHRlcikge1xuXHRcdFx0dGVzdDNbbGV0dGVyXSA9IGxldHRlcjtcblx0XHR9KTtcblx0XHRpZiAoT2JqZWN0LmtleXMoT2JqZWN0LmFzc2lnbih7fSwgdGVzdDMpKS5qb2luKCcnKSAhPT1cblx0XHRcdFx0J2FiY2RlZmdoaWprbG1ub3BxcnN0Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9IGNhdGNoIChlcnIpIHtcblx0XHQvLyBXZSBkb24ndCBleHBlY3QgYW55IG9mIHRoZSBhYm92ZSB0byB0aHJvdywgYnV0IGJldHRlciB0byBiZSBzYWZlLlxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNob3VsZFVzZU5hdGl2ZSgpID8gT2JqZWN0LmFzc2lnbiA6IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSkge1xuXHR2YXIgZnJvbTtcblx0dmFyIHRvID0gdG9PYmplY3QodGFyZ2V0KTtcblx0dmFyIHN5bWJvbHM7XG5cblx0Zm9yICh2YXIgcyA9IDE7IHMgPCBhcmd1bWVudHMubGVuZ3RoOyBzKyspIHtcblx0XHRmcm9tID0gT2JqZWN0KGFyZ3VtZW50c1tzXSk7XG5cblx0XHRmb3IgKHZhciBrZXkgaW4gZnJvbSkge1xuXHRcdFx0aWYgKGhhc093blByb3BlcnR5LmNhbGwoZnJvbSwga2V5KSkge1xuXHRcdFx0XHR0b1trZXldID0gZnJvbVtrZXldO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcblx0XHRcdHN5bWJvbHMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZnJvbSk7XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHN5bWJvbHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0aWYgKHByb3BJc0VudW1lcmFibGUuY2FsbChmcm9tLCBzeW1ib2xzW2ldKSkge1xuXHRcdFx0XHRcdHRvW3N5bWJvbHNbaV1dID0gZnJvbVtzeW1ib2xzW2ldXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiB0bztcbn07XG5cbn0se31dLDI0OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbnZhciBidW5kbGVGbiA9IGFyZ3VtZW50c1szXTtcbnZhciBzb3VyY2VzID0gYXJndW1lbnRzWzRdO1xudmFyIGNhY2hlID0gYXJndW1lbnRzWzVdO1xuXG52YXIgc3RyaW5naWZ5ID0gSlNPTi5zdHJpbmdpZnk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGZuLCBvcHRpb25zKSB7XG4gICAgdmFyIHdrZXk7XG4gICAgdmFyIGNhY2hlS2V5cyA9IE9iamVjdC5rZXlzKGNhY2hlKTtcblxuICAgIGZvciAodmFyIGkgPSAwLCBsID0gY2FjaGVLZXlzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICB2YXIga2V5ID0gY2FjaGVLZXlzW2ldO1xuICAgICAgICB2YXIgZXhwID0gY2FjaGVba2V5XS5leHBvcnRzO1xuICAgICAgICAvLyBVc2luZyBiYWJlbCBhcyBhIHRyYW5zcGlsZXIgdG8gdXNlIGVzbW9kdWxlLCB0aGUgZXhwb3J0IHdpbGwgYWx3YXlzXG4gICAgICAgIC8vIGJlIGFuIG9iamVjdCB3aXRoIHRoZSBkZWZhdWx0IGV4cG9ydCBhcyBhIHByb3BlcnR5IG9mIGl0LiBUbyBlbnN1cmVcbiAgICAgICAgLy8gdGhlIGV4aXN0aW5nIGFwaSBhbmQgYmFiZWwgZXNtb2R1bGUgZXhwb3J0cyBhcmUgYm90aCBzdXBwb3J0ZWQgd2VcbiAgICAgICAgLy8gY2hlY2sgZm9yIGJvdGhcbiAgICAgICAgaWYgKGV4cCA9PT0gZm4gfHwgZXhwICYmIGV4cC5kZWZhdWx0ID09PSBmbikge1xuICAgICAgICAgICAgd2tleSA9IGtleTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF3a2V5KSB7XG4gICAgICAgIHdrZXkgPSBNYXRoLmZsb29yKE1hdGgucG93KDE2LCA4KSAqIE1hdGgucmFuZG9tKCkpLnRvU3RyaW5nKDE2KTtcbiAgICAgICAgdmFyIHdjYWNoZSA9IHt9O1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGNhY2hlS2V5cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBrZXkgPSBjYWNoZUtleXNbaV07XG4gICAgICAgICAgICB3Y2FjaGVba2V5XSA9IGtleTtcbiAgICAgICAgfVxuICAgICAgICBzb3VyY2VzW3drZXldID0gW1xuICAgICAgICAgICAgJ2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeycgKyBmbiArICcoc2VsZik7IH0nLFxuICAgICAgICAgICAgd2NhY2hlXG4gICAgICAgIF07XG4gICAgfVxuICAgIHZhciBza2V5ID0gTWF0aC5mbG9vcihNYXRoLnBvdygxNiwgOCkgKiBNYXRoLnJhbmRvbSgpKS50b1N0cmluZygxNik7XG5cbiAgICB2YXIgc2NhY2hlID0ge307IHNjYWNoZVt3a2V5XSA9IHdrZXk7XG4gICAgc291cmNlc1tza2V5XSA9IFtcbiAgICAgICAgJ2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeycgK1xuICAgICAgICAgICAgLy8gdHJ5IHRvIGNhbGwgZGVmYXVsdCBpZiBkZWZpbmVkIHRvIGFsc28gc3VwcG9ydCBiYWJlbCBlc21vZHVsZSBleHBvcnRzXG4gICAgICAgICAgICAndmFyIGYgPSByZXF1aXJlKCcgKyBzdHJpbmdpZnkod2tleSkgKyAnKTsnICtcbiAgICAgICAgICAgICcoZi5kZWZhdWx0ID8gZi5kZWZhdWx0IDogZikoc2VsZik7JyArXG4gICAgICAgICd9JyxcbiAgICAgICAgc2NhY2hlXG4gICAgXTtcblxuICAgIHZhciB3b3JrZXJTb3VyY2VzID0ge307XG4gICAgcmVzb2x2ZVNvdXJjZXMoc2tleSk7XG5cbiAgICBmdW5jdGlvbiByZXNvbHZlU291cmNlcyhrZXkpIHtcbiAgICAgICAgd29ya2VyU291cmNlc1trZXldID0gdHJ1ZTtcblxuICAgICAgICBmb3IgKHZhciBkZXBQYXRoIGluIHNvdXJjZXNba2V5XVsxXSkge1xuICAgICAgICAgICAgdmFyIGRlcEtleSA9IHNvdXJjZXNba2V5XVsxXVtkZXBQYXRoXTtcbiAgICAgICAgICAgIGlmICghd29ya2VyU291cmNlc1tkZXBLZXldKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZVNvdXJjZXMoZGVwS2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBzcmMgPSAnKCcgKyBidW5kbGVGbiArICcpKHsnXG4gICAgICAgICsgT2JqZWN0LmtleXMod29ya2VyU291cmNlcykubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmdpZnkoa2V5KSArICc6WydcbiAgICAgICAgICAgICAgICArIHNvdXJjZXNba2V5XVswXVxuICAgICAgICAgICAgICAgICsgJywnICsgc3RyaW5naWZ5KHNvdXJjZXNba2V5XVsxXSkgKyAnXSdcbiAgICAgICAgICAgIDtcbiAgICAgICAgfSkuam9pbignLCcpXG4gICAgICAgICsgJ30se30sWycgKyBzdHJpbmdpZnkoc2tleSkgKyAnXSknXG4gICAgO1xuXG4gICAgdmFyIFVSTCA9IHdpbmRvdy5VUkwgfHwgd2luZG93LndlYmtpdFVSTCB8fCB3aW5kb3cubW96VVJMIHx8IHdpbmRvdy5tc1VSTDtcblxuICAgIHZhciBibG9iID0gbmV3IEJsb2IoW3NyY10sIHsgdHlwZTogJ3RleHQvamF2YXNjcmlwdCcgfSk7XG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5iYXJlKSB7IHJldHVybiBibG9iOyB9XG4gICAgdmFyIHdvcmtlclVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgdmFyIHdvcmtlciA9IG5ldyBXb3JrZXIod29ya2VyVXJsKTtcbiAgICB3b3JrZXIub2JqZWN0VVJMID0gd29ya2VyVXJsO1xuICAgIHJldHVybiB3b3JrZXI7XG59O1xuXG59LHt9XSxcIi9pbmRleC5qc1wiOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblxuZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXkoYXJyLCBpKSB7IHJldHVybiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB8fCBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyLCBpKSB8fCBfbm9uSXRlcmFibGVSZXN0KCk7IH1cblxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHsgdmFyIF9pID0gYXJyID09IG51bGwgPyBudWxsIDogdHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBhcnJbU3ltYm9sLml0ZXJhdG9yXSB8fCBhcnJbXCJAQGl0ZXJhdG9yXCJdOyBpZiAoX2kgPT0gbnVsbCkgcmV0dXJuOyB2YXIgX2FyciA9IFtdOyB2YXIgX24gPSB0cnVlOyB2YXIgX2QgPSBmYWxzZTsgdmFyIF9zLCBfZTsgdHJ5IHsgZm9yIChfaSA9IF9pLmNhbGwoYXJyKTsgIShfbiA9IChfcyA9IF9pLm5leHQoKSkuZG9uZSk7IF9uID0gdHJ1ZSkgeyBfYXJyLnB1c2goX3MudmFsdWUpOyBpZiAoaSAmJiBfYXJyLmxlbmd0aCA9PT0gaSkgYnJlYWs7IH0gfSBjYXRjaCAoZXJyKSB7IF9kID0gdHJ1ZTsgX2UgPSBlcnI7IH0gZmluYWxseSB7IHRyeSB7IGlmICghX24gJiYgX2lbXCJyZXR1cm5cIl0gIT0gbnVsbCkgX2lbXCJyZXR1cm5cIl0oKTsgfSBmaW5hbGx5IHsgaWYgKF9kKSB0aHJvdyBfZTsgfSB9IHJldHVybiBfYXJyOyB9XG5cbmZ1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjsgfVxuXG52YXIgYXNzaWduID0gX2RlcmVxXygnb2JqZWN0LWFzc2lnbicpO1xuXG52YXIgd2Vid29ya2lmeSA9IF9kZXJlcV8oJ3dlYndvcmtpZnknKTtcblxudmFyIE1hdGhMaWIgPSBfZGVyZXFfKCcuL2xpYi9tYXRobGliJyk7XG5cbnZhciBQb29sID0gX2RlcmVxXygnLi9saWIvcG9vbCcpO1xuXG52YXIgdXRpbHMgPSBfZGVyZXFfKCcuL2xpYi91dGlscycpO1xuXG52YXIgd29ya2VyID0gX2RlcmVxXygnLi9saWIvd29ya2VyJyk7XG5cbnZhciBjcmVhdGVTdGFnZXMgPSBfZGVyZXFfKCcuL2xpYi9zdGVwcGVyJyk7XG5cbnZhciBjcmVhdGVSZWdpb25zID0gX2RlcmVxXygnLi9saWIvdGlsZXInKTsgLy8gRGVkdXBsaWNhdGUgcG9vbHMgJiBsaW1pdGVycyB3aXRoIHRoZSBzYW1lIGNvbmZpZ3Ncbi8vIHdoZW4gdXNlciBjcmVhdGVzIG11bHRpcGxlIHBpY2EgaW5zdGFuY2VzLlxuXG5cbnZhciBzaW5nbGV0b25lcyA9IHt9O1xudmFyIE5FRURfU0FGQVJJX0ZJWCA9IGZhbHNlO1xuXG50cnkge1xuICBpZiAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCkge1xuICAgIE5FRURfU0FGQVJJX0ZJWCA9IG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignU2FmYXJpJykgPj0gMDtcbiAgfVxufSBjYXRjaCAoZSkge31cblxudmFyIGNvbmN1cnJlbmN5ID0gMTtcblxuaWYgKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnKSB7XG4gIGNvbmN1cnJlbmN5ID0gTWF0aC5taW4obmF2aWdhdG9yLmhhcmR3YXJlQ29uY3VycmVuY3kgfHwgMSwgNCk7XG59XG5cbnZhciBERUZBVUxUX1BJQ0FfT1BUUyA9IHtcbiAgdGlsZTogMTAyNCxcbiAgY29uY3VycmVuY3k6IGNvbmN1cnJlbmN5LFxuICBmZWF0dXJlczogWydqcycsICd3YXNtJywgJ3d3J10sXG4gIGlkbGU6IDIwMDAsXG4gIGNyZWF0ZUNhbnZhczogZnVuY3Rpb24gY3JlYXRlQ2FudmFzKHdpZHRoLCBoZWlnaHQpIHtcbiAgICB2YXIgdG1wQ2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgdG1wQ2FudmFzLndpZHRoID0gd2lkdGg7XG4gICAgdG1wQ2FudmFzLmhlaWdodCA9IGhlaWdodDtcbiAgICByZXR1cm4gdG1wQ2FudmFzO1xuICB9XG59O1xudmFyIERFRkFVTFRfUkVTSVpFX09QVFMgPSB7XG4gIHF1YWxpdHk6IDMsXG4gIGFscGhhOiBmYWxzZSxcbiAgdW5zaGFycEFtb3VudDogMCxcbiAgdW5zaGFycFJhZGl1czogMC4wLFxuICB1bnNoYXJwVGhyZXNob2xkOiAwXG59O1xudmFyIENBTl9ORVdfSU1BR0VfREFUQSA9IGZhbHNlO1xudmFyIENBTl9DUkVBVEVfSU1BR0VfQklUTUFQID0gZmFsc2U7XG52YXIgQ0FOX1VTRV9DQU5WQVNfR0VUX0lNQUdFX0RBVEEgPSBmYWxzZTtcbnZhciBDQU5fVVNFX09GRlNDUkVFTl9DQU5WQVMgPSBmYWxzZTtcbnZhciBDQU5fVVNFX0NJQl9SRUdJT05fRk9SX0lNQUdFID0gZmFsc2U7XG5cbmZ1bmN0aW9uIHdvcmtlckZhYnJpYygpIHtcbiAgcmV0dXJuIHtcbiAgICB2YWx1ZTogd2Vid29ya2lmeSh3b3JrZXIpLFxuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICB0aGlzLnZhbHVlLnRlcm1pbmF0ZSgpO1xuXG4gICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdmFyIHVybCA9IHdpbmRvdy5VUkwgfHwgd2luZG93LndlYmtpdFVSTCB8fCB3aW5kb3cubW96VVJMIHx8IHdpbmRvdy5tc1VSTDtcblxuICAgICAgICBpZiAodXJsICYmIHVybC5yZXZva2VPYmplY3RVUkwgJiYgdGhpcy52YWx1ZS5vYmplY3RVUkwpIHtcbiAgICAgICAgICB1cmwucmV2b2tlT2JqZWN0VVJMKHRoaXMudmFsdWUub2JqZWN0VVJMKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcbn0gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIEFQSSBtZXRob2RzXG5cblxuZnVuY3Rpb24gUGljYShvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBQaWNhKSkgcmV0dXJuIG5ldyBQaWNhKG9wdGlvbnMpO1xuICB0aGlzLm9wdGlvbnMgPSBhc3NpZ24oe30sIERFRkFVTFRfUElDQV9PUFRTLCBvcHRpb25zIHx8IHt9KTtcbiAgdmFyIGxpbWl0ZXJfa2V5ID0gXCJsa19cIi5jb25jYXQodGhpcy5vcHRpb25zLmNvbmN1cnJlbmN5KTsgLy8gU2hhcmUgbGltaXRlcnMgdG8gYXZvaWQgbXVsdGlwbGUgcGFyYWxsZWwgd29ya2VycyB3aGVuIHVzZXIgY3JlYXRlc1xuICAvLyBtdWx0aXBsZSBwaWNhIGluc3RhbmNlcy5cblxuICB0aGlzLl9fbGltaXQgPSBzaW5nbGV0b25lc1tsaW1pdGVyX2tleV0gfHwgdXRpbHMubGltaXRlcih0aGlzLm9wdGlvbnMuY29uY3VycmVuY3kpO1xuICBpZiAoIXNpbmdsZXRvbmVzW2xpbWl0ZXJfa2V5XSkgc2luZ2xldG9uZXNbbGltaXRlcl9rZXldID0gdGhpcy5fX2xpbWl0OyAvLyBMaXN0IG9mIHN1cHBvcnRlZCBmZWF0dXJlcywgYWNjb3JkaW5nIHRvIG9wdGlvbnMgJiBicm93c2VyL25vZGUuanNcblxuICB0aGlzLmZlYXR1cmVzID0ge1xuICAgIGpzOiBmYWxzZSxcbiAgICAvLyBwdXJlIEpTIGltcGxlbWVudGF0aW9uLCBjYW4gYmUgZGlzYWJsZWQgZm9yIHRlc3RpbmdcbiAgICB3YXNtOiBmYWxzZSxcbiAgICAvLyB3ZWJhc3NlbWJseSBpbXBsZW1lbnRhdGlvbiBmb3IgaGVhdnkgZnVuY3Rpb25zXG4gICAgY2liOiBmYWxzZSxcbiAgICAvLyByZXNpemUgdmlhIGNyZWF0ZUltYWdlQml0bWFwIChvbmx5IEZGIGF0IHRoaXMgbW9tZW50KVxuICAgIHd3OiBmYWxzZSAvLyB3ZWJ3b3JrZXJzXG5cbiAgfTtcbiAgdGhpcy5fX3dvcmtlcnNQb29sID0gbnVsbDsgLy8gU3RvcmUgcmVxdWVzdGVkIGZlYXR1cmVzIGZvciB3ZWJ3b3JrZXJzXG5cbiAgdGhpcy5fX3JlcXVlc3RlZF9mZWF0dXJlcyA9IFtdO1xuICB0aGlzLl9fbWF0aGxpYiA9IG51bGw7XG59XG5cblBpY2EucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgaWYgKHRoaXMuX19pbml0UHJvbWlzZSkgcmV0dXJuIHRoaXMuX19pbml0UHJvbWlzZTsgLy8gVGVzdCBpZiB3ZSBjYW4gY3JlYXRlIEltYWdlRGF0YSB3aXRob3V0IGNhbnZhcyBhbmQgbWVtb3J5IGNvcHlcblxuICBpZiAodHlwZW9mIEltYWdlRGF0YSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIFVpbnQ4Q2xhbXBlZEFycmF5ICE9PSAndW5kZWZpbmVkJykge1xuICAgIHRyeSB7XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1uZXcgKi9cbiAgICAgIG5ldyBJbWFnZURhdGEobmV3IFVpbnQ4Q2xhbXBlZEFycmF5KDQwMCksIDEwLCAxMCk7XG4gICAgICBDQU5fTkVXX0lNQUdFX0RBVEEgPSB0cnVlO1xuICAgIH0gY2F0Y2ggKF9fKSB7fVxuICB9IC8vIEltYWdlQml0bWFwIGNhbiBiZSBlZmZlY3RpdmUgaW4gMiBwbGFjZXM6XG4gIC8vXG4gIC8vIDEuIFRocmVhZGVkIGpwZWcgdW5wYWNrIChiYXNpYylcbiAgLy8gMi4gQnVpbHQtaW4gcmVzaXplIChibG9ja2VkIGR1ZSBwcm9ibGVtIGluIGNocm9tZSwgc2VlIGlzc3VlICM4OSlcbiAgLy9cbiAgLy8gRm9yIGJhc2ljIHVzZSB3ZSBhbHNvIG5lZWQgSW1hZ2VCaXRtYXAgd28gc3VwcG9ydCAuY2xvc2UoKSBtZXRob2QsXG4gIC8vIHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9ydS9kb2NzL1dlYi9BUEkvSW1hZ2VCaXRtYXBcblxuXG4gIGlmICh0eXBlb2YgSW1hZ2VCaXRtYXAgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgaWYgKEltYWdlQml0bWFwLnByb3RvdHlwZSAmJiBJbWFnZUJpdG1hcC5wcm90b3R5cGUuY2xvc2UpIHtcbiAgICAgIENBTl9DUkVBVEVfSU1BR0VfQklUTUFQID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kZWJ1ZygnSW1hZ2VCaXRtYXAgZG9lcyBub3Qgc3VwcG9ydCAuY2xvc2UoKSwgZGlzYWJsZWQnKTtcbiAgICB9XG4gIH1cblxuICB2YXIgZmVhdHVyZXMgPSB0aGlzLm9wdGlvbnMuZmVhdHVyZXMuc2xpY2UoKTtcblxuICBpZiAoZmVhdHVyZXMuaW5kZXhPZignYWxsJykgPj0gMCkge1xuICAgIGZlYXR1cmVzID0gWydjaWInLCAnd2FzbScsICdqcycsICd3dyddO1xuICB9XG5cbiAgdGhpcy5fX3JlcXVlc3RlZF9mZWF0dXJlcyA9IGZlYXR1cmVzO1xuICB0aGlzLl9fbWF0aGxpYiA9IG5ldyBNYXRoTGliKGZlYXR1cmVzKTsgLy8gQ2hlY2sgV2ViV29ya2VyIHN1cHBvcnQgaWYgcmVxdWVzdGVkXG5cbiAgaWYgKGZlYXR1cmVzLmluZGV4T2YoJ3d3JykgPj0gMCkge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiAnV29ya2VyJyBpbiB3aW5kb3cpIHtcbiAgICAgIC8vIElFIDw9IDExIGRvbid0IGFsbG93IHRvIGNyZWF0ZSB3ZWJ3b3JrZXJzIGZyb20gc3RyaW5nLiBXZSBzaG91bGQgY2hlY2sgaXQuXG4gICAgICAvLyBodHRwczovL2Nvbm5lY3QubWljcm9zb2Z0LmNvbS9JRS9mZWVkYmFjay9kZXRhaWxzLzgwMTgxMC93ZWItd29ya2Vycy1mcm9tLWJsb2ItdXJscy1pbi1pZS0xMC1hbmQtMTFcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciB3a3IgPSBfZGVyZXFfKCd3ZWJ3b3JraWZ5JykoZnVuY3Rpb24gKCkge30pO1xuXG4gICAgICAgIHdrci50ZXJtaW5hdGUoKTtcbiAgICAgICAgdGhpcy5mZWF0dXJlcy53dyA9IHRydWU7IC8vIHBvb2wgdW5pcXVlbmVzcyBkZXBlbmRzIG9uIHBvb2wgY29uZmlnICsgd2Vid29ya2VyIGNvbmZpZ1xuXG4gICAgICAgIHZhciB3cG9vbF9rZXkgPSBcIndwX1wiLmNvbmNhdChKU09OLnN0cmluZ2lmeSh0aGlzLm9wdGlvbnMpKTtcblxuICAgICAgICBpZiAoc2luZ2xldG9uZXNbd3Bvb2xfa2V5XSkge1xuICAgICAgICAgIHRoaXMuX193b3JrZXJzUG9vbCA9IHNpbmdsZXRvbmVzW3dwb29sX2tleV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fX3dvcmtlcnNQb29sID0gbmV3IFBvb2wod29ya2VyRmFicmljLCB0aGlzLm9wdGlvbnMuaWRsZSk7XG4gICAgICAgICAgc2luZ2xldG9uZXNbd3Bvb2xfa2V5XSA9IHRoaXMuX193b3JrZXJzUG9vbDtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoX18pIHt9XG4gICAgfVxuICB9XG5cbiAgdmFyIGluaXRNYXRoID0gdGhpcy5fX21hdGhsaWIuaW5pdCgpLnRoZW4oZnVuY3Rpb24gKG1hdGhsaWIpIHtcbiAgICAvLyBDb3B5IGRldGVjdGVkIGZlYXR1cmVzXG4gICAgYXNzaWduKF90aGlzLmZlYXR1cmVzLCBtYXRobGliLmZlYXR1cmVzKTtcbiAgfSk7XG5cbiAgdmFyIGNoZWNrQ2liUmVzaXplO1xuXG4gIGlmICghQ0FOX0NSRUFURV9JTUFHRV9CSVRNQVApIHtcbiAgICBjaGVja0NpYlJlc2l6ZSA9IFByb21pc2UucmVzb2x2ZShmYWxzZSk7XG4gIH0gZWxzZSB7XG4gICAgY2hlY2tDaWJSZXNpemUgPSB1dGlscy5jaWJfc3VwcG9ydCh0aGlzLm9wdGlvbnMuY3JlYXRlQ2FudmFzKS50aGVuKGZ1bmN0aW9uIChzdGF0dXMpIHtcbiAgICAgIGlmIChfdGhpcy5mZWF0dXJlcy5jaWIgJiYgZmVhdHVyZXMuaW5kZXhPZignY2liJykgPCAwKSB7XG4gICAgICAgIF90aGlzLmRlYnVnKCdjcmVhdGVJbWFnZUJpdG1hcCgpIHJlc2l6ZSBzdXBwb3J0ZWQsIGJ1dCBkaXNhYmxlZCBieSBjb25maWcnKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChmZWF0dXJlcy5pbmRleE9mKCdjaWInKSA+PSAwKSBfdGhpcy5mZWF0dXJlcy5jaWIgPSBzdGF0dXM7XG4gICAgfSk7XG4gIH1cblxuICBDQU5fVVNFX0NBTlZBU19HRVRfSU1BR0VfREFUQSA9IHV0aWxzLmNhbl91c2VfY2FudmFzKHRoaXMub3B0aW9ucy5jcmVhdGVDYW52YXMpO1xuICB2YXIgY2hlY2tPZmZzY3JlZW5DYW52YXM7XG5cbiAgaWYgKENBTl9DUkVBVEVfSU1BR0VfQklUTUFQICYmIENBTl9ORVdfSU1BR0VfREFUQSAmJiBmZWF0dXJlcy5pbmRleE9mKCd3dycpICE9PSAtMSkge1xuICAgIGNoZWNrT2Zmc2NyZWVuQ2FudmFzID0gdXRpbHMud29ya2VyX29mZnNjcmVlbl9jYW52YXNfc3VwcG9ydCgpO1xuICB9IGVsc2Uge1xuICAgIGNoZWNrT2Zmc2NyZWVuQ2FudmFzID0gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcbiAgfVxuXG4gIGNoZWNrT2Zmc2NyZWVuQ2FudmFzID0gY2hlY2tPZmZzY3JlZW5DYW52YXMudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgQ0FOX1VTRV9PRkZTQ1JFRU5fQ0FOVkFTID0gcmVzdWx0O1xuICB9KTsgLy8gd2UgdXNlIGNyZWF0ZUltYWdlQml0bWFwIHRvIGNyb3AgaW1hZ2UgZGF0YSBhbmQgcGFzcyBpdCB0byB3b3JrZXJzLFxuICAvLyBzbyBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgZnVuY3Rpb24gd29ya3MgY29ycmVjdGx5O1xuICAvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0xMjIwNjcxXG5cbiAgdmFyIGNoZWNrQ2liUmVnaW9uID0gdXRpbHMuY2liX2Nhbl91c2VfcmVnaW9uKCkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgQ0FOX1VTRV9DSUJfUkVHSU9OX0ZPUl9JTUFHRSA9IHJlc3VsdDtcbiAgfSk7IC8vIEluaXQgbWF0aCBsaWIuIFRoYXQncyBhc3luYyBiZWNhdXNlIGNhbiBsb2FkIHNvbWVcblxuICB0aGlzLl9faW5pdFByb21pc2UgPSBQcm9taXNlLmFsbChbaW5pdE1hdGgsIGNoZWNrQ2liUmVzaXplLCBjaGVja09mZnNjcmVlbkNhbnZhcywgY2hlY2tDaWJSZWdpb25dKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH0pO1xuICByZXR1cm4gdGhpcy5fX2luaXRQcm9taXNlO1xufTsgLy8gQ2FsbCByZXNpemVyIGluIHdlYndvcmtlciBvciBsb2NhbGx5LCBkZXBlbmRpbmcgb24gY29uZmlnXG5cblxuUGljYS5wcm90b3R5cGUuX19pbnZva2VSZXNpemUgPSBmdW5jdGlvbiAodGlsZU9wdHMsIG9wdHMpIHtcbiAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgLy8gU2hhcmUgY2FjaGUgYmV0d2VlbiBjYWxsczpcbiAgLy9cbiAgLy8gLSB3YXNtIGluc3RhbmNlXG4gIC8vIC0gd2FzbSBtZW1vcnkgb2JqZWN0XG4gIC8vXG4gIG9wdHMuX19tYXRoQ2FjaGUgPSBvcHRzLl9fbWF0aENhY2hlIHx8IHt9O1xuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFfdGhpczIuZmVhdHVyZXMud3cpIHtcbiAgICAgIC8vIG5vdCBwb3NzaWJsZSB0byBoYXZlIEltYWdlQml0bWFwIGhlcmUgaWYgdXNlciBkaXNhYmxlZCBXV1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YTogX3RoaXMyLl9fbWF0aGxpYi5yZXNpemVBbmRVbnNoYXJwKHRpbGVPcHRzLCBvcHRzLl9fbWF0aENhY2hlKVxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIHcgPSBfdGhpczIuX193b3JrZXJzUG9vbC5hY3F1aXJlKCk7XG5cbiAgICAgIGlmIChvcHRzLmNhbmNlbFRva2VuKSBvcHRzLmNhbmNlbFRva2VuW1wiY2F0Y2hcIl0oZnVuY3Rpb24gKGVycikge1xuICAgICAgICByZXR1cm4gcmVqZWN0KGVycik7XG4gICAgICB9KTtcblxuICAgICAgdy52YWx1ZS5vbm1lc3NhZ2UgPSBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgdy5yZWxlYXNlKCk7XG4gICAgICAgIGlmIChldi5kYXRhLmVycikgcmVqZWN0KGV2LmRhdGEuZXJyKTtlbHNlIHJlc29sdmUoZXYuZGF0YSk7XG4gICAgICB9O1xuXG4gICAgICB2YXIgdHJhbnNmZXIgPSBbXTtcbiAgICAgIGlmICh0aWxlT3B0cy5zcmMpIHRyYW5zZmVyLnB1c2godGlsZU9wdHMuc3JjLmJ1ZmZlcik7XG4gICAgICBpZiAodGlsZU9wdHMuc3JjQml0bWFwKSB0cmFuc2Zlci5wdXNoKHRpbGVPcHRzLnNyY0JpdG1hcCk7XG4gICAgICB3LnZhbHVlLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgb3B0czogdGlsZU9wdHMsXG4gICAgICAgIGZlYXR1cmVzOiBfdGhpczIuX19yZXF1ZXN0ZWRfZmVhdHVyZXMsXG4gICAgICAgIHByZWxvYWQ6IHtcbiAgICAgICAgICB3YXNtX25vZHVsZTogX3RoaXMyLl9fbWF0aGxpYi5fX1xuICAgICAgICB9XG4gICAgICB9LCB0cmFuc2Zlcik7XG4gICAgfSk7XG4gIH0pO1xufTsgLy8gdGhpcyBmdW5jdGlvbiBjYW4gcmV0dXJuIHByb21pc2UgaWYgY3JlYXRlSW1hZ2VCaXRtYXAgaXMgdXNlZFxuXG5cblBpY2EucHJvdG90eXBlLl9fZXh0cmFjdFRpbGVEYXRhID0gZnVuY3Rpb24gKHRpbGUsIGZyb20sIG9wdHMsIHN0YWdlRW52LCBleHRyYWN0VG8pIHtcbiAgaWYgKHRoaXMuZmVhdHVyZXMud3cgJiYgQ0FOX1VTRV9PRkZTQ1JFRU5fQ0FOVkFTICYmICggLy8gY3JlYXRlSW1hZ2VCaXRtYXAgZG9lc24ndCB3b3JrIGZvciBpbWFnZXMgKEltYWdlLCBJbWFnZUJpdG1hcCkgd2l0aCBFeGlmIG9yaWVudGF0aW9uIGluIENocm9tZSxcbiAgLy8gY2FuIHVzZSBjYW52YXMgYmVjYXVzZSBjYW52YXMgZG9lc24ndCBoYXZlIG9yaWVudGF0aW9uO1xuICAvLyBzZWUgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9MTIyMDY3MVxuICB1dGlscy5pc0NhbnZhcyhmcm9tKSB8fCBDQU5fVVNFX0NJQl9SRUdJT05fRk9SX0lNQUdFKSkge1xuICAgIHRoaXMuZGVidWcoJ0NyZWF0ZSB0aWxlIGZvciBPZmZzY3JlZW5DYW52YXMnKTtcbiAgICByZXR1cm4gY3JlYXRlSW1hZ2VCaXRtYXAoc3RhZ2VFbnYuc3JjSW1hZ2VCaXRtYXAgfHwgZnJvbSwgdGlsZS54LCB0aWxlLnksIHRpbGUud2lkdGgsIHRpbGUuaGVpZ2h0KS50aGVuKGZ1bmN0aW9uIChiaXRtYXApIHtcbiAgICAgIGV4dHJhY3RUby5zcmNCaXRtYXAgPSBiaXRtYXA7XG4gICAgICByZXR1cm4gZXh0cmFjdFRvO1xuICAgIH0pO1xuICB9IC8vIEV4dHJhY3QgdGlsZSBSR0JBIGJ1ZmZlciwgZGVwZW5kaW5nIG9uIGlucHV0IHR5cGVcblxuXG4gIGlmICh1dGlscy5pc0NhbnZhcyhmcm9tKSkge1xuICAgIGlmICghc3RhZ2VFbnYuc3JjQ3R4KSBzdGFnZUVudi5zcmNDdHggPSBmcm9tLmdldENvbnRleHQoJzJkJywge1xuICAgICAgYWxwaGE6IEJvb2xlYW4ob3B0cy5hbHBoYSlcbiAgICB9KTsgLy8gSWYgaW5wdXQgaXMgQ2FudmFzIC0gZXh0cmFjdCByZWdpb24gZGF0YSBkaXJlY3RseVxuXG4gICAgdGhpcy5kZWJ1ZygnR2V0IHRpbGUgcGl4ZWwgZGF0YScpO1xuICAgIGV4dHJhY3RUby5zcmMgPSBzdGFnZUVudi5zcmNDdHguZ2V0SW1hZ2VEYXRhKHRpbGUueCwgdGlsZS55LCB0aWxlLndpZHRoLCB0aWxlLmhlaWdodCkuZGF0YTtcbiAgICByZXR1cm4gZXh0cmFjdFRvO1xuICB9IC8vIElmIGlucHV0IGlzIEltYWdlIG9yIGRlY29kZWQgdG8gSW1hZ2VCaXRtYXAsXG4gIC8vIGRyYXcgcmVnaW9uIHRvIHRlbXBvcmFyeSBjYW52YXMgYW5kIGV4dHJhY3QgZGF0YSBmcm9tIGl0XG4gIC8vXG4gIC8vIE5vdGUhIEF0dGVtcHQgdG8gcmV1c2UgdGhpcyBjYW52YXMgY2F1c2VzIHNpZ25pZmljYW50IHNsb3dkb3duIGluIGNocm9tZVxuICAvL1xuXG5cbiAgdGhpcy5kZWJ1ZygnRHJhdyB0aWxlIGltYWdlQml0bWFwL2ltYWdlIHRvIHRlbXBvcmFyeSBjYW52YXMnKTtcbiAgdmFyIHRtcENhbnZhcyA9IHRoaXMub3B0aW9ucy5jcmVhdGVDYW52YXModGlsZS53aWR0aCwgdGlsZS5oZWlnaHQpO1xuICB2YXIgdG1wQ3R4ID0gdG1wQ2FudmFzLmdldENvbnRleHQoJzJkJywge1xuICAgIGFscGhhOiBCb29sZWFuKG9wdHMuYWxwaGEpXG4gIH0pO1xuICB0bXBDdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gJ2NvcHknO1xuICB0bXBDdHguZHJhd0ltYWdlKHN0YWdlRW52LnNyY0ltYWdlQml0bWFwIHx8IGZyb20sIHRpbGUueCwgdGlsZS55LCB0aWxlLndpZHRoLCB0aWxlLmhlaWdodCwgMCwgMCwgdGlsZS53aWR0aCwgdGlsZS5oZWlnaHQpO1xuICB0aGlzLmRlYnVnKCdHZXQgdGlsZSBwaXhlbCBkYXRhJyk7XG4gIGV4dHJhY3RUby5zcmMgPSB0bXBDdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIHRpbGUud2lkdGgsIHRpbGUuaGVpZ2h0KS5kYXRhOyAvLyBTYWZhcmkgMTIgd29ya2Fyb3VuZFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWNhL3BpY2EvaXNzdWVzLzE5OVxuXG4gIHRtcENhbnZhcy53aWR0aCA9IHRtcENhbnZhcy5oZWlnaHQgPSAwO1xuICByZXR1cm4gZXh0cmFjdFRvO1xufTtcblxuUGljYS5wcm90b3R5cGUuX19sYW5kVGlsZURhdGEgPSBmdW5jdGlvbiAodGlsZSwgcmVzdWx0LCBzdGFnZUVudikge1xuICB2YXIgdG9JbWFnZURhdGE7XG4gIHRoaXMuZGVidWcoJ0NvbnZlcnQgcmF3IHJnYmEgdGlsZSByZXN1bHQgdG8gSW1hZ2VEYXRhJyk7XG5cbiAgaWYgKHJlc3VsdC5iaXRtYXApIHtcbiAgICBzdGFnZUVudi50b0N0eC5kcmF3SW1hZ2UocmVzdWx0LmJpdG1hcCwgdGlsZS50b1gsIHRpbGUudG9ZKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChDQU5fTkVXX0lNQUdFX0RBVEEpIHtcbiAgICAvLyB0aGlzIGJyYW5jaCBpcyBmb3IgbW9kZXJuIGJyb3dzZXJzXG4gICAgLy8gSWYgYG5ldyBJbWFnZURhdGEoKWAgJiBVaW50OENsYW1wZWRBcnJheSBzdXBvcnRlZFxuICAgIHRvSW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShuZXcgVWludDhDbGFtcGVkQXJyYXkocmVzdWx0LmRhdGEpLCB0aWxlLnRvV2lkdGgsIHRpbGUudG9IZWlnaHQpO1xuICB9IGVsc2Uge1xuICAgIC8vIGZhbGxiYWNrIGZvciBgbm9kZS1jYW52YXNgIGFuZCBvbGQgYnJvd3NlcnNcbiAgICAvLyAoSUUxMSBoYXMgSW1hZ2VEYXRhIGJ1dCBkb2VzIG5vdCBzdXBwb3J0IGBuZXcgSW1hZ2VEYXRhKClgKVxuICAgIHRvSW1hZ2VEYXRhID0gc3RhZ2VFbnYudG9DdHguY3JlYXRlSW1hZ2VEYXRhKHRpbGUudG9XaWR0aCwgdGlsZS50b0hlaWdodCk7XG5cbiAgICBpZiAodG9JbWFnZURhdGEuZGF0YS5zZXQpIHtcbiAgICAgIHRvSW1hZ2VEYXRhLmRhdGEuc2V0KHJlc3VsdC5kYXRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSUU5IGRvbid0IGhhdmUgYC5zZXQoKWBcbiAgICAgIGZvciAodmFyIGkgPSB0b0ltYWdlRGF0YS5kYXRhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIHRvSW1hZ2VEYXRhLmRhdGFbaV0gPSByZXN1bHQuZGF0YVtpXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB0aGlzLmRlYnVnKCdEcmF3IHRpbGUnKTtcblxuICBpZiAoTkVFRF9TQUZBUklfRklYKSB7XG4gICAgLy8gU2FmYXJpIGRyYXdzIHRoaW4gd2hpdGUgc3RyaXBlcyBiZXR3ZWVuIHRpbGVzIHdpdGhvdXQgdGhpcyBmaXhcbiAgICBzdGFnZUVudi50b0N0eC5wdXRJbWFnZURhdGEodG9JbWFnZURhdGEsIHRpbGUudG9YLCB0aWxlLnRvWSwgdGlsZS50b0lubmVyWCAtIHRpbGUudG9YLCB0aWxlLnRvSW5uZXJZIC0gdGlsZS50b1ksIHRpbGUudG9Jbm5lcldpZHRoICsgMWUtNSwgdGlsZS50b0lubmVySGVpZ2h0ICsgMWUtNSk7XG4gIH0gZWxzZSB7XG4gICAgc3RhZ2VFbnYudG9DdHgucHV0SW1hZ2VEYXRhKHRvSW1hZ2VEYXRhLCB0aWxlLnRvWCwgdGlsZS50b1ksIHRpbGUudG9Jbm5lclggLSB0aWxlLnRvWCwgdGlsZS50b0lubmVyWSAtIHRpbGUudG9ZLCB0aWxlLnRvSW5uZXJXaWR0aCwgdGlsZS50b0lubmVySGVpZ2h0KTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufTtcblxuUGljYS5wcm90b3R5cGUuX190aWxlQW5kUmVzaXplID0gZnVuY3Rpb24gKGZyb20sIHRvLCBvcHRzKSB7XG4gIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gIHZhciBzdGFnZUVudiA9IHtcbiAgICBzcmNDdHg6IG51bGwsXG4gICAgc3JjSW1hZ2VCaXRtYXA6IG51bGwsXG4gICAgaXNJbWFnZUJpdG1hcFJldXNlZDogZmFsc2UsXG4gICAgdG9DdHg6IG51bGxcbiAgfTtcblxuICB2YXIgcHJvY2Vzc1RpbGUgPSBmdW5jdGlvbiBwcm9jZXNzVGlsZSh0aWxlKSB7XG4gICAgcmV0dXJuIF90aGlzMy5fX2xpbWl0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChvcHRzLmNhbmNlbGVkKSByZXR1cm4gb3B0cy5jYW5jZWxUb2tlbjtcbiAgICAgIHZhciB0aWxlT3B0cyA9IHtcbiAgICAgICAgd2lkdGg6IHRpbGUud2lkdGgsXG4gICAgICAgIGhlaWdodDogdGlsZS5oZWlnaHQsXG4gICAgICAgIHRvV2lkdGg6IHRpbGUudG9XaWR0aCxcbiAgICAgICAgdG9IZWlnaHQ6IHRpbGUudG9IZWlnaHQsXG4gICAgICAgIHNjYWxlWDogdGlsZS5zY2FsZVgsXG4gICAgICAgIHNjYWxlWTogdGlsZS5zY2FsZVksXG4gICAgICAgIG9mZnNldFg6IHRpbGUub2Zmc2V0WCxcbiAgICAgICAgb2Zmc2V0WTogdGlsZS5vZmZzZXRZLFxuICAgICAgICBxdWFsaXR5OiBvcHRzLnF1YWxpdHksXG4gICAgICAgIGFscGhhOiBvcHRzLmFscGhhLFxuICAgICAgICB1bnNoYXJwQW1vdW50OiBvcHRzLnVuc2hhcnBBbW91bnQsXG4gICAgICAgIHVuc2hhcnBSYWRpdXM6IG9wdHMudW5zaGFycFJhZGl1cyxcbiAgICAgICAgdW5zaGFycFRocmVzaG9sZDogb3B0cy51bnNoYXJwVGhyZXNob2xkXG4gICAgICB9O1xuXG4gICAgICBfdGhpczMuZGVidWcoJ0ludm9rZSByZXNpemUgbWF0aCcpO1xuXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRpbGVPcHRzKS50aGVuKGZ1bmN0aW9uICh0aWxlT3B0cykge1xuICAgICAgICByZXR1cm4gX3RoaXMzLl9fZXh0cmFjdFRpbGVEYXRhKHRpbGUsIGZyb20sIG9wdHMsIHN0YWdlRW52LCB0aWxlT3B0cyk7XG4gICAgICB9KS50aGVuKGZ1bmN0aW9uICh0aWxlT3B0cykge1xuICAgICAgICBfdGhpczMuZGVidWcoJ0ludm9rZSByZXNpemUgbWF0aCcpO1xuXG4gICAgICAgIHJldHVybiBfdGhpczMuX19pbnZva2VSZXNpemUodGlsZU9wdHMsIG9wdHMpO1xuICAgICAgfSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgIGlmIChvcHRzLmNhbmNlbGVkKSByZXR1cm4gb3B0cy5jYW5jZWxUb2tlbjtcbiAgICAgICAgc3RhZ2VFbnYuc3JjSW1hZ2VEYXRhID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIF90aGlzMy5fX2xhbmRUaWxlRGF0YSh0aWxlLCByZXN1bHQsIHN0YWdlRW52KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9OyAvLyBOZWVkIHRvIG5vcm1hbGl6ZSBkYXRhIHNvdXJjZSBmaXJzdC4gSXQgY2FuIGJlIGNhbnZhcyBvciBpbWFnZS5cbiAgLy8gSWYgaW1hZ2UgLSB0cnkgdG8gZGVjb2RlIGluIGJhY2tncm91bmQgaWYgcG9zc2libGVcblxuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICBzdGFnZUVudi50b0N0eCA9IHRvLmdldENvbnRleHQoJzJkJywge1xuICAgICAgYWxwaGE6IEJvb2xlYW4ob3B0cy5hbHBoYSlcbiAgICB9KTtcbiAgICBpZiAodXRpbHMuaXNDYW52YXMoZnJvbSkpIHJldHVybiBudWxsO1xuXG4gICAgaWYgKHV0aWxzLmlzSW1hZ2VCaXRtYXAoZnJvbSkpIHtcbiAgICAgIHN0YWdlRW52LnNyY0ltYWdlQml0bWFwID0gZnJvbTtcbiAgICAgIHN0YWdlRW52LmlzSW1hZ2VCaXRtYXBSZXVzZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHV0aWxzLmlzSW1hZ2UoZnJvbSkpIHtcbiAgICAgIC8vIHRyeSBkbyBkZWNvZGUgaW1hZ2UgaW4gYmFja2dyb3VuZCBmb3IgZmFzdGVyIG5leHQgb3BlcmF0aW9ucztcbiAgICAgIC8vIGlmIHdlJ3JlIHVzaW5nIG9mZnNjcmVlbiBjYW52YXMsIGNpYiBpcyBjYWxsZWQgcGVyIHRpbGUsIHNvIG5vdCBuZWVkZWQgaGVyZVxuICAgICAgaWYgKCFDQU5fQ1JFQVRFX0lNQUdFX0JJVE1BUCkgcmV0dXJuIG51bGw7XG5cbiAgICAgIF90aGlzMy5kZWJ1ZygnRGVjb2RlIGltYWdlIHZpYSBjcmVhdGVJbWFnZUJpdG1hcCcpO1xuXG4gICAgICByZXR1cm4gY3JlYXRlSW1hZ2VCaXRtYXAoZnJvbSkudGhlbihmdW5jdGlvbiAoaW1hZ2VCaXRtYXApIHtcbiAgICAgICAgc3RhZ2VFbnYuc3JjSW1hZ2VCaXRtYXAgPSBpbWFnZUJpdG1hcDtcbiAgICAgIH0pIC8vIFN1cHByZXNzIGVycm9yIHRvIHVzZSBmYWxsYmFjaywgaWYgbWV0aG9kIGZhaWxzXG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWNhL3BpY2EvaXNzdWVzLzE5MFxuXG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xuICAgICAgW1wiY2F0Y2hcIl0oZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1BpY2E6IFwiLmZyb21cIiBzaG91bGQgYmUgSW1hZ2UsIENhbnZhcyBvciBJbWFnZUJpdG1hcCcpO1xuICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAob3B0cy5jYW5jZWxlZCkgcmV0dXJuIG9wdHMuY2FuY2VsVG9rZW47XG5cbiAgICBfdGhpczMuZGVidWcoJ0NhbGN1bGF0ZSB0aWxlcycpOyAvL1xuICAgIC8vIEhlcmUgd2UgYXJlIHdpdGggXCJub3JtYWxpemVkXCIgc291cmNlLFxuICAgIC8vIGZvbGxvdyB0byB0aWxpbmdcbiAgICAvL1xuXG5cbiAgICB2YXIgcmVnaW9ucyA9IGNyZWF0ZVJlZ2lvbnMoe1xuICAgICAgd2lkdGg6IG9wdHMud2lkdGgsXG4gICAgICBoZWlnaHQ6IG9wdHMuaGVpZ2h0LFxuICAgICAgc3JjVGlsZVNpemU6IF90aGlzMy5vcHRpb25zLnRpbGUsXG4gICAgICB0b1dpZHRoOiBvcHRzLnRvV2lkdGgsXG4gICAgICB0b0hlaWdodDogb3B0cy50b0hlaWdodCxcbiAgICAgIGRlc3RUaWxlQm9yZGVyOiBvcHRzLl9fZGVzdFRpbGVCb3JkZXJcbiAgICB9KTtcbiAgICB2YXIgam9icyA9IHJlZ2lvbnMubWFwKGZ1bmN0aW9uICh0aWxlKSB7XG4gICAgICByZXR1cm4gcHJvY2Vzc1RpbGUodGlsZSk7XG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBjbGVhbnVwKHN0YWdlRW52KSB7XG4gICAgICBpZiAoc3RhZ2VFbnYuc3JjSW1hZ2VCaXRtYXApIHtcbiAgICAgICAgaWYgKCFzdGFnZUVudi5pc0ltYWdlQml0bWFwUmV1c2VkKSBzdGFnZUVudi5zcmNJbWFnZUJpdG1hcC5jbG9zZSgpO1xuICAgICAgICBzdGFnZUVudi5zcmNJbWFnZUJpdG1hcCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgX3RoaXMzLmRlYnVnKCdQcm9jZXNzIHRpbGVzJyk7XG5cbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoam9icykudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpczMuZGVidWcoJ0ZpbmlzaGVkIScpO1xuXG4gICAgICBjbGVhbnVwKHN0YWdlRW52KTtcbiAgICAgIHJldHVybiB0bztcbiAgICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBjbGVhbnVwKHN0YWdlRW52KTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9KTtcbiAgfSk7XG59O1xuXG5QaWNhLnByb3RvdHlwZS5fX3Byb2Nlc3NTdGFnZXMgPSBmdW5jdGlvbiAoc3RhZ2VzLCBmcm9tLCB0bywgb3B0cykge1xuICB2YXIgX3RoaXM0ID0gdGhpcztcblxuICBpZiAob3B0cy5jYW5jZWxlZCkgcmV0dXJuIG9wdHMuY2FuY2VsVG9rZW47XG5cbiAgdmFyIF9zdGFnZXMkc2hpZnQgPSBzdGFnZXMuc2hpZnQoKSxcbiAgICAgIF9zdGFnZXMkc2hpZnQyID0gX3NsaWNlZFRvQXJyYXkoX3N0YWdlcyRzaGlmdCwgMiksXG4gICAgICB0b1dpZHRoID0gX3N0YWdlcyRzaGlmdDJbMF0sXG4gICAgICB0b0hlaWdodCA9IF9zdGFnZXMkc2hpZnQyWzFdO1xuXG4gIHZhciBpc0xhc3RTdGFnZSA9IHN0YWdlcy5sZW5ndGggPT09IDA7XG4gIG9wdHMgPSBhc3NpZ24oe30sIG9wdHMsIHtcbiAgICB0b1dpZHRoOiB0b1dpZHRoLFxuICAgIHRvSGVpZ2h0OiB0b0hlaWdodCxcbiAgICAvLyBvbmx5IHVzZSB1c2VyLWRlZmluZWQgcXVhbGl0eSBmb3IgdGhlIGxhc3Qgc3RhZ2UsXG4gICAgLy8gdXNlIHNpbXBsZXIgKEhhbW1pbmcpIGZpbHRlciBmb3IgdGhlIGZpcnN0IHN0YWdlcyB3aGVyZVxuICAgIC8vIHNjYWxlIGZhY3RvciBpcyBsYXJnZSBlbm91Z2ggKG1vcmUgdGhhbiAyLTMpXG4gICAgcXVhbGl0eTogaXNMYXN0U3RhZ2UgPyBvcHRzLnF1YWxpdHkgOiBNYXRoLm1pbigxLCBvcHRzLnF1YWxpdHkpXG4gIH0pO1xuICB2YXIgdG1wQ2FudmFzO1xuXG4gIGlmICghaXNMYXN0U3RhZ2UpIHtcbiAgICAvLyBjcmVhdGUgdGVtcG9yYXJ5IGNhbnZhc1xuICAgIHRtcENhbnZhcyA9IHRoaXMub3B0aW9ucy5jcmVhdGVDYW52YXModG9XaWR0aCwgdG9IZWlnaHQpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuX190aWxlQW5kUmVzaXplKGZyb20sIGlzTGFzdFN0YWdlID8gdG8gOiB0bXBDYW52YXMsIG9wdHMpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgIGlmIChpc0xhc3RTdGFnZSkgcmV0dXJuIHRvO1xuICAgIG9wdHMud2lkdGggPSB0b1dpZHRoO1xuICAgIG9wdHMuaGVpZ2h0ID0gdG9IZWlnaHQ7XG4gICAgcmV0dXJuIF90aGlzNC5fX3Byb2Nlc3NTdGFnZXMoc3RhZ2VzLCB0bXBDYW52YXMsIHRvLCBvcHRzKTtcbiAgfSkudGhlbihmdW5jdGlvbiAocmVzKSB7XG4gICAgaWYgKHRtcENhbnZhcykge1xuICAgICAgLy8gU2FmYXJpIDEyIHdvcmthcm91bmRcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlY2EvcGljYS9pc3N1ZXMvMTk5XG4gICAgICB0bXBDYW52YXMud2lkdGggPSB0bXBDYW52YXMuaGVpZ2h0ID0gMDtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xuICB9KTtcbn07XG5cblBpY2EucHJvdG90eXBlLl9fcmVzaXplVmlhQ3JlYXRlSW1hZ2VCaXRtYXAgPSBmdW5jdGlvbiAoZnJvbSwgdG8sIG9wdHMpIHtcbiAgdmFyIF90aGlzNSA9IHRoaXM7XG5cbiAgdmFyIHRvQ3R4ID0gdG8uZ2V0Q29udGV4dCgnMmQnLCB7XG4gICAgYWxwaGE6IEJvb2xlYW4ob3B0cy5hbHBoYSlcbiAgfSk7XG4gIHRoaXMuZGVidWcoJ1Jlc2l6ZSB2aWEgY3JlYXRlSW1hZ2VCaXRtYXAoKScpO1xuICByZXR1cm4gY3JlYXRlSW1hZ2VCaXRtYXAoZnJvbSwge1xuICAgIHJlc2l6ZVdpZHRoOiBvcHRzLnRvV2lkdGgsXG4gICAgcmVzaXplSGVpZ2h0OiBvcHRzLnRvSGVpZ2h0LFxuICAgIHJlc2l6ZVF1YWxpdHk6IHV0aWxzLmNpYl9xdWFsaXR5X25hbWUob3B0cy5xdWFsaXR5KVxuICB9KS50aGVuKGZ1bmN0aW9uIChpbWFnZUJpdG1hcCkge1xuICAgIGlmIChvcHRzLmNhbmNlbGVkKSByZXR1cm4gb3B0cy5jYW5jZWxUb2tlbjsgLy8gaWYgbm8gdW5zaGFycCAtIGRyYXcgZGlyZWN0bHkgdG8gb3V0cHV0IGNhbnZhc1xuXG4gICAgaWYgKCFvcHRzLnVuc2hhcnBBbW91bnQpIHtcbiAgICAgIHRvQ3R4LmRyYXdJbWFnZShpbWFnZUJpdG1hcCwgMCwgMCk7XG4gICAgICBpbWFnZUJpdG1hcC5jbG9zZSgpO1xuICAgICAgdG9DdHggPSBudWxsO1xuXG4gICAgICBfdGhpczUuZGVidWcoJ0ZpbmlzaGVkIScpO1xuXG4gICAgICByZXR1cm4gdG87XG4gICAgfVxuXG4gICAgX3RoaXM1LmRlYnVnKCdVbnNoYXJwIHJlc3VsdCcpO1xuXG4gICAgdmFyIHRtcENhbnZhcyA9IF90aGlzNS5vcHRpb25zLmNyZWF0ZUNhbnZhcyhvcHRzLnRvV2lkdGgsIG9wdHMudG9IZWlnaHQpO1xuXG4gICAgdmFyIHRtcEN0eCA9IHRtcENhbnZhcy5nZXRDb250ZXh0KCcyZCcsIHtcbiAgICAgIGFscGhhOiBCb29sZWFuKG9wdHMuYWxwaGEpXG4gICAgfSk7XG4gICAgdG1wQ3R4LmRyYXdJbWFnZShpbWFnZUJpdG1hcCwgMCwgMCk7XG4gICAgaW1hZ2VCaXRtYXAuY2xvc2UoKTtcbiAgICB2YXIgaURhdGEgPSB0bXBDdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIG9wdHMudG9XaWR0aCwgb3B0cy50b0hlaWdodCk7XG5cbiAgICBfdGhpczUuX19tYXRobGliLnVuc2hhcnBfbWFzayhpRGF0YS5kYXRhLCBvcHRzLnRvV2lkdGgsIG9wdHMudG9IZWlnaHQsIG9wdHMudW5zaGFycEFtb3VudCwgb3B0cy51bnNoYXJwUmFkaXVzLCBvcHRzLnVuc2hhcnBUaHJlc2hvbGQpO1xuXG4gICAgdG9DdHgucHV0SW1hZ2VEYXRhKGlEYXRhLCAwLCAwKTsgLy8gU2FmYXJpIDEyIHdvcmthcm91bmRcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWNhL3BpY2EvaXNzdWVzLzE5OVxuXG4gICAgdG1wQ2FudmFzLndpZHRoID0gdG1wQ2FudmFzLmhlaWdodCA9IDA7XG4gICAgaURhdGEgPSB0bXBDdHggPSB0bXBDYW52YXMgPSB0b0N0eCA9IG51bGw7XG5cbiAgICBfdGhpczUuZGVidWcoJ0ZpbmlzaGVkIScpO1xuXG4gICAgcmV0dXJuIHRvO1xuICB9KTtcbn07XG5cblBpY2EucHJvdG90eXBlLnJlc2l6ZSA9IGZ1bmN0aW9uIChmcm9tLCB0bywgb3B0aW9ucykge1xuICB2YXIgX3RoaXM2ID0gdGhpcztcblxuICB0aGlzLmRlYnVnKCdTdGFydCByZXNpemUuLi4nKTtcbiAgdmFyIG9wdHMgPSBhc3NpZ24oe30sIERFRkFVTFRfUkVTSVpFX09QVFMpO1xuXG4gIGlmICghaXNOYU4ob3B0aW9ucykpIHtcbiAgICBvcHRzID0gYXNzaWduKG9wdHMsIHtcbiAgICAgIHF1YWxpdHk6IG9wdGlvbnNcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChvcHRpb25zKSB7XG4gICAgb3B0cyA9IGFzc2lnbihvcHRzLCBvcHRpb25zKTtcbiAgfVxuXG4gIG9wdHMudG9XaWR0aCA9IHRvLndpZHRoO1xuICBvcHRzLnRvSGVpZ2h0ID0gdG8uaGVpZ2h0O1xuICBvcHRzLndpZHRoID0gZnJvbS5uYXR1cmFsV2lkdGggfHwgZnJvbS53aWR0aDtcbiAgb3B0cy5oZWlnaHQgPSBmcm9tLm5hdHVyYWxIZWlnaHQgfHwgZnJvbS5oZWlnaHQ7IC8vIFByZXZlbnQgc3RlcHBlciBmcm9tIGluZmluaXRlIGxvb3BcblxuICBpZiAodG8ud2lkdGggPT09IDAgfHwgdG8uaGVpZ2h0ID09PSAwKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkludmFsaWQgb3V0cHV0IHNpemU6IFwiLmNvbmNhdCh0by53aWR0aCwgXCJ4XCIpLmNvbmNhdCh0by5oZWlnaHQpKSk7XG4gIH1cblxuICBpZiAob3B0cy51bnNoYXJwUmFkaXVzID4gMikgb3B0cy51bnNoYXJwUmFkaXVzID0gMjtcbiAgb3B0cy5jYW5jZWxlZCA9IGZhbHNlO1xuXG4gIGlmIChvcHRzLmNhbmNlbFRva2VuKSB7XG4gICAgLy8gV3JhcCBjYW5jZWxUb2tlbiB0byBhdm9pZCBzdWNjZXNzaXZlIHJlc29sdmUgJiBzZXQgZmxhZ1xuICAgIG9wdHMuY2FuY2VsVG9rZW4gPSBvcHRzLmNhbmNlbFRva2VuLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgIG9wdHMuY2FuY2VsZWQgPSB0cnVlO1xuICAgICAgdGhyb3cgZGF0YTtcbiAgICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBvcHRzLmNhbmNlbGVkID0gdHJ1ZTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9KTtcbiAgfVxuXG4gIHZhciBERVNUX1RJTEVfQk9SREVSID0gMzsgLy8gTWF4IHBvc3NpYmxlIGZpbHRlciB3aW5kb3cgc2l6ZVxuXG4gIG9wdHMuX19kZXN0VGlsZUJvcmRlciA9IE1hdGguY2VpbChNYXRoLm1heChERVNUX1RJTEVfQk9SREVSLCAyLjUgKiBvcHRzLnVuc2hhcnBSYWRpdXMgfCAwKSk7XG4gIHJldHVybiB0aGlzLmluaXQoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAob3B0cy5jYW5jZWxlZCkgcmV0dXJuIG9wdHMuY2FuY2VsVG9rZW47IC8vIGlmIGNyZWF0ZUltYWdlQml0bWFwIHN1cHBvcnRzIHJlc2l6ZSwganVzdCBkbyBpdCBhbmQgcmV0dXJuXG5cbiAgICBpZiAoX3RoaXM2LmZlYXR1cmVzLmNpYikge1xuICAgICAgcmV0dXJuIF90aGlzNi5fX3Jlc2l6ZVZpYUNyZWF0ZUltYWdlQml0bWFwKGZyb20sIHRvLCBvcHRzKTtcbiAgICB9XG5cbiAgICBpZiAoIUNBTl9VU0VfQ0FOVkFTX0dFVF9JTUFHRV9EQVRBKSB7XG4gICAgICB2YXIgZXJyID0gbmV3IEVycm9yKCdQaWNhOiBjYW5ub3QgdXNlIGdldEltYWdlRGF0YSBvbiBjYW52YXMsICcgKyBcIm1ha2Ugc3VyZSBmaW5nZXJwcmludGluZyBwcm90ZWN0aW9uIGlzbid0IGVuYWJsZWRcIik7XG4gICAgICBlcnIuY29kZSA9ICdFUlJfR0VUX0lNQUdFX0RBVEEnO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH0gLy9cbiAgICAvLyBObyBlYXN5IHdheSwgbGV0J3MgcmVzaXplIG1hbnVhbGx5IHZpYSBhcnJheXNcbiAgICAvL1xuXG5cbiAgICB2YXIgc3RhZ2VzID0gY3JlYXRlU3RhZ2VzKG9wdHMud2lkdGgsIG9wdHMuaGVpZ2h0LCBvcHRzLnRvV2lkdGgsIG9wdHMudG9IZWlnaHQsIF90aGlzNi5vcHRpb25zLnRpbGUsIG9wdHMuX19kZXN0VGlsZUJvcmRlcik7XG4gICAgcmV0dXJuIF90aGlzNi5fX3Byb2Nlc3NTdGFnZXMoc3RhZ2VzLCBmcm9tLCB0bywgb3B0cyk7XG4gIH0pO1xufTsgLy8gUkdCQSBidWZmZXIgcmVzaXplXG4vL1xuXG5cblBpY2EucHJvdG90eXBlLnJlc2l6ZUJ1ZmZlciA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIHZhciBfdGhpczcgPSB0aGlzO1xuXG4gIHZhciBvcHRzID0gYXNzaWduKHt9LCBERUZBVUxUX1JFU0laRV9PUFRTLCBvcHRpb25zKTtcbiAgcmV0dXJuIHRoaXMuaW5pdCgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfdGhpczcuX19tYXRobGliLnJlc2l6ZUFuZFVuc2hhcnAob3B0cyk7XG4gIH0pO1xufTtcblxuUGljYS5wcm90b3R5cGUudG9CbG9iID0gZnVuY3Rpb24gKGNhbnZhcywgbWltZVR5cGUsIHF1YWxpdHkpIHtcbiAgbWltZVR5cGUgPSBtaW1lVHlwZSB8fCAnaW1hZ2UvcG5nJztcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgaWYgKGNhbnZhcy50b0Jsb2IpIHtcbiAgICAgIGNhbnZhcy50b0Jsb2IoZnVuY3Rpb24gKGJsb2IpIHtcbiAgICAgICAgcmV0dXJuIHJlc29sdmUoYmxvYik7XG4gICAgICB9LCBtaW1lVHlwZSwgcXVhbGl0eSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGNhbnZhcy5jb252ZXJ0VG9CbG9iKSB7XG4gICAgICByZXNvbHZlKGNhbnZhcy5jb252ZXJ0VG9CbG9iKHtcbiAgICAgICAgdHlwZTogbWltZVR5cGUsXG4gICAgICAgIHF1YWxpdHk6IHF1YWxpdHlcbiAgICAgIH0pKTtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIEZhbGxiYWNrIGZvciBvbGQgYnJvd3NlcnNcblxuXG4gICAgdmFyIGFzU3RyaW5nID0gYXRvYihjYW52YXMudG9EYXRhVVJMKG1pbWVUeXBlLCBxdWFsaXR5KS5zcGxpdCgnLCcpWzFdKTtcbiAgICB2YXIgbGVuID0gYXNTdHJpbmcubGVuZ3RoO1xuICAgIHZhciBhc0J1ZmZlciA9IG5ldyBVaW50OEFycmF5KGxlbik7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBhc0J1ZmZlcltpXSA9IGFzU3RyaW5nLmNoYXJDb2RlQXQoaSk7XG4gICAgfVxuXG4gICAgcmVzb2x2ZShuZXcgQmxvYihbYXNCdWZmZXJdLCB7XG4gICAgICB0eXBlOiBtaW1lVHlwZVxuICAgIH0pKTtcbiAgfSk7XG59O1xuXG5QaWNhLnByb3RvdHlwZS5kZWJ1ZyA9IGZ1bmN0aW9uICgpIHt9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFBpY2E7XG5cbn0se1wiLi9saWIvbWF0aGxpYlwiOjEsXCIuL2xpYi9wb29sXCI6MTMsXCIuL2xpYi9zdGVwcGVyXCI6MTQsXCIuL2xpYi90aWxlclwiOjE1LFwiLi9saWIvdXRpbHNcIjoxNixcIi4vbGliL3dvcmtlclwiOjE3LFwib2JqZWN0LWFzc2lnblwiOjIzLFwid2Vid29ya2lmeVwiOjI0fV19LHt9LFtdKShcIi9pbmRleC5qc1wiKVxufSk7XG59KTtcblxudmFyIGltYWdlX3RyYXZlcnNlID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSkge1xuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gSGVscGVyc1xuLy9cbmZ1bmN0aW9uIGVycm9yKG1lc3NhZ2UsIGNvZGUpIHtcbiAgdmFyIGVyciA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgZXJyLmNvZGUgPSBjb2RlO1xuICByZXR1cm4gZXJyO1xufVxuXG5cbi8vIENvbnZlcnQgbnVtYmVyIHRvIDB4SEggc3RyaW5nXG4vL1xuZnVuY3Rpb24gdG9faGV4KG51bWJlcikge1xuICB2YXIgbiA9IG51bWJlci50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcbiAgZm9yICh2YXIgaSA9IDIgLSBuLmxlbmd0aDsgaSA+IDA7IGktLSkgbiA9ICcwJyArIG47XG4gIHJldHVybiAnMHgnICsgbjtcbn1cblxuXG5mdW5jdGlvbiB1dGY4X2VuY29kZShzdHIpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHN0cikpO1xuICB9IGNhdGNoIChfKSB7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIHV0ZjhfZGVjb2RlKHN0cikge1xuICB0cnkge1xuICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKHN0cikpO1xuICB9IGNhdGNoIChfKSB7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxufVxuXG5cbi8vIENoZWNrIGlmIGlucHV0IGlzIGEgVWludDhBcnJheVxuLy9cbmZ1bmN0aW9uIGlzX3VpbnQ4YXJyYXkoYmluKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYmluKSA9PT0gJ1tvYmplY3QgVWludDhBcnJheV0nO1xufVxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBFeGlmIHBhcnNlclxuLy9cbi8vIElucHV0OlxuLy8gIC0ganBlZ19iaW46ICAgVWludDhBcnJheSAtIGpwZWcgZmlsZVxuLy8gIC0gZXhpZl9zdGFydDogTnVtYmVyICAgICAtIHN0YXJ0IG9mIFRJRkYgaGVhZGVyIChhZnRlciBFeGlmXFwwXFwwKVxuLy8gIC0gZXhpZl9lbmQ6ICAgTnVtYmVyICAgICAtIGVuZCBvZiBFeGlmIHNlZ21lbnRcbi8vICAtIG9uX2VudHJ5OiAgIE51bWJlciAgICAgLSBjYWxsYmFja1xuLy9cbmZ1bmN0aW9uIEV4aWZQYXJzZXIoanBlZ19iaW4sIGV4aWZfc3RhcnQsIGV4aWZfZW5kKSB7XG4gIC8vIFVpbnQ4QXJyYXksIGV4aWYgd2l0aG91dCBzaWduYXR1cmUgKHdoaWNoIGlzbid0IGluY2x1ZGVkIGluIG9mZnNldHMpXG4gIHRoaXMuaW5wdXQgICAgICA9IGpwZWdfYmluLnN1YmFycmF5KGV4aWZfc3RhcnQsIGV4aWZfZW5kKTtcblxuICAvLyBvZmZzZXQgY29ycmVjdGlvbiBmb3IgYG9uX2VudHJ5YCBjYWxsYmFja1xuICB0aGlzLnN0YXJ0ICAgICAgPSBleGlmX3N0YXJ0O1xuXG4gIC8vIENoZWNrIFRJRkYgaGVhZGVyIChpbmNsdWRlcyBieXRlIGFsaWdubWVudCBhbmQgZmlyc3QgSUZEIG9mZnNldClcbiAgdmFyIHNpZyA9IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgdGhpcy5pbnB1dC5zdWJhcnJheSgwLCA0KSk7XG5cbiAgaWYgKHNpZyAhPT0gJ0lJXFx4MkFcXDAnICYmIHNpZyAhPT0gJ01NXFwwXFx4MkEnKSB7XG4gICAgdGhyb3cgZXJyb3IoJ2ludmFsaWQgVElGRiBzaWduYXR1cmUnLCAnRUJBRERBVEEnKTtcbiAgfVxuXG4gIC8vIHRydWUgaWYgbW90b3JvbGEgKGJpZyBlbmRpYW4pIGJ5dGUgYWxpZ25tZW50LCBmYWxzZSBpZiBpbnRlbFxuICB0aGlzLmJpZ19lbmRpYW4gPSBzaWdbMF0gPT09ICdNJztcbn1cblxuXG5FeGlmUGFyc2VyLnByb3RvdHlwZS5lYWNoID0gZnVuY3Rpb24gKG9uX2VudHJ5KSB7XG4gIC8vIGFsbG93IHByZW1hdHVyZSBleGl0XG4gIHRoaXMuYWJvcnRlZCA9IGZhbHNlO1xuXG4gIHZhciBvZmZzZXQgPSB0aGlzLnJlYWRfdWludDMyKDQpO1xuXG4gIHRoaXMuaWZkc190b19yZWFkID0gWyB7XG4gICAgaWQ6ICAgICAwLFxuICAgIG9mZnNldDogb2Zmc2V0XG4gIH0gXTtcblxuICB3aGlsZSAodGhpcy5pZmRzX3RvX3JlYWQubGVuZ3RoID4gMCAmJiAhdGhpcy5hYm9ydGVkKSB7XG4gICAgdmFyIGkgPSB0aGlzLmlmZHNfdG9fcmVhZC5zaGlmdCgpO1xuICAgIGlmICghaS5vZmZzZXQpIGNvbnRpbnVlO1xuICAgIHRoaXMuc2Nhbl9pZmQoaS5pZCwgaS5vZmZzZXQsIG9uX2VudHJ5KTtcbiAgfVxufTtcblxuXG5FeGlmUGFyc2VyLnByb3RvdHlwZS5maWx0ZXIgPSBmdW5jdGlvbiAob25fZW50cnkpIHtcbiAgdmFyIGlmZHMgPSB7fTtcblxuICAvLyBtYWtlIHN1cmUgSUZEMCBhbHdheXMgZXhpc3RzXG4gIGlmZHMuaWZkMCA9IHsgaWQ6IDAsIGVudHJpZXM6IFtdIH07XG5cbiAgdGhpcy5lYWNoKGZ1bmN0aW9uIChlbnRyeSkge1xuICAgIGlmIChvbl9lbnRyeShlbnRyeSkgPT09IGZhbHNlICYmICFlbnRyeS5pc19zdWJpZmRfbGluaykgcmV0dXJuO1xuICAgIGlmIChlbnRyeS5pc19zdWJpZmRfbGluayAmJiBlbnRyeS5jb3VudCAhPT0gMSAmJiBlbnRyeS5mb3JtYXQgIT09IDQpIHJldHVybjsgLy8gZmlsdGVyIG91dCBib2d1cyBsaW5rc1xuXG4gICAgaWYgKCFpZmRzWydpZmQnICsgZW50cnkuaWZkXSkge1xuICAgICAgaWZkc1snaWZkJyArIGVudHJ5LmlmZF0gPSB7IGlkOiBlbnRyeS5pZmQsIGVudHJpZXM6IFtdIH07XG4gICAgfVxuXG4gICAgaWZkc1snaWZkJyArIGVudHJ5LmlmZF0uZW50cmllcy5wdXNoKGVudHJ5KTtcbiAgfSk7XG5cbiAgLy8gdGh1bWJuYWlscyBhcmUgbm90IHN1cHBvcnRlZCBqdXN0IHlldCwgc28gZGVsZXRlIGFsbCBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGl0XG4gIGRlbGV0ZSBpZmRzLmlmZDE7XG5cbiAgLy8gQ2FsY3VsYXRlIG91dHB1dCBzaXplXG4gIHZhciBsZW5ndGggPSA4O1xuICBPYmplY3Qua2V5cyhpZmRzKS5mb3JFYWNoKGZ1bmN0aW9uIChpZmRfbm8pIHtcbiAgICBsZW5ndGggKz0gMjtcblxuICAgIGlmZHNbaWZkX25vXS5lbnRyaWVzLmZvckVhY2goZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgICBsZW5ndGggKz0gMTIgKyAoZW50cnkuZGF0YV9sZW5ndGggPiA0ID8gTWF0aC5jZWlsKGVudHJ5LmRhdGFfbGVuZ3RoIC8gMikgKiAyIDogMCk7XG4gICAgfSk7XG5cbiAgICBsZW5ndGggKz0gNDtcbiAgfSk7XG5cbiAgdGhpcy5vdXRwdXQgPSBuZXcgVWludDhBcnJheShsZW5ndGgpO1xuICB0aGlzLm91dHB1dFswXSA9IHRoaXMub3V0cHV0WzFdID0gKHRoaXMuYmlnX2VuZGlhbiA/ICdNJyA6ICdJJykuY2hhckNvZGVBdCgwKTtcbiAgdGhpcy53cml0ZV91aW50MTYoMiwgMHgyQSk7XG5cbiAgdmFyIG9mZnNldCA9IDg7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdGhpcy53cml0ZV91aW50MzIoNCwgb2Zmc2V0KTtcblxuICBPYmplY3Qua2V5cyhpZmRzKS5mb3JFYWNoKGZ1bmN0aW9uIChpZmRfbm8pIHtcbiAgICBpZmRzW2lmZF9ub10ud3JpdHRlbl9vZmZzZXQgPSBvZmZzZXQ7XG5cbiAgICB2YXIgaWZkX3N0YXJ0ID0gb2Zmc2V0O1xuICAgIHZhciBpZmRfZW5kICAgPSBpZmRfc3RhcnQgKyAyICsgaWZkc1tpZmRfbm9dLmVudHJpZXMubGVuZ3RoICogMTIgKyA0O1xuICAgIG9mZnNldCA9IGlmZF9lbmQ7XG5cbiAgICBzZWxmLndyaXRlX3VpbnQxNihpZmRfc3RhcnQsIGlmZHNbaWZkX25vXS5lbnRyaWVzLmxlbmd0aCk7XG5cbiAgICBpZmRzW2lmZF9ub10uZW50cmllcy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAvLyBJRkQgZW50cmllcyBtdXN0IGJlIGluIG9yZGVyIG9mIGluY3JlYXNpbmcgdGFnIElEc1xuICAgICAgcmV0dXJuIGEudGFnIC0gYi50YWc7XG4gICAgfSkuZm9yRWFjaChmdW5jdGlvbiAoZW50cnksIGlkeCkge1xuICAgICAgdmFyIGVudHJ5X29mZnNldCA9IGlmZF9zdGFydCArIDIgKyBpZHggKiAxMjtcblxuICAgICAgc2VsZi53cml0ZV91aW50MTYoZW50cnlfb2Zmc2V0LCBlbnRyeS50YWcpO1xuICAgICAgc2VsZi53cml0ZV91aW50MTYoZW50cnlfb2Zmc2V0ICsgMiwgZW50cnkuZm9ybWF0KTtcbiAgICAgIHNlbGYud3JpdGVfdWludDMyKGVudHJ5X29mZnNldCArIDQsIGVudHJ5LmNvdW50KTtcblxuICAgICAgaWYgKGVudHJ5LmlzX3N1YmlmZF9saW5rKSB7XG4gICAgICAgIC8vIGZpbGxlZCBpbiBsYXRlclxuICAgICAgICBpZiAoaWZkc1snaWZkJyArIGVudHJ5LnRhZ10pIGlmZHNbJ2lmZCcgKyBlbnRyeS50YWddLmxpbmtfb2Zmc2V0ID0gZW50cnlfb2Zmc2V0ICsgODtcbiAgICAgIH0gZWxzZSBpZiAoZW50cnkuZGF0YV9sZW5ndGggPD0gNCkge1xuICAgICAgICBzZWxmLm91dHB1dC5zZXQoXG4gICAgICAgICAgc2VsZi5pbnB1dC5zdWJhcnJheShlbnRyeS5kYXRhX29mZnNldCAtIHNlbGYuc3RhcnQsIGVudHJ5LmRhdGFfb2Zmc2V0IC0gc2VsZi5zdGFydCArIDQpLFxuICAgICAgICAgIGVudHJ5X29mZnNldCArIDhcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlbGYud3JpdGVfdWludDMyKGVudHJ5X29mZnNldCArIDgsIG9mZnNldCk7XG4gICAgICAgIHNlbGYub3V0cHV0LnNldChcbiAgICAgICAgICBzZWxmLmlucHV0LnN1YmFycmF5KGVudHJ5LmRhdGFfb2Zmc2V0IC0gc2VsZi5zdGFydCwgZW50cnkuZGF0YV9vZmZzZXQgLSBzZWxmLnN0YXJ0ICsgZW50cnkuZGF0YV9sZW5ndGgpLFxuICAgICAgICAgIG9mZnNldFxuICAgICAgICApO1xuICAgICAgICBvZmZzZXQgKz0gTWF0aC5jZWlsKGVudHJ5LmRhdGFfbGVuZ3RoIC8gMikgKiAyO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdmFyIG5leHRfaWZkID0gaWZkc1snaWZkJyArIChpZmRzW2lmZF9ub10uaWQgKyAxKV07XG4gICAgaWYgKG5leHRfaWZkKSBuZXh0X2lmZC5saW5rX29mZnNldCA9IGlmZF9lbmQgLSA0O1xuICB9KTtcblxuICBPYmplY3Qua2V5cyhpZmRzKS5mb3JFYWNoKGZ1bmN0aW9uIChpZmRfbm8pIHtcbiAgICBpZiAoaWZkc1tpZmRfbm9dLndyaXR0ZW5fb2Zmc2V0ICYmIGlmZHNbaWZkX25vXS5saW5rX29mZnNldCkge1xuICAgICAgc2VsZi53cml0ZV91aW50MzIoaWZkc1tpZmRfbm9dLmxpbmtfb2Zmc2V0LCBpZmRzW2lmZF9ub10ud3JpdHRlbl9vZmZzZXQpO1xuICAgIH1cbiAgfSk7XG5cbiAgaWYgKHRoaXMub3V0cHV0Lmxlbmd0aCAhPT0gb2Zmc2V0KSB0aHJvdyBlcnJvcignaW50ZXJuYWwgZXJyb3I6IGluY29ycmVjdCBidWZmZXIgc2l6ZSBhbGxvY2F0ZWQnKTtcblxuICByZXR1cm4gdGhpcy5vdXRwdXQ7XG59O1xuXG5cbkV4aWZQYXJzZXIucHJvdG90eXBlLnJlYWRfdWludDE2ID0gZnVuY3Rpb24gKG9mZnNldCkge1xuICB2YXIgZCA9IHRoaXMuaW5wdXQ7XG4gIGlmIChvZmZzZXQgKyAyID4gZC5sZW5ndGgpIHRocm93IGVycm9yKCd1bmV4cGVjdGVkIEVPRicsICdFQkFEREFUQScpO1xuXG4gIHJldHVybiB0aGlzLmJpZ19lbmRpYW4gP1xuICAgIGRbb2Zmc2V0XSAqIDB4MTAwICsgZFtvZmZzZXQgKyAxXSA6XG4gICAgZFtvZmZzZXRdICsgZFtvZmZzZXQgKyAxXSAqIDB4MTAwO1xufTtcblxuXG5FeGlmUGFyc2VyLnByb3RvdHlwZS5yZWFkX3VpbnQzMiA9IGZ1bmN0aW9uIChvZmZzZXQpIHtcbiAgdmFyIGQgPSB0aGlzLmlucHV0O1xuICBpZiAob2Zmc2V0ICsgNCA+IGQubGVuZ3RoKSB0aHJvdyBlcnJvcigndW5leHBlY3RlZCBFT0YnLCAnRUJBRERBVEEnKTtcblxuICByZXR1cm4gdGhpcy5iaWdfZW5kaWFuID9cbiAgICBkW29mZnNldF0gKiAweDEwMDAwMDAgKyBkW29mZnNldCArIDFdICogMHgxMDAwMCArIGRbb2Zmc2V0ICsgMl0gKiAweDEwMCArIGRbb2Zmc2V0ICsgM10gOlxuICAgIGRbb2Zmc2V0XSArIGRbb2Zmc2V0ICsgMV0gKiAweDEwMCArIGRbb2Zmc2V0ICsgMl0gKiAweDEwMDAwICsgZFtvZmZzZXQgKyAzXSAqIDB4MTAwMDAwMDtcbn07XG5cblxuRXhpZlBhcnNlci5wcm90b3R5cGUud3JpdGVfdWludDE2ID0gZnVuY3Rpb24gKG9mZnNldCwgdmFsdWUpIHtcbiAgdmFyIGQgPSB0aGlzLm91dHB1dDtcblxuICBpZiAodGhpcy5iaWdfZW5kaWFuKSB7XG4gICAgZFtvZmZzZXRdICAgICA9ICh2YWx1ZSA+Pj4gOCkgJiAweEZGO1xuICAgIGRbb2Zmc2V0ICsgMV0gPSB2YWx1ZSAmIDB4RkY7XG4gIH0gZWxzZSB7XG4gICAgZFtvZmZzZXRdICAgICA9IHZhbHVlICYgMHhGRjtcbiAgICBkW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KSAmIDB4RkY7XG4gIH1cbn07XG5cblxuRXhpZlBhcnNlci5wcm90b3R5cGUud3JpdGVfdWludDMyID0gZnVuY3Rpb24gKG9mZnNldCwgdmFsdWUpIHtcbiAgdmFyIGQgPSB0aGlzLm91dHB1dDtcblxuICBpZiAodGhpcy5iaWdfZW5kaWFuKSB7XG4gICAgZFtvZmZzZXRdICAgICA9ICh2YWx1ZSA+Pj4gMjQpICYgMHhGRjtcbiAgICBkW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNikgJiAweEZGO1xuICAgIGRbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDgpICYgMHhGRjtcbiAgICBkW29mZnNldCArIDNdID0gdmFsdWUgJiAweEZGO1xuICB9IGVsc2Uge1xuICAgIGRbb2Zmc2V0XSAgICAgPSB2YWx1ZSAmIDB4RkY7XG4gICAgZFtvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOCkgJiAweEZGO1xuICAgIGRbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDE2KSAmIDB4RkY7XG4gICAgZFtvZmZzZXQgKyAzXSA9ICh2YWx1ZSA+Pj4gMjQpICYgMHhGRjtcbiAgfVxufTtcblxuXG5FeGlmUGFyc2VyLnByb3RvdHlwZS5pc19zdWJpZmRfbGluayA9IGZ1bmN0aW9uIChpZmQsIHRhZykge1xuICByZXR1cm4gKGlmZCA9PT0gMCAmJiB0YWcgPT09IDB4ODc2OSkgfHwgLy8gU3ViSUZEXG4gICAgICAgICAoaWZkID09PSAwICYmIHRhZyA9PT0gMHg4ODI1KSB8fCAvLyBHUFMgSW5mb1xuICAgICAgICAgKGlmZCA9PT0gMHg4NzY5ICYmIHRhZyA9PT0gMHhBMDA1KTsgLy8gSW50ZXJvcCBJRkRcbn07XG5cblxuLy8gUmV0dXJucyBieXRlIGxlbmd0aCBvZiBhIHNpbmdsZSBjb21wb25lbnQgb2YgYSBnaXZlbiBmb3JtYXRcbi8vXG5FeGlmUGFyc2VyLnByb3RvdHlwZS5leGlmX2Zvcm1hdF9sZW5ndGggPSBmdW5jdGlvbiAoZm9ybWF0KSB7XG4gIHN3aXRjaCAoZm9ybWF0KSB7XG4gICAgY2FzZSAxOiAvLyBieXRlXG4gICAgY2FzZSAyOiAvLyBhc2NpaVxuICAgIGNhc2UgNjogLy8gc2J5dGVcbiAgICBjYXNlIDc6IC8vIHVuZGVmaW5lZFxuICAgICAgcmV0dXJuIDE7XG5cbiAgICBjYXNlIDM6IC8vIHNob3J0XG4gICAgY2FzZSA4OiAvLyBzc2hvcnRcbiAgICAgIHJldHVybiAyO1xuXG4gICAgY2FzZSA0OiAgLy8gbG9uZ1xuICAgIGNhc2UgOTogIC8vIHNsb25nXG4gICAgY2FzZSAxMTogLy8gZmxvYXRcbiAgICAgIHJldHVybiA0O1xuXG4gICAgY2FzZSA1OiAgLy8gcmF0aW9uYWxcbiAgICBjYXNlIDEwOiAvLyBzcmF0aW9uYWxcbiAgICBjYXNlIDEyOiAvLyBkb3VibGVcbiAgICAgIHJldHVybiA4O1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIHVua25vd24gdHlwZVxuICAgICAgcmV0dXJuIDA7XG4gIH1cbn07XG5cblxuLy8gUmVhZHMgRXhpZiBkYXRhXG4vL1xuRXhpZlBhcnNlci5wcm90b3R5cGUuZXhpZl9mb3JtYXRfcmVhZCA9IGZ1bmN0aW9uIChmb3JtYXQsIG9mZnNldCkge1xuICB2YXIgdjtcblxuICBzd2l0Y2ggKGZvcm1hdCkge1xuICAgIGNhc2UgMTogLy8gYnl0ZVxuICAgIGNhc2UgMjogLy8gYXNjaWlcbiAgICAgIHYgPSB0aGlzLmlucHV0W29mZnNldF07XG4gICAgICByZXR1cm4gdjtcblxuICAgIGNhc2UgNjogLy8gc2J5dGVcbiAgICAgIHYgPSB0aGlzLmlucHV0W29mZnNldF07XG4gICAgICByZXR1cm4gdiB8ICh2ICYgMHg4MCkgKiAweDFmZmZmZmU7XG5cbiAgICBjYXNlIDM6IC8vIHNob3J0XG4gICAgICB2ID0gdGhpcy5yZWFkX3VpbnQxNihvZmZzZXQpO1xuICAgICAgcmV0dXJuIHY7XG5cbiAgICBjYXNlIDg6IC8vIHNzaG9ydFxuICAgICAgdiA9IHRoaXMucmVhZF91aW50MTYob2Zmc2V0KTtcbiAgICAgIHJldHVybiB2IHwgKHYgJiAweDgwMDApICogMHgxZmZmZTtcblxuICAgIGNhc2UgNDogLy8gbG9uZ1xuICAgICAgdiA9IHRoaXMucmVhZF91aW50MzIob2Zmc2V0KTtcbiAgICAgIHJldHVybiB2O1xuXG4gICAgY2FzZSA5OiAvLyBzbG9uZ1xuICAgICAgdiA9IHRoaXMucmVhZF91aW50MzIob2Zmc2V0KTtcbiAgICAgIHJldHVybiB2IHwgMDtcblxuICAgIGNhc2UgNTogIC8vIHJhdGlvbmFsXG4gICAgY2FzZSAxMDogLy8gc3JhdGlvbmFsXG4gICAgY2FzZSAxMTogLy8gZmxvYXRcbiAgICBjYXNlIDEyOiAvLyBkb3VibGVcbiAgICAgIHJldHVybiBudWxsOyAvLyBub3QgaW1wbGVtZW50ZWRcblxuICAgIGNhc2UgNzogLy8gdW5kZWZpbmVkXG4gICAgICByZXR1cm4gbnVsbDsgLy8gYmxvYlxuXG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIHVua25vd24gdHlwZVxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn07XG5cblxuRXhpZlBhcnNlci5wcm90b3R5cGUuc2Nhbl9pZmQgPSBmdW5jdGlvbiAoaWZkX25vLCBvZmZzZXQsIG9uX2VudHJ5KSB7XG4gIHZhciBlbnRyeV9jb3VudCA9IHRoaXMucmVhZF91aW50MTYob2Zmc2V0KTtcblxuICBvZmZzZXQgKz0gMjtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGVudHJ5X2NvdW50OyBpKyspIHtcbiAgICB2YXIgdGFnICAgID0gdGhpcy5yZWFkX3VpbnQxNihvZmZzZXQpO1xuICAgIHZhciBmb3JtYXQgPSB0aGlzLnJlYWRfdWludDE2KG9mZnNldCArIDIpO1xuICAgIHZhciBjb3VudCAgPSB0aGlzLnJlYWRfdWludDMyKG9mZnNldCArIDQpO1xuXG4gICAgdmFyIGNvbXBfbGVuZ3RoICAgID0gdGhpcy5leGlmX2Zvcm1hdF9sZW5ndGgoZm9ybWF0KTtcbiAgICB2YXIgZGF0YV9sZW5ndGggICAgPSBjb3VudCAqIGNvbXBfbGVuZ3RoO1xuICAgIHZhciBkYXRhX29mZnNldCAgICA9IGRhdGFfbGVuZ3RoIDw9IDQgPyBvZmZzZXQgKyA4IDogdGhpcy5yZWFkX3VpbnQzMihvZmZzZXQgKyA4KTtcbiAgICB2YXIgaXNfc3ViaWZkX2xpbmsgPSBmYWxzZTtcblxuICAgIGlmIChkYXRhX29mZnNldCArIGRhdGFfbGVuZ3RoID4gdGhpcy5pbnB1dC5sZW5ndGgpIHtcbiAgICAgIHRocm93IGVycm9yKCd1bmV4cGVjdGVkIEVPRicsICdFQkFEREFUQScpO1xuICAgIH1cblxuICAgIHZhciB2YWx1ZSA9IFtdO1xuICAgIHZhciBjb21wX29mZnNldCA9IGRhdGFfb2Zmc2V0O1xuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBjb3VudDsgaisrLCBjb21wX29mZnNldCArPSBjb21wX2xlbmd0aCkge1xuICAgICAgdmFyIGl0ZW0gPSB0aGlzLmV4aWZfZm9ybWF0X3JlYWQoZm9ybWF0LCBjb21wX29mZnNldCk7XG4gICAgICBpZiAoaXRlbSA9PT0gbnVsbCkge1xuICAgICAgICB2YWx1ZSA9IG51bGw7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgdmFsdWUucHVzaChpdGVtKTtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgZm9ybWF0ID09PSAyKSB7XG4gICAgICB0cnkge1xuICAgICAgICB2YWx1ZSA9IHV0ZjhfZGVjb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgdmFsdWUpKTtcbiAgICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgdmFsdWUgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAodmFsdWUgJiYgdmFsdWVbdmFsdWUubGVuZ3RoIC0gMV0gPT09ICdcXDAnKSB2YWx1ZSA9IHZhbHVlLnNsaWNlKDAsIC0xKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc19zdWJpZmRfbGluayhpZmRfbm8sIHRhZykpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiBOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlWzBdKSAmJiB2YWx1ZVswXSA+IDApIHtcbiAgICAgICAgdGhpcy5pZmRzX3RvX3JlYWQucHVzaCh7XG4gICAgICAgICAgaWQ6ICAgICB0YWcsXG4gICAgICAgICAgb2Zmc2V0OiB2YWx1ZVswXVxuICAgICAgICB9KTtcbiAgICAgICAgaXNfc3ViaWZkX2xpbmsgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBlbnRyeSA9IHtcbiAgICAgIGlzX2JpZ19lbmRpYW46ICB0aGlzLmJpZ19lbmRpYW4sXG4gICAgICBpZmQ6ICAgICAgICAgICAgaWZkX25vLFxuICAgICAgdGFnOiAgICAgICAgICAgIHRhZyxcbiAgICAgIGZvcm1hdDogICAgICAgICBmb3JtYXQsXG4gICAgICBjb3VudDogICAgICAgICAgY291bnQsXG4gICAgICBlbnRyeV9vZmZzZXQ6ICAgb2Zmc2V0ICsgdGhpcy5zdGFydCxcbiAgICAgIGRhdGFfbGVuZ3RoOiAgICBkYXRhX2xlbmd0aCxcbiAgICAgIGRhdGFfb2Zmc2V0OiAgICBkYXRhX29mZnNldCArIHRoaXMuc3RhcnQsXG4gICAgICB2YWx1ZTogICAgICAgICAgdmFsdWUsXG4gICAgICBpc19zdWJpZmRfbGluazogaXNfc3ViaWZkX2xpbmtcbiAgICB9O1xuXG4gICAgaWYgKG9uX2VudHJ5KGVudHJ5KSA9PT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuYWJvcnRlZCA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgb2Zmc2V0ICs9IDEyO1xuICB9XG5cbiAgaWYgKGlmZF9ubyA9PT0gMCkge1xuICAgIHRoaXMuaWZkc190b19yZWFkLnB1c2goe1xuICAgICAgaWQ6ICAgICAxLFxuICAgICAgb2Zmc2V0OiB0aGlzLnJlYWRfdWludDMyKG9mZnNldClcbiAgICB9KTtcbiAgfVxufTtcblxuXG4vLyBDaGVjayB3aGV0aGVyIGlucHV0IGlzIGEgSlBFRyBpbWFnZVxuLy9cbi8vIElucHV0OlxuLy8gIC0ganBlZ19iaW46IFVpbnQ4QXJyYXkgLSBqcGVnIGZpbGVcbi8vXG4vLyBSZXR1cm5zIHRydWUgaWYgaXQgaXMgYW5kIGZhbHNlIG90aGVyd2lzZVxuLy9cbm1vZHVsZS5leHBvcnRzLmlzX2pwZWcgPSBmdW5jdGlvbiAoanBlZ19iaW4pIHtcbiAgcmV0dXJuIGpwZWdfYmluLmxlbmd0aCA+PSA0ICYmIGpwZWdfYmluWzBdID09PSAweEZGICYmIGpwZWdfYmluWzFdID09PSAweEQ4ICYmIGpwZWdfYmluWzJdID09PSAweEZGO1xufTtcblxuXG4vLyBDYWxsIGFuIGl0ZXJhdG9yIG9uIGVhY2ggc2VnbWVudCBpbiB0aGUgZ2l2ZW4gSlBFRyBpbWFnZVxuLy9cbi8vIElucHV0OlxuLy8gIC0ganBlZ19iaW46ICAgVWludDhBcnJheSAtIGpwZWcgZmlsZVxuLy8gIC0gb25fc2VnbWVudDogRnVuY3Rpb24gLSBjYWxsYmFjayBleGVjdXRlZCBvbiBlYWNoIEpQRUcgbWFya2VyIHNlZ21lbnRcbi8vICAgIC0gc2VnbWVudDogIE9iamVjdFxuLy8gICAgICAtIGNvZGU6ICAgTnVtYmVyIC0gbWFya2VyIHR5cGUgKDJuZCBieXRlLCBlLmcuIDB4RTAgZm9yIEFQUDApXG4vLyAgICAgIC0gb2Zmc2V0OiBOdW1iZXIgLSBvZmZzZXQgb2YgdGhlIGZpcnN0IGJ5dGUgKDB4RkYpIHJlbGF0aXZlIHRvIGBqcGVnX2JpbmAgc3RhcnRcbi8vICAgICAgLSBsZW5ndGg6IE51bWJlciAtIGxlbmd0aCBvZiB0aGUgZW50aXJlIG1hcmtlciBzZWdtZW50IGluY2x1ZGluZyBmaXJzdCB0d28gYnl0ZXMgYW5kIGxlbmd0aFxuLy8gICAgICAgIC0gMiBmb3Igc3RhbmRhbG9uZSBtYXJrZXJzXG4vLyAgICAgICAgLSA0K2xlbmd0aCBmb3IgbWFya2VycyB3aXRoIGRhdGFcbi8vXG4vLyBJdGVyYXRpb24gc3RvcHMgd2hlbiBgRU9JYCAoMHhGRkQ5KSBtYXJrZXIgaXMgcmVhY2hlZCBvciBpZiBgb25fc2VnbWVudGBcbi8vIGZ1bmN0aW9uIHJldHVybnMgYGZhbHNlYC5cbi8vXG5tb2R1bGUuZXhwb3J0cy5qcGVnX3NlZ21lbnRzX2VhY2ggPSBmdW5jdGlvbiAoanBlZ19iaW4sIG9uX3NlZ21lbnQpIHtcbiAgaWYgKCFpc191aW50OGFycmF5KGpwZWdfYmluKSkge1xuICAgIHRocm93IGVycm9yKCdJbnZhbGlkIGFyZ3VtZW50IChqcGVnX2JpbiksIFVpbnQ4QXJyYXkgZXhwZWN0ZWQnLCAnRUlOVkFMJyk7XG4gIH1cblxuICBpZiAodHlwZW9mIG9uX3NlZ21lbnQgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBlcnJvcignSW52YWxpZCBhcmd1bWVudCAob25fc2VnbWVudCksIEZ1bmN0aW9uIGV4cGVjdGVkJywgJ0VJTlZBTCcpO1xuICB9XG5cbiAgaWYgKCFtb2R1bGUuZXhwb3J0cy5pc19qcGVnKGpwZWdfYmluKSkge1xuICAgIHRocm93IGVycm9yKCdVbmtub3duIGZpbGUgZm9ybWF0JywgJ0VOT1RKUEVHJyk7XG4gIH1cblxuICB2YXIgb2Zmc2V0ID0gMCwgbGVuZ3RoID0ganBlZ19iaW4ubGVuZ3RoLCBpbnNpZGVfc2NhbiA9IGZhbHNlO1xuXG4gIGZvciAoOzspIHtcbiAgICB2YXIgc2VnbWVudF9jb2RlLCBzZWdtZW50X2xlbmd0aDtcblxuICAgIGlmIChvZmZzZXQgKyAxID49IGxlbmd0aCkgdGhyb3cgZXJyb3IoJ1VuZXhwZWN0ZWQgRU9GJywgJ0VCQUREQVRBJyk7XG4gICAgdmFyIGJ5dGUxID0ganBlZ19iaW5bb2Zmc2V0XTtcbiAgICB2YXIgYnl0ZTIgPSBqcGVnX2JpbltvZmZzZXQgKyAxXTtcblxuICAgIGlmIChieXRlMSA9PT0gMHhGRiAmJiBieXRlMiA9PT0gMHhGRikge1xuICAgICAgLy8gcGFkZGluZ1xuICAgICAgc2VnbWVudF9jb2RlID0gMHhGRjtcbiAgICAgIHNlZ21lbnRfbGVuZ3RoID0gMTtcblxuICAgIH0gZWxzZSBpZiAoYnl0ZTEgPT09IDB4RkYgJiYgYnl0ZTIgIT09IDApIHtcbiAgICAgIC8vIG1hcmtlclxuICAgICAgc2VnbWVudF9jb2RlID0gYnl0ZTI7XG4gICAgICBzZWdtZW50X2xlbmd0aCA9IDI7XG5cbiAgICAgIGlmICgoMHhEMCA8PSBzZWdtZW50X2NvZGUgJiYgc2VnbWVudF9jb2RlIDw9IDB4RDkpIHx8IHNlZ21lbnRfY29kZSA9PT0gMHgwMSkgOyBlbHNlIHtcbiAgICAgICAgaWYgKG9mZnNldCArIDMgPj0gbGVuZ3RoKSB0aHJvdyBlcnJvcignVW5leHBlY3RlZCBFT0YnLCAnRUJBRERBVEEnKTtcbiAgICAgICAgc2VnbWVudF9sZW5ndGggKz0ganBlZ19iaW5bb2Zmc2V0ICsgMl0gKiAweDEwMCArIGpwZWdfYmluW29mZnNldCArIDNdO1xuICAgICAgICBpZiAoc2VnbWVudF9sZW5ndGggPCAyKSB0aHJvdyBlcnJvcignSW52YWxpZCBzZWdtZW50IGxlbmd0aCcsICdFQkFEREFUQScpO1xuICAgICAgICBpZiAob2Zmc2V0ICsgc2VnbWVudF9sZW5ndGggLSAxID49IGxlbmd0aCkgdGhyb3cgZXJyb3IoJ1VuZXhwZWN0ZWQgRU9GJywgJ0VCQUREQVRBJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpbnNpZGVfc2Nhbikge1xuICAgICAgICBpZiAoc2VnbWVudF9jb2RlID49IDB4RDAgJiYgc2VnbWVudF9jb2RlIDw9IDB4RDcpIDsgZWxzZSB7XG4gICAgICAgICAgaW5zaWRlX3NjYW4gPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc2VnbWVudF9jb2RlID09PSAweERBIC8qIFNPUyAqLykgaW5zaWRlX3NjYW4gPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoaW5zaWRlX3NjYW4pIHtcbiAgICAgIC8vIGVudHJvcHktZW5jb2RlZCBzZWdtZW50XG4gICAgICBmb3IgKHZhciBwb3MgPSBvZmZzZXQgKyAxOyA7IHBvcysrKSB7XG4gICAgICAgIC8vIHNjYW4gdW50aWwgd2UgZmluZCBGRlxuICAgICAgICBpZiAocG9zID49IGxlbmd0aCkgdGhyb3cgZXJyb3IoJ1VuZXhwZWN0ZWQgRU9GJywgJ0VCQUREQVRBJyk7XG4gICAgICAgIGlmIChqcGVnX2Jpbltwb3NdID09PSAweEZGKSB7XG4gICAgICAgICAgaWYgKHBvcyArIDEgPj0gbGVuZ3RoKSB0aHJvdyBlcnJvcignVW5leHBlY3RlZCBFT0YnLCAnRUJBRERBVEEnKTtcbiAgICAgICAgICBpZiAoanBlZ19iaW5bcG9zICsgMV0gIT09IDApIHtcbiAgICAgICAgICAgIHNlZ21lbnRfY29kZSA9IDA7XG4gICAgICAgICAgICBzZWdtZW50X2xlbmd0aCA9IHBvcyAtIG9mZnNldDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBlcnJvcignVW5leHBlY3RlZCBieXRlIGF0IHNlZ21lbnQgc3RhcnQ6ICcgKyB0b19oZXgoYnl0ZTEpICtcbiAgICAgICAgJyAob2Zmc2V0ICcgKyB0b19oZXgob2Zmc2V0KSArICcpJywgJ0VCQUREQVRBJyk7XG4gICAgfVxuXG4gICAgaWYgKG9uX3NlZ21lbnQoeyBjb2RlOiBzZWdtZW50X2NvZGUsIG9mZnNldDogb2Zmc2V0LCBsZW5ndGg6IHNlZ21lbnRfbGVuZ3RoIH0pID09PSBmYWxzZSkgYnJlYWs7XG4gICAgaWYgKHNlZ21lbnRfY29kZSA9PT0gMHhEOSAvKiBFT0kgKi8pIGJyZWFrO1xuICAgIG9mZnNldCArPSBzZWdtZW50X2xlbmd0aDtcbiAgfVxufTtcblxuXG4vLyBSZXBsYWNlIG9yIHJlbW92ZSBzZWdtZW50cyBpbiB0aGUgZ2l2ZW4gSlBFRyBpbWFnZVxuLy9cbi8vIElucHV0OlxuLy8gIC0ganBlZ19iaW46ICAgVWludDhBcnJheSAtIGpwZWcgZmlsZVxuLy8gIC0gb25fc2VnbWVudDogRnVuY3Rpb24gLSBjYWxsYmFjayBleGVjdXRlZCBvbiBlYWNoIEpQRUcgbWFya2VyIHNlZ21lbnRcbi8vICAgIC0gc2VnbWVudDogIE9iamVjdFxuLy8gICAgICAtIGNvZGU6ICAgTnVtYmVyIC0gbWFya2VyIHR5cGUgKDJuZCBieXRlLCBlLmcuIDB4RTAgZm9yIEFQUDApXG4vLyAgICAgIC0gb2Zmc2V0OiBOdW1iZXIgLSBvZmZzZXQgb2YgdGhlIGZpcnN0IGJ5dGUgKDB4RkYpIHJlbGF0aXZlIHRvIGBqcGVnX2JpbmAgc3RhcnRcbi8vICAgICAgLSBsZW5ndGg6IE51bWJlciAtIGxlbmd0aCBvZiB0aGUgZW50aXJlIG1hcmtlciBzZWdtZW50IGluY2x1ZGluZyBmaXJzdCB0d28gYnl0ZXMgYW5kIGxlbmd0aFxuLy8gICAgICAgIC0gMiBmb3Igc3RhbmRhbG9uZSBtYXJrZXJzXG4vLyAgICAgICAgLSA0K2xlbmd0aCBmb3IgbWFya2VycyB3aXRoIGRhdGFcbi8vXG4vLyBgb25fc2VnbWVudGAgZnVuY3Rpb24gc2hvdWxkIHJldHVybiBvbmUgb2YgdGhlIGZvbGxvd2luZzpcbi8vICAtIGBmYWxzZWAgICAgICAgIC0gc2VnbWVudCBpcyByZW1vdmVkIGZyb20gdGhlIG91dHB1dFxuLy8gIC0gVWludDhBcnJheSAgICAgLSBzZWdtZW50IGlzIHJlcGxhY2VkIHdpdGggdGhlIG5ldyBkYXRhXG4vLyAgLSBbIFVpbnQ4QXJyYXkgXSAtIHNlZ21lbnQgaXMgcmVwbGFjZWQgd2l0aCB0aGUgbmV3IGRhdGFcbi8vICAtIGFueXRoaW5nIGVsc2UgIC0gc2VnbWVudCBpcyBjb3BpZWQgdG8gdGhlIG91dHB1dCBhcyBpc1xuLy9cbi8vIEFueSBkYXRhIGFmdGVyIGBFT0lgICgweEZGRDkpIG1hcmtlciBpcyByZW1vdmVkLlxuLy9cbm1vZHVsZS5leHBvcnRzLmpwZWdfc2VnbWVudHNfZmlsdGVyID0gZnVuY3Rpb24gKGpwZWdfYmluLCBvbl9zZWdtZW50KSB7XG4gIGlmICghaXNfdWludDhhcnJheShqcGVnX2JpbikpIHtcbiAgICB0aHJvdyBlcnJvcignSW52YWxpZCBhcmd1bWVudCAoanBlZ19iaW4pLCBVaW50OEFycmF5IGV4cGVjdGVkJywgJ0VJTlZBTCcpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvbl9zZWdtZW50ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgZXJyb3IoJ0ludmFsaWQgYXJndW1lbnQgKG9uX3NlZ21lbnQpLCBGdW5jdGlvbiBleHBlY3RlZCcsICdFSU5WQUwnKTtcbiAgfVxuXG4gIHZhciByYW5nZXMgPSBbXTtcbiAgdmFyIG91dF9sZW5ndGggPSAwO1xuXG4gIG1vZHVsZS5leHBvcnRzLmpwZWdfc2VnbWVudHNfZWFjaChqcGVnX2JpbiwgZnVuY3Rpb24gKHNlZ21lbnQpIHtcbiAgICB2YXIgbmV3X3NlZ21lbnQgPSBvbl9zZWdtZW50KHNlZ21lbnQpO1xuXG4gICAgaWYgKGlzX3VpbnQ4YXJyYXkobmV3X3NlZ21lbnQpKSB7XG4gICAgICByYW5nZXMucHVzaCh7IGRhdGE6IG5ld19zZWdtZW50IH0pO1xuICAgICAgb3V0X2xlbmd0aCArPSBuZXdfc2VnbWVudC5sZW5ndGg7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG5ld19zZWdtZW50KSkge1xuICAgICAgbmV3X3NlZ21lbnQuZmlsdGVyKGlzX3VpbnQ4YXJyYXkpLmZvckVhY2goZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgcmFuZ2VzLnB1c2goeyBkYXRhOiBzIH0pO1xuICAgICAgICBvdXRfbGVuZ3RoICs9IHMubGVuZ3RoO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChuZXdfc2VnbWVudCAhPT0gZmFsc2UpIHtcbiAgICAgIHZhciBuZXdfcmFuZ2UgPSB7IHN0YXJ0OiBzZWdtZW50Lm9mZnNldCwgZW5kOiBzZWdtZW50Lm9mZnNldCArIHNlZ21lbnQubGVuZ3RoIH07XG5cbiAgICAgIGlmIChyYW5nZXMubGVuZ3RoID4gMCAmJiByYW5nZXNbcmFuZ2VzLmxlbmd0aCAtIDFdLmVuZCA9PT0gbmV3X3JhbmdlLnN0YXJ0KSB7XG4gICAgICAgIHJhbmdlc1tyYW5nZXMubGVuZ3RoIC0gMV0uZW5kID0gbmV3X3JhbmdlLmVuZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJhbmdlcy5wdXNoKG5ld19yYW5nZSk7XG4gICAgICB9XG5cbiAgICAgIG91dF9sZW5ndGggKz0gc2VnbWVudC5sZW5ndGg7XG4gICAgfVxuICB9KTtcblxuICB2YXIgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkob3V0X2xlbmd0aCk7XG4gIHZhciBvZmZzZXQgPSAwO1xuXG4gIHJhbmdlcy5mb3JFYWNoKGZ1bmN0aW9uIChyYW5nZSkge1xuICAgIHZhciBkYXRhID0gcmFuZ2UuZGF0YSB8fCBqcGVnX2Jpbi5zdWJhcnJheShyYW5nZS5zdGFydCwgcmFuZ2UuZW5kKTtcbiAgICByZXN1bHQuc2V0KGRhdGEsIG9mZnNldCk7XG4gICAgb2Zmc2V0ICs9IGRhdGEubGVuZ3RoO1xuICB9KTtcblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuXG4vLyBDYWxsIGFuIGl0ZXJhdG9yIG9uIGVhY2ggRXhpZiBlbnRyeSBpbiB0aGUgZ2l2ZW4gSlBFRyBpbWFnZVxuLy9cbi8vIElucHV0OlxuLy8gIC0ganBlZ19iaW46IFVpbnQ4QXJyYXkgLSBqcGVnIGZpbGVcbi8vICAtIG9uX2VudHJ5OiBGdW5jdGlvbiAtIGNhbGxiYWNrIGV4ZWN1dGVkIG9uIGVhY2ggRXhpZiBlbnRyeVxuLy8gICAgLSBlbnRyeTogIE9iamVjdFxuLy8gICAgICAtIGlzX2JpZ19lbmRpYW46ICBCb29sZWFuIC0gd2hldGhlciBFeGlmIHVzZXMgYmlnIG9yIGxpdHRsZSBlbmRpYW4gYnl0ZSBhbGlnbm1lbnRcbi8vICAgICAgLSBpZmQ6ICAgICAgICAgICAgTnVtYmVyICAtIElGRCBpZGVudGlmaWVyICgwIGZvciBJRkQwLCAxIGZvciBJRkQxLCAweDg3NjkgZm9yIFN1YklGRCxcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODI1IGZvciBHUFMgSW5mbywgMHhBMDA1IGZvciBJbnRlcm9wIElGRClcbi8vICAgICAgLSB0YWc6ICAgICAgICAgICAgTnVtYmVyICAtIGV4aWYgZW50cnkgdGFnICgweDAxMTAgLSBjYW1lcmEgbmFtZSwgMHgwMTEyIC0gb3JpZW50YXRpb24sIGV0Yy4gLSBzZWUgRXhpZiBzcGVjKVxuLy8gICAgICAtIGZvcm1hdDogICAgICAgICBOdW1iZXIgIC0gZXhpZiBlbnRyeSBmb3JtYXQgKDEgLSBieXRlLCAyIC0gYXNjaWksIDMgLSBzaG9ydCwgZXRjLiAtIHNlZSBFeGlmIHNwZWMpXG4vLyAgICAgIC0gY291bnQ6ICAgICAgICAgIE51bWJlciAgLSBudW1iZXIgb2YgY29tcG9uZW50cyBvZiB0aGUgZ2l2ZW4gZm9ybWF0IGluc2lkZSBkYXRhXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1c3VhbGx5IDEsIG9yIHN0cmluZyBsZW5ndGggZm9yIGFzY2lpIGZvcm1hdClcbi8vICAgICAgLSBlbnRyeV9vZmZzZXQ6ICAgTnVtYmVyICAtIHN0YXJ0IG9mIEV4aWYgZW50cnkgKGVudHJ5IGxlbmd0aCBpcyBhbHdheXMgMTIsIHNvIG5vdCBpbmNsdWRlZClcbi8vICAgICAgLSBkYXRhX29mZnNldDogICAgTnVtYmVyICAtIHN0YXJ0IG9mIGRhdGEgYXR0YWNoZWQgdG8gRXhpZiBlbnRyeSAod2lsbCBvdmVybGFwIHdpdGggZW50cnkgaWYgbGVuZ3RoIDw9IDQpXG4vLyAgICAgIC0gZGF0YV9sZW5ndGg6ICAgIE51bWJlciAgLSBsZW5ndGggb2YgZGF0YSBhdHRhY2hlZCB0byBFeGlmIGVudHJ5XG4vLyAgICAgIC0gdmFsdWU6ICAgICAgICAgIEFycmF5fFN0cmluZ3xOdWxsIC0gb3VyIGJlc3QgYXR0ZW1wdCBhdCBwYXJzaW5nIGRhdGEgKG5vdCBhbGwgZm9ybWF0cyBzdXBwb3J0ZWQgcmlnaHQgbm93KVxuLy8gICAgICAtIGlzX3N1YmlmZF9saW5rOiBCb29sZWFuIC0gd2hldGhlciB0aGlzIGVudHJ5IGlzIHJlY29nbml6ZWQgdG8gYmUgYSBsaW5rIHRvIHN1YmlmZCAoY2FuJ3QgZmlsdGVyIHRoZXNlIG91dClcbi8vXG4vLyBJdGVyYXRpb24gc3RvcHMgZWFybHkgaWYgaXRlcmF0b3IgcmV0dXJucyBgZmFsc2VgLlxuLy9cbi8vIElmIEV4aWYgd2Fzbid0IGZvdW5kIGFueXdoZXJlIChiZWZvcmUgc3RhcnQgb2YgdGhlIGltYWdlIGRhdGEsIFNPUyksXG4vLyBpdGVyYXRvciBpcyBuZXZlciBleGVjdXRlZC5cbi8vXG5tb2R1bGUuZXhwb3J0cy5qcGVnX2V4aWZfdGFnc19lYWNoID0gZnVuY3Rpb24gKGpwZWdfYmluLCBvbl9leGlmX2VudHJ5KSB7XG4gIGlmICghaXNfdWludDhhcnJheShqcGVnX2JpbikpIHtcbiAgICB0aHJvdyBlcnJvcignSW52YWxpZCBhcmd1bWVudCAoanBlZ19iaW4pLCBVaW50OEFycmF5IGV4cGVjdGVkJywgJ0VJTlZBTCcpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvbl9leGlmX2VudHJ5ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgZXJyb3IoJ0ludmFsaWQgYXJndW1lbnQgKG9uX2V4aWZfZW50cnkpLCBGdW5jdGlvbiBleHBlY3RlZCcsICdFSU5WQUwnKTtcbiAgfVxuXG4gIC8qIGVzbGludC1kaXNhYmxlIGNvbnNpc3RlbnQtcmV0dXJuICovXG4gIG1vZHVsZS5leHBvcnRzLmpwZWdfc2VnbWVudHNfZWFjaChqcGVnX2JpbiwgZnVuY3Rpb24gKHNlZ21lbnQpIHtcbiAgICBpZiAoc2VnbWVudC5jb2RlID09PSAweERBIC8qIFNPUyAqLykgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gbG9vayBmb3IgQVBQMSBzZWdtZW50IGFuZCBjb21wYXJlIGhlYWRlciB3aXRoICdFeGlmXFwwXFwwJ1xuICAgIGlmIChzZWdtZW50LmNvZGUgPT09IDB4RTEgJiYgc2VnbWVudC5sZW5ndGggPj0gMTAgJiZcbiAgICAgICAganBlZ19iaW5bc2VnbWVudC5vZmZzZXQgKyA0XSA9PT0gMHg0NSAmJiBqcGVnX2JpbltzZWdtZW50Lm9mZnNldCArIDVdID09PSAweDc4ICYmXG4gICAgICAgIGpwZWdfYmluW3NlZ21lbnQub2Zmc2V0ICsgNl0gPT09IDB4NjkgJiYganBlZ19iaW5bc2VnbWVudC5vZmZzZXQgKyA3XSA9PT0gMHg2NiAmJlxuICAgICAgICBqcGVnX2JpbltzZWdtZW50Lm9mZnNldCArIDhdID09PSAweDAwICYmIGpwZWdfYmluW3NlZ21lbnQub2Zmc2V0ICsgOV0gPT09IDB4MDApIHtcblxuICAgICAgbmV3IEV4aWZQYXJzZXIoanBlZ19iaW4sIHNlZ21lbnQub2Zmc2V0ICsgMTAsIHNlZ21lbnQub2Zmc2V0ICsgc2VnbWVudC5sZW5ndGgpLmVhY2gob25fZXhpZl9lbnRyeSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9KTtcbn07XG5cblxuLy8gUmVtb3ZlIEV4aWYgZW50cmllcyBpbiB0aGUgZ2l2ZW4gSlBFRyBpbWFnZVxuLy9cbi8vIElucHV0OlxuLy8gIC0ganBlZ19iaW46IFVpbnQ4QXJyYXkgLSBqcGVnIGZpbGVcbi8vICAtIG9uX2VudHJ5OiBGdW5jdGlvbiAtIGNhbGxiYWNrIGV4ZWN1dGVkIG9uIGVhY2ggRXhpZiBlbnRyeVxuLy8gICAgLSBlbnRyeTogIE9iamVjdFxuLy8gICAgICAtIGlzX2JpZ19lbmRpYW46ICBCb29sZWFuIC0gd2hldGhlciBFeGlmIHVzZXMgYmlnIG9yIGxpdHRsZSBlbmRpYW4gYnl0ZSBhbGlnbm1lbnRcbi8vICAgICAgLSBpZmQ6ICAgICAgICAgICAgTnVtYmVyICAtIElGRCBpZGVudGlmaWVyICgwIGZvciBJRkQwLCAxIGZvciBJRkQxLCAweDg3NjkgZm9yIFN1YklGRCxcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODgyNSBmb3IgR1BTIEluZm8sIDB4QTAwNSBmb3IgSW50ZXJvcCBJRkQpXG4vLyAgICAgIC0gdGFnOiAgICAgICAgICAgIE51bWJlciAgLSBleGlmIGVudHJ5IHRhZyAoMHgwMTEwIC0gY2FtZXJhIG5hbWUsIDB4MDExMiAtIG9yaWVudGF0aW9uLCBldGMuIC0gc2VlIEV4aWYgc3BlYylcbi8vICAgICAgLSBmb3JtYXQ6ICAgICAgICAgTnVtYmVyICAtIGV4aWYgZW50cnkgZm9ybWF0ICgxIC0gYnl0ZSwgMiAtIGFzY2lpLCAzIC0gc2hvcnQsIGV0Yy4gLSBzZWUgRXhpZiBzcGVjKVxuLy8gICAgICAtIGNvdW50OiAgICAgICAgICBOdW1iZXIgIC0gbnVtYmVyIG9mIGNvbXBvbmVudHMgb2YgdGhlIGdpdmVuIGZvcm1hdCBpbnNpZGUgZGF0YVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVzdWFsbHkgMSwgb3Igc3RyaW5nIGxlbmd0aCBmb3IgYXNjaWkgZm9ybWF0KVxuLy8gICAgICAtIGVudHJ5X29mZnNldDogICBOdW1iZXIgIC0gc3RhcnQgb2YgRXhpZiBlbnRyeSAoZW50cnkgbGVuZ3RoIGlzIGFsd2F5cyAxMiwgc28gbm90IGluY2x1ZGVkKVxuLy8gICAgICAtIGRhdGFfb2Zmc2V0OiAgICBOdW1iZXIgIC0gc3RhcnQgb2YgZGF0YSBhdHRhY2hlZCB0byBFeGlmIGVudHJ5ICh3aWxsIG92ZXJsYXAgd2l0aCBlbnRyeSBpZiBsZW5ndGggPD0gNClcbi8vICAgICAgLSBkYXRhX2xlbmd0aDogICAgTnVtYmVyICAtIGxlbmd0aCBvZiBkYXRhIGF0dGFjaGVkIHRvIEV4aWYgZW50cnlcbi8vICAgICAgLSB2YWx1ZTogICAgICAgICAgQXJyYXl8U3RyaW5nfE51bGwgLSBvdXIgYmVzdCBhdHRlbXB0IGF0IHBhcnNpbmcgZGF0YSAobm90IGFsbCBmb3JtYXRzIHN1cHBvcnRlZCByaWdodCBub3cpXG4vLyAgICAgIC0gaXNfc3ViaWZkX2xpbms6IEJvb2xlYW4gLSB3aGV0aGVyIHRoaXMgZW50cnkgaXMgcmVjb2duaXplZCB0byBiZSBhIGxpbmsgdG8gc3ViaWZkIChjYW4ndCBmaWx0ZXIgdGhlc2Ugb3V0KVxuLy9cbi8vIFRoaXMgZnVuY3Rpb24gcmVtb3ZlcyBmb2xsb3dpbmcgZnJvbSBFeGlmOlxuLy8gIC0gYWxsIGVudHJpZXMgd2hlcmUgaXRlcmF0b3IgcmV0dXJuZWQgZmFsc2UgKGV4Y2VwdCBzdWJpZmQgbGlua3Mgd2hpY2ggYXJlIG1hbmRhdG9yeSlcbi8vICAtIElGRDEgYW5kIHRodW1ibmFpbCBpbWFnZSAodGhlIHB1cnBvc2Ugb2YgdGhpcyBmdW5jdGlvbiBpcyB0byByZWR1Y2UgZmlsZSBzaXplLFxuLy8gICAgc28gdGh1bWJuYWlsIGlzIHVzdWFsbHkgdGhlIGZpcnN0IHRoaW5nIHRvIGdvKVxuLy8gIC0gYWxsIG90aGVyIGRhdGEgdGhhdCBpc24ndCBpbiBJRkQwLCBTdWJJRkQsIEdQU0lGRCwgSW50ZXJvcElGRFxuLy8gICAgKHRoZW9yZXRpY2FsbHkgcG9zc2libGUgcHJvcHJpZXRhcnkgZXh0ZW5zaW9ucywgSSBoYXZlbid0IHNlZW4gYW55IG9mIHRoZXNlIHlldClcbi8vXG4vLyBDaGFuZ2luZyBkYXRhIGluc2lkZSBFeGlmIGVudHJpZXMgaXMgTk9UIHN1cHBvcnRlZCB5ZXQgKG1vZGlmeWluZyBgZW50cnlgIG9iamVjdCBpbnNpZGUgY2FsbGJhY2sgbWF5IGJyZWFrIHN0dWZmKS5cbi8vXG4vLyBJZiBFeGlmIHdhc24ndCBmb3VuZCBhbnl3aGVyZSAoYmVmb3JlIHN0YXJ0IG9mIHRoZSBpbWFnZSBkYXRhLCBTT1MpLFxuLy8gaXRlcmF0b3IgaXMgbmV2ZXIgZXhlY3V0ZWQsIGFuZCBvcmlnaW5hbCBKUEVHIGlzIHJldHVybmVkIGFzIGlzLlxuLy9cbm1vZHVsZS5leHBvcnRzLmpwZWdfZXhpZl90YWdzX2ZpbHRlciA9IGZ1bmN0aW9uIChqcGVnX2Jpbiwgb25fZXhpZl9lbnRyeSkge1xuICBpZiAoIWlzX3VpbnQ4YXJyYXkoanBlZ19iaW4pKSB7XG4gICAgdGhyb3cgZXJyb3IoJ0ludmFsaWQgYXJndW1lbnQgKGpwZWdfYmluKSwgVWludDhBcnJheSBleHBlY3RlZCcsICdFSU5WQUwnKTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb25fZXhpZl9lbnRyeSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IGVycm9yKCdJbnZhbGlkIGFyZ3VtZW50IChvbl9leGlmX2VudHJ5KSwgRnVuY3Rpb24gZXhwZWN0ZWQnLCAnRUlOVkFMJyk7XG4gIH1cblxuICB2YXIgc3RvcF9zZWFyY2ggPSBmYWxzZTtcblxuICByZXR1cm4gbW9kdWxlLmV4cG9ydHMuanBlZ19zZWdtZW50c19maWx0ZXIoanBlZ19iaW4sIGZ1bmN0aW9uIChzZWdtZW50KSB7XG4gICAgaWYgKHN0b3Bfc2VhcmNoKSByZXR1cm47XG4gICAgaWYgKHNlZ21lbnQuY29kZSA9PT0gMHhEQSAvKiBTT1MgKi8pIHN0b3Bfc2VhcmNoID0gdHJ1ZTtcblxuICAgIC8vIGxvb2sgZm9yIEFQUDEgc2VnbWVudCBhbmQgY29tcGFyZSBoZWFkZXIgd2l0aCAnRXhpZlxcMFxcMCdcbiAgICBpZiAoc2VnbWVudC5jb2RlID09PSAweEUxICYmIHNlZ21lbnQubGVuZ3RoID49IDEwICYmXG4gICAgICAgIGpwZWdfYmluW3NlZ21lbnQub2Zmc2V0ICsgNF0gPT09IDB4NDUgJiYganBlZ19iaW5bc2VnbWVudC5vZmZzZXQgKyA1XSA9PT0gMHg3OCAmJlxuICAgICAgICBqcGVnX2JpbltzZWdtZW50Lm9mZnNldCArIDZdID09PSAweDY5ICYmIGpwZWdfYmluW3NlZ21lbnQub2Zmc2V0ICsgN10gPT09IDB4NjYgJiZcbiAgICAgICAganBlZ19iaW5bc2VnbWVudC5vZmZzZXQgKyA4XSA9PT0gMHgwMCAmJiBqcGVnX2JpbltzZWdtZW50Lm9mZnNldCArIDldID09PSAweDAwKSB7XG5cbiAgICAgIHZhciBuZXdfZXhpZiA9IG5ldyBFeGlmUGFyc2VyKGpwZWdfYmluLCBzZWdtZW50Lm9mZnNldCArIDEwLCBzZWdtZW50Lm9mZnNldCArIHNlZ21lbnQubGVuZ3RoKVxuICAgICAgICAuZmlsdGVyKG9uX2V4aWZfZW50cnkpO1xuICAgICAgaWYgKCFuZXdfZXhpZikgcmV0dXJuIGZhbHNlO1xuXG4gICAgICB2YXIgaGVhZGVyID0gbmV3IFVpbnQ4QXJyYXkoMTApO1xuXG4gICAgICBoZWFkZXIuc2V0KGpwZWdfYmluLnNsaWNlKHNlZ21lbnQub2Zmc2V0LCBzZWdtZW50Lm9mZnNldCArIDEwKSk7XG4gICAgICBoZWFkZXJbMl0gPSAoKG5ld19leGlmLmxlbmd0aCArIDgpID4+PiA4KSAmIDB4RkY7XG4gICAgICBoZWFkZXJbM10gPSAobmV3X2V4aWYubGVuZ3RoICsgOCkgJiAweEZGO1xuXG4gICAgICBzdG9wX3NlYXJjaCA9IHRydWU7XG4gICAgICByZXR1cm4gWyBoZWFkZXIsIG5ld19leGlmIF07XG4gICAgfVxuICB9KTtcbn07XG5cblxuLy8gSW5zZXJ0cyBhIGN1c3RvbSBjb21tZW50IG1hcmtlciBzZWdtZW50IGludG8gSlBFRyBmaWxlLlxuLy9cbi8vIElucHV0OlxuLy8gIC0ganBlZ19iaW46IFVpbnQ4QXJyYXkgLSBqcGVnIGZpbGVcbi8vICAtIGNvbW1lbnQ6ICBTdHJpbmdcbi8vXG4vLyBDb21tZW50IGlzIGluc2VydGVkIGFmdGVyIGZpcnN0IHR3byBieXRlcyAoRkZEOCwgU09JKS5cbi8vXG4vLyBJZiBKRklGIChBUFAwKSBtYXJrZXIgZXhpc3RzIGltbWVkaWF0ZWx5IGFmdGVyIFNPSSAoYXMgbWFuZGF0ZWQgYnkgdGhlIEpGSUZcbi8vIHNwZWMpLCB3ZSBpbnNlcnQgY29tbWVudCBhZnRlciBpdCBpbnN0ZWFkLlxuLy9cbm1vZHVsZS5leHBvcnRzLmpwZWdfYWRkX2NvbW1lbnQgPSBmdW5jdGlvbiAoanBlZ19iaW4sIGNvbW1lbnQpIHtcbiAgdmFyIGNvbW1lbnRfaW5zZXJ0ZWQgPSBmYWxzZSwgc2VnbWVudF9jb3VudCA9IDA7XG5cbiAgcmV0dXJuIG1vZHVsZS5leHBvcnRzLmpwZWdfc2VnbWVudHNfZmlsdGVyKGpwZWdfYmluLCBmdW5jdGlvbiAoc2VnbWVudCkge1xuICAgIHNlZ21lbnRfY291bnQrKztcbiAgICBpZiAoc2VnbWVudF9jb3VudCA9PT0gMSAmJiBzZWdtZW50LmNvZGUgPT09IDB4RDggLyogU09JICAqLykgcmV0dXJuO1xuICAgIGlmIChzZWdtZW50X2NvdW50ID09PSAyICYmIHNlZ21lbnQuY29kZSA9PT0gMHhFMCAvKiBBUFAwICovKSByZXR1cm47XG5cbiAgICBpZiAoY29tbWVudF9pbnNlcnRlZCkgcmV0dXJuO1xuICAgIGNvbW1lbnQgPSB1dGY4X2VuY29kZShjb21tZW50KTtcblxuICAgIC8vIGNvbW1lbnQgc2VnbWVudFxuICAgIHZhciBjc2VnbWVudCA9IG5ldyBVaW50OEFycmF5KDUgKyBjb21tZW50Lmxlbmd0aCk7XG4gICAgdmFyIG9mZnNldCA9IDA7XG5cbiAgICBjc2VnbWVudFtvZmZzZXQrK10gPSAweEZGO1xuICAgIGNzZWdtZW50W29mZnNldCsrXSA9IDB4RkU7XG4gICAgY3NlZ21lbnRbb2Zmc2V0KytdID0gKChjb21tZW50Lmxlbmd0aCArIDMpID4+PiA4KSAmIDB4RkY7XG4gICAgY3NlZ21lbnRbb2Zmc2V0KytdID0gKGNvbW1lbnQubGVuZ3RoICsgMykgJiAweEZGO1xuXG4gICAgY29tbWVudC5zcGxpdCgnJykuZm9yRWFjaChmdW5jdGlvbiAoYykge1xuICAgICAgY3NlZ21lbnRbb2Zmc2V0KytdID0gYy5jaGFyQ29kZUF0KDApICYgMHhGRjtcbiAgICB9KTtcblxuICAgIGNzZWdtZW50W29mZnNldCsrXSA9IDA7XG4gICAgY29tbWVudF9pbnNlcnRlZCA9IHRydWU7XG5cbiAgICByZXR1cm4gWyBjc2VnbWVudCwganBlZ19iaW4uc3ViYXJyYXkoc2VnbWVudC5vZmZzZXQsIHNlZ21lbnQub2Zmc2V0ICsgc2VnbWVudC5sZW5ndGgpIF07XG4gIH0pO1xufTtcbn0pO1xuXG5mdW5jdGlvbiBqcGVnX3BhdGNoX2V4aWYoZW52KSB7XG4gIHJldHVybiB0aGlzLl9nZXRVaW50OEFycmF5KGVudi5ibG9iKS50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgZW52LmlzX2pwZWcgPSBpbWFnZV90cmF2ZXJzZS5pc19qcGVnKGRhdGEpO1xuXG4gICAgaWYgKCFlbnYuaXNfanBlZykgcmV0dXJuIFByb21pc2UucmVzb2x2ZShlbnYpO1xuXG4gICAgZW52Lm9yaWdfYmxvYiA9IGVudi5ibG9iO1xuXG4gICAgdHJ5IHtcbiAgICAgIHZhciBleGlmX2lzX2JpZ19lbmRpYW4sIG9yaWVudGF0aW9uX29mZnNldDtcblxuICAgICAgLyogZXNsaW50LWRpc2FibGUgY29uc2lzdGVudC1yZXR1cm4gKi9cbiAgICAgIGltYWdlX3RyYXZlcnNlLmpwZWdfZXhpZl90YWdzX2VhY2goZGF0YSwgZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgICAgIGlmIChlbnRyeS5pZmQgPT09IDAgJiYgZW50cnkudGFnID09PSAweDExMiAmJiBBcnJheS5pc0FycmF5KGVudHJ5LnZhbHVlKSkge1xuICAgICAgICAgIGVudi5vcmllbnRhdGlvbiAgICA9IGVudHJ5LnZhbHVlWzBdIHx8IDE7XG4gICAgICAgICAgZXhpZl9pc19iaWdfZW5kaWFuID0gZW50cnkuaXNfYmlnX2VuZGlhbjtcbiAgICAgICAgICBvcmllbnRhdGlvbl9vZmZzZXQgPSBlbnRyeS5kYXRhX29mZnNldDtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAob3JpZW50YXRpb25fb2Zmc2V0KSB7XG4gICAgICAgIHZhciBvcmllbnRhdGlvbl9wYXRjaCA9IGV4aWZfaXNfYmlnX2VuZGlhbiA/XG4gICAgICAgICAgbmV3IFVpbnQ4QXJyYXkoWyAwLCAxIF0pIDpcbiAgICAgICAgICBuZXcgVWludDhBcnJheShbIDEsIDAgXSk7XG5cbiAgICAgICAgZW52LmJsb2IgPSBuZXcgQmxvYihbXG4gICAgICAgICAgZGF0YS5zbGljZSgwLCBvcmllbnRhdGlvbl9vZmZzZXQpLFxuICAgICAgICAgIG9yaWVudGF0aW9uX3BhdGNoLFxuICAgICAgICAgIGRhdGEuc2xpY2Uob3JpZW50YXRpb25fb2Zmc2V0ICsgMilcbiAgICAgICAgXSwgeyB0eXBlOiAnaW1hZ2UvanBlZycgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoXykge31cblxuICAgIHJldHVybiBlbnY7XG4gIH0pO1xufVxuXG5cbmZ1bmN0aW9uIGpwZWdfcm90YXRlX2NhbnZhcyhlbnYpIHtcbiAgaWYgKCFlbnYuaXNfanBlZykgcmV0dXJuIFByb21pc2UucmVzb2x2ZShlbnYpO1xuXG4gIHZhciBvcmllbnRhdGlvbiA9IGVudi5vcmllbnRhdGlvbiAtIDE7XG4gIGlmICghb3JpZW50YXRpb24pIHJldHVybiBQcm9taXNlLnJlc29sdmUoZW52KTtcblxuICB2YXIgY2FudmFzO1xuXG4gIGlmIChvcmllbnRhdGlvbiAmIDQpIHtcbiAgICBjYW52YXMgPSB0aGlzLnBpY2Eub3B0aW9ucy5jcmVhdGVDYW52YXMoZW52Lm91dF9jYW52YXMuaGVpZ2h0LCBlbnYub3V0X2NhbnZhcy53aWR0aCk7XG4gIH0gZWxzZSB7XG4gICAgY2FudmFzID0gdGhpcy5waWNhLm9wdGlvbnMuY3JlYXRlQ2FudmFzKGVudi5vdXRfY2FudmFzLndpZHRoLCBlbnYub3V0X2NhbnZhcy5oZWlnaHQpO1xuICB9XG5cbiAgdmFyIGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuXG4gIGN0eC5zYXZlKCk7XG5cbiAgaWYgKG9yaWVudGF0aW9uICYgMSkgY3R4LnRyYW5zZm9ybSgtMSwgMCwgMCwgMSwgY2FudmFzLndpZHRoLCAwKTtcbiAgaWYgKG9yaWVudGF0aW9uICYgMikgY3R4LnRyYW5zZm9ybSgtMSwgMCwgMCwgLTEsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7XG4gIGlmIChvcmllbnRhdGlvbiAmIDQpIGN0eC50cmFuc2Zvcm0oMCwgMSwgMSwgMCwgMCwgMCk7XG5cbiAgY3R4LmRyYXdJbWFnZShlbnYub3V0X2NhbnZhcywgMCwgMCk7XG4gIGN0eC5yZXN0b3JlKCk7XG5cbiAgLy8gU2FmYXJpIDEyIHdvcmthcm91bmRcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVjYS9waWNhL2lzc3Vlcy8xOTlcbiAgZW52Lm91dF9jYW52YXMud2lkdGggPSBlbnYub3V0X2NhbnZhcy5oZWlnaHQgPSAwO1xuXG4gIGVudi5vdXRfY2FudmFzID0gY2FudmFzO1xuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUoZW52KTtcbn1cblxuXG5mdW5jdGlvbiBqcGVnX2F0dGFjaF9vcmlnX3NlZ21lbnRzKGVudikge1xuICBpZiAoIWVudi5pc19qcGVnKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGVudik7XG5cbiAgcmV0dXJuIFByb21pc2UuYWxsKFtcbiAgICB0aGlzLl9nZXRVaW50OEFycmF5KGVudi5ibG9iKSxcbiAgICB0aGlzLl9nZXRVaW50OEFycmF5KGVudi5vdXRfYmxvYilcbiAgXSkudGhlbihmdW5jdGlvbiAocmVzKSB7XG4gICAgdmFyIGRhdGEgPSByZXNbMF07XG4gICAgdmFyIGRhdGFfb3V0ID0gcmVzWzFdO1xuXG4gICAgaWYgKCFpbWFnZV90cmF2ZXJzZS5pc19qcGVnKGRhdGEpKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGVudik7XG5cbiAgICB2YXIgc2VnbWVudHMgPSBbXTtcblxuICAgIGltYWdlX3RyYXZlcnNlLmpwZWdfc2VnbWVudHNfZWFjaChkYXRhLCBmdW5jdGlvbiAoc2VnbWVudCkge1xuICAgICAgaWYgKHNlZ21lbnQuY29kZSA9PT0gMHhEQSAvKiBTT1MgKi8pIHJldHVybiBmYWxzZTtcbiAgICAgIHNlZ21lbnRzLnB1c2goc2VnbWVudCk7XG4gICAgfSk7XG5cbiAgICBzZWdtZW50cyA9IHNlZ21lbnRzXG4gICAgICAuZmlsdGVyKGZ1bmN0aW9uIChzZWdtZW50KSB7XG4gICAgICAgIC8vIERyb3AgSUNDX1BST0ZJTEVcbiAgICAgICAgLy9cbiAgICAgICAgaWYgKHNlZ21lbnQuY29kZSA9PT0gMHhFMikgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIC8vIEtlZXAgYWxsIEFQUG4gc2VnbWVudHMgZXhjbHVkaW5nIEFQUDIgKElDQ19QUk9GSUxFKSxcbiAgICAgICAgLy8gcmVtb3ZlIG90aGVycyBiZWNhdXNlIG1vc3Qgb2YgdGhlbSBkZXBlbmQgb24gaW1hZ2UgZGF0YSAoRENUIGFuZCBzdWNoKS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gQVBQMCAtIEpGSUYsIEFQUDEgLSBFeGlmLCB0aGUgcmVzdCBhcmUgcGhvdG9zaG9wIG1ldGFkYXRhIGFuZCBzdWNoXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFNlZSBmdWxsIGxpc3QgYXQgaHR0cHM6Ly93d3cudzMub3JnL0dyYXBoaWNzL0pQRUcvaXR1LXQ4MS5wZGYgKHRhYmxlIEIuMSBvbiBwYWdlIDMyKVxuICAgICAgICAvL1xuICAgICAgICBpZiAoc2VnbWVudC5jb2RlID49IDB4RTAgJiYgc2VnbWVudC5jb2RlIDwgMHhGMCkgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgLy8gS2VlcCBjb21tZW50c1xuICAgICAgICAvL1xuICAgICAgICBpZiAoc2VnbWVudC5jb2RlID09PSAweEZFKSByZXR1cm4gdHJ1ZTtcblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9KVxuICAgICAgLm1hcChmdW5jdGlvbiAoc2VnbWVudCkge1xuICAgICAgICByZXR1cm4gZGF0YS5zbGljZShzZWdtZW50Lm9mZnNldCwgc2VnbWVudC5vZmZzZXQgKyBzZWdtZW50Lmxlbmd0aCk7XG4gICAgICB9KTtcblxuICAgIGVudi5vdXRfYmxvYiA9IG5ldyBCbG9iKFxuICAgICAgLy8gaW50ZW50aW9uYWxseSBvbWl0dGluZyBleHBlY3RlZCBKRklGIHNlZ21lbnQgKG9mZnNldCAyIHRvIDIwKVxuICAgICAgWyBkYXRhX291dC5zbGljZSgwLCAyKSBdLmNvbmNhdChzZWdtZW50cykuY29uY2F0KFsgZGF0YV9vdXQuc2xpY2UoMjApIF0pLFxuICAgICAgeyB0eXBlOiAnaW1hZ2UvanBlZycgfVxuICAgICk7XG5cbiAgICByZXR1cm4gZW52O1xuICB9KTtcbn1cblxuXG5mdW5jdGlvbiBhc3NpZ24ocmVkdWNlcikge1xuICByZWR1Y2VyLmJlZm9yZSgnX2Jsb2JfdG9faW1hZ2UnLCBqcGVnX3BhdGNoX2V4aWYpO1xuICByZWR1Y2VyLmFmdGVyKCdfdHJhbnNmb3JtJywgICAgICBqcGVnX3JvdGF0ZV9jYW52YXMpO1xuICByZWR1Y2VyLmFmdGVyKCdfY3JlYXRlX2Jsb2InLCAgICBqcGVnX2F0dGFjaF9vcmlnX3NlZ21lbnRzKTtcbn1cblxuXG52YXIganBlZ19wYXRjaF9leGlmXzEgPSBqcGVnX3BhdGNoX2V4aWY7XG52YXIganBlZ19yb3RhdGVfY2FudmFzXzEgPSBqcGVnX3JvdGF0ZV9jYW52YXM7XG52YXIganBlZ19hdHRhY2hfb3JpZ19zZWdtZW50c18xID0ganBlZ19hdHRhY2hfb3JpZ19zZWdtZW50cztcbnZhciBhc3NpZ25fMSA9IGFzc2lnbjtcblxudmFyIGpwZWdfcGx1Z2lucyA9IHtcblx0anBlZ19wYXRjaF9leGlmOiBqcGVnX3BhdGNoX2V4aWZfMSxcblx0anBlZ19yb3RhdGVfY2FudmFzOiBqcGVnX3JvdGF0ZV9jYW52YXNfMSxcblx0anBlZ19hdHRhY2hfb3JpZ19zZWdtZW50czoganBlZ19hdHRhY2hfb3JpZ19zZWdtZW50c18xLFxuXHRhc3NpZ246IGFzc2lnbl8xXG59O1xuXG5mdW5jdGlvbiBJbWFnZUJsb2JSZWR1Y2Uob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgSW1hZ2VCbG9iUmVkdWNlKSkgcmV0dXJuIG5ldyBJbWFnZUJsb2JSZWR1Y2Uob3B0aW9ucyk7XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgdGhpcy5waWNhID0gb3B0aW9ucy5waWNhIHx8IHBpY2Eoe30pO1xuICB0aGlzLmluaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgdGhpcy51dGlscyA9IHV0aWxzO1xufVxuXG5cbkltYWdlQmxvYlJlZHVjZS5wcm90b3R5cGUudXNlID0gZnVuY3Rpb24gKHBsdWdpbiAvKiwgcGFyYW1zLCAuLi4gKi8pIHtcbiAgdmFyIGFyZ3MgPSBbIHRoaXMgXS5jb25jYXQoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7XG4gIHBsdWdpbi5hcHBseShwbHVnaW4sIGFyZ3MpO1xuICByZXR1cm4gdGhpcztcbn07XG5cblxuSW1hZ2VCbG9iUmVkdWNlLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLnVzZShqcGVnX3BsdWdpbnMuYXNzaWduKTtcbn07XG5cblxuSW1hZ2VCbG9iUmVkdWNlLnByb3RvdHlwZS50b0Jsb2IgPSBmdW5jdGlvbiAoYmxvYiwgb3B0aW9ucykge1xuICB2YXIgb3B0cyA9IHV0aWxzLmFzc2lnbih7IG1heDogSW5maW5pdHkgfSwgb3B0aW9ucyk7XG4gIHZhciBlbnYgPSB7XG4gICAgYmxvYjogYmxvYixcbiAgICBvcHRzOiBvcHRzXG4gIH07XG5cbiAgaWYgKCF0aGlzLmluaXRpYWxpemVkKSB7XG4gICAgdGhpcy5pbml0KCk7XG4gICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG4gIH1cblxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGVudilcbiAgICAudGhlbih0aGlzLl9ibG9iX3RvX2ltYWdlKVxuICAgIC50aGVuKHRoaXMuX2NhbGN1bGF0ZV9zaXplKVxuICAgIC50aGVuKHRoaXMuX3RyYW5zZm9ybSlcbiAgICAudGhlbih0aGlzLl9jbGVhbnVwKVxuICAgIC50aGVuKHRoaXMuX2NyZWF0ZV9ibG9iKVxuICAgIC50aGVuKGZ1bmN0aW9uIChfZW52KSB7XG4gICAgICAvLyBTYWZhcmkgMTIgd29ya2Fyb3VuZFxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVjYS9waWNhL2lzc3Vlcy8xOTlcbiAgICAgIF9lbnYub3V0X2NhbnZhcy53aWR0aCA9IF9lbnYub3V0X2NhbnZhcy5oZWlnaHQgPSAwO1xuXG4gICAgICByZXR1cm4gX2Vudi5vdXRfYmxvYjtcbiAgICB9KTtcbn07XG5cblxuSW1hZ2VCbG9iUmVkdWNlLnByb3RvdHlwZS50b0NhbnZhcyA9IGZ1bmN0aW9uIChibG9iLCBvcHRpb25zKSB7XG4gIHZhciBvcHRzID0gdXRpbHMuYXNzaWduKHsgbWF4OiBJbmZpbml0eSB9LCBvcHRpb25zKTtcbiAgdmFyIGVudiA9IHtcbiAgICBibG9iOiBibG9iLFxuICAgIG9wdHM6IG9wdHNcbiAgfTtcblxuICBpZiAoIXRoaXMuaW5pdGlhbGl6ZWQpIHtcbiAgICB0aGlzLmluaXQoKTtcbiAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUoZW52KVxuICAgIC50aGVuKHRoaXMuX2Jsb2JfdG9faW1hZ2UpXG4gICAgLnRoZW4odGhpcy5fY2FsY3VsYXRlX3NpemUpXG4gICAgLnRoZW4odGhpcy5fdHJhbnNmb3JtKVxuICAgIC50aGVuKHRoaXMuX2NsZWFudXApXG4gICAgLnRoZW4oZnVuY3Rpb24gKF9lbnYpIHsgcmV0dXJuIF9lbnYub3V0X2NhbnZhczsgfSk7XG59O1xuXG5cbkltYWdlQmxvYlJlZHVjZS5wcm90b3R5cGUuYmVmb3JlID0gZnVuY3Rpb24gKG1ldGhvZF9uYW1lLCBmbikge1xuICBpZiAoIXRoaXNbbWV0aG9kX25hbWVdKSB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBcIicgKyBtZXRob2RfbmFtZSArICdcIiBkb2VzIG5vdCBleGlzdCcpO1xuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnQgXCJmblwiLCBmdW5jdGlvbiBleHBlY3RlZCcpO1xuXG4gIHZhciBvbGRfZm4gPSB0aGlzW21ldGhvZF9uYW1lXTtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gIHRoaXNbbWV0aG9kX25hbWVdID0gZnVuY3Rpb24gKGVudikge1xuICAgIHJldHVybiBmbi5jYWxsKHNlbGYsIGVudikudGhlbihmdW5jdGlvbiAoX2Vudikge1xuICAgICAgcmV0dXJuIG9sZF9mbi5jYWxsKHNlbGYsIF9lbnYpO1xuICAgIH0pO1xuICB9O1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuXG5JbWFnZUJsb2JSZWR1Y2UucHJvdG90eXBlLmFmdGVyID0gZnVuY3Rpb24gKG1ldGhvZF9uYW1lLCBmbikge1xuICBpZiAoIXRoaXNbbWV0aG9kX25hbWVdKSB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBcIicgKyBtZXRob2RfbmFtZSArICdcIiBkb2VzIG5vdCBleGlzdCcpO1xuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnQgXCJmblwiLCBmdW5jdGlvbiBleHBlY3RlZCcpO1xuXG4gIHZhciBvbGRfZm4gPSB0aGlzW21ldGhvZF9uYW1lXTtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gIHRoaXNbbWV0aG9kX25hbWVdID0gZnVuY3Rpb24gKGVudikge1xuICAgIHJldHVybiBvbGRfZm4uY2FsbChzZWxmLCBlbnYpLnRoZW4oZnVuY3Rpb24gKF9lbnYpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHNlbGYsIF9lbnYpO1xuICAgIH0pO1xuICB9O1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuXG5JbWFnZUJsb2JSZWR1Y2UucHJvdG90eXBlLl9ibG9iX3RvX2ltYWdlID0gZnVuY3Rpb24gKGVudikge1xuICB2YXIgVVJMID0gd2luZG93LlVSTCB8fCB3aW5kb3cud2Via2l0VVJMIHx8IHdpbmRvdy5tb3pVUkwgfHwgd2luZG93Lm1zVVJMO1xuXG4gIGVudi5pbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO1xuICBlbnYuaW1hZ2VfdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChlbnYuYmxvYik7XG4gIGVudi5pbWFnZS5zcmMgPSBlbnYuaW1hZ2VfdXJsO1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgZW52LmltYWdlLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7IHJlamVjdChuZXcgRXJyb3IoJ0ltYWdlQmxvYlJlZHVjZTogZmFpbGVkIHRvIGNyZWF0ZSBJbWFnZSgpIGZyb20gYmxvYicpKTsgfTtcbiAgICBlbnYuaW1hZ2Uub25sb2FkID0gZnVuY3Rpb24gKCkgeyByZXNvbHZlKGVudik7IH07XG4gIH0pO1xufTtcblxuXG5JbWFnZUJsb2JSZWR1Y2UucHJvdG90eXBlLl9jYWxjdWxhdGVfc2l6ZSA9IGZ1bmN0aW9uIChlbnYpIHtcbiAgLy9cbiAgLy8gTm90ZSwgaWYgeW91ciBuZWVkIG5vdCBcInN5bW1ldHJpY1wiIHJlc2l6ZSBsb2dpYywgeW91IE1VU1QgY2hlY2tcbiAgLy8gYGVudi5vcmllbnRhdGlvbmAgKHNldCBieSBwbHVnaW5zKSBhbmQgc3dhcCB3aWR0aC9oZWlnaHQgYXBwcm9wcmlhdGVseS5cbiAgLy9cbiAgdmFyIHNjYWxlX2ZhY3RvciA9IGVudi5vcHRzLm1heCAvIE1hdGgubWF4KGVudi5pbWFnZS53aWR0aCwgZW52LmltYWdlLmhlaWdodCk7XG5cbiAgaWYgKHNjYWxlX2ZhY3RvciA+IDEpIHNjYWxlX2ZhY3RvciA9IDE7XG5cbiAgZW52LnRyYW5zZm9ybV93aWR0aCA9IE1hdGgubWF4KE1hdGgucm91bmQoZW52LmltYWdlLndpZHRoICogc2NhbGVfZmFjdG9yKSwgMSk7XG4gIGVudi50cmFuc2Zvcm1faGVpZ2h0ID0gTWF0aC5tYXgoTWF0aC5yb3VuZChlbnYuaW1hZ2UuaGVpZ2h0ICogc2NhbGVfZmFjdG9yKSwgMSk7XG5cbiAgLy8gSW5mbyBmb3IgdXNlciBwbHVnaW5zLCB0byBjaGVjayBpZiBzY2FsaW5nIGFwcGxpZWRcbiAgZW52LnNjYWxlX2ZhY3RvciA9IHNjYWxlX2ZhY3RvcjtcblxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGVudik7XG59O1xuXG5cbkltYWdlQmxvYlJlZHVjZS5wcm90b3R5cGUuX3RyYW5zZm9ybSA9IGZ1bmN0aW9uIChlbnYpIHtcbiAgZW52Lm91dF9jYW52YXMgPSB0aGlzLnBpY2Eub3B0aW9ucy5jcmVhdGVDYW52YXMoZW52LnRyYW5zZm9ybV93aWR0aCwgZW52LnRyYW5zZm9ybV9oZWlnaHQpO1xuXG4gIC8vIERpbSBlbnYgdGVtcG9yYXJ5IHZhcnMgdG8gcHJvaGliaXQgdXNlIGFuZCBhdm9pZCBjb25mdXNpb24gd2hlbiBvcmllbnRhdGlvblxuICAvLyBjaGFuZ2VkLiBZb3Ugc2hvdWxkIHRha2UgcmVhbCBzaXplIGZyb20gY2FudmFzLlxuICBlbnYudHJhbnNmb3JtX3dpZHRoID0gbnVsbDtcbiAgZW52LnRyYW5zZm9ybV9oZWlnaHQgPSBudWxsO1xuXG4gIC8vIEJ5IGRlZmF1bHQgdXNlIGFscGhhIGZvciBwbmcgb25seVxuICB2YXIgcGljYV9vcHRzID0geyBhbHBoYTogZW52LmJsb2IudHlwZSA9PT0gJ2ltYWdlL3BuZycgfTtcblxuICAvLyBFeHRyYWN0IHBpY2Egb3B0aW9ucyBpZiBiZWVuIHBhc3NlZFxuICB0aGlzLnV0aWxzLmFzc2lnbihwaWNhX29wdHMsIHRoaXMudXRpbHMucGlja19waWNhX3Jlc2l6ZV9vcHRpb25zKGVudi5vcHRzKSk7XG5cbiAgcmV0dXJuIHRoaXMucGljYVxuICAgIC5yZXNpemUoZW52LmltYWdlLCBlbnYub3V0X2NhbnZhcywgcGljYV9vcHRzKVxuICAgIC50aGVuKGZ1bmN0aW9uICgpIHsgcmV0dXJuIGVudjsgfSk7XG59O1xuXG5cbkltYWdlQmxvYlJlZHVjZS5wcm90b3R5cGUuX2NsZWFudXAgPSBmdW5jdGlvbiAoZW52KSB7XG4gIGVudi5pbWFnZS5zcmMgPSAnJztcbiAgZW52LmltYWdlID0gbnVsbDtcblxuICB2YXIgVVJMID0gd2luZG93LlVSTCB8fCB3aW5kb3cud2Via2l0VVJMIHx8IHdpbmRvdy5tb3pVUkwgfHwgd2luZG93Lm1zVVJMO1xuICBpZiAoVVJMLnJldm9rZU9iamVjdFVSTCkgVVJMLnJldm9rZU9iamVjdFVSTChlbnYuaW1hZ2VfdXJsKTtcblxuICBlbnYuaW1hZ2VfdXJsID0gbnVsbDtcblxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGVudik7XG59O1xuXG5cbkltYWdlQmxvYlJlZHVjZS5wcm90b3R5cGUuX2NyZWF0ZV9ibG9iID0gZnVuY3Rpb24gKGVudikge1xuICByZXR1cm4gdGhpcy5waWNhLnRvQmxvYihlbnYub3V0X2NhbnZhcywgZW52LmJsb2IudHlwZSlcbiAgICAudGhlbihmdW5jdGlvbiAoYmxvYikge1xuICAgICAgZW52Lm91dF9ibG9iID0gYmxvYjtcbiAgICAgIHJldHVybiBlbnY7XG4gICAgfSk7XG59O1xuXG5cbkltYWdlQmxvYlJlZHVjZS5wcm90b3R5cGUuX2dldFVpbnQ4QXJyYXkgPSBmdW5jdGlvbiAoYmxvYikge1xuICBpZiAoYmxvYi5hcnJheUJ1ZmZlcikge1xuICAgIHJldHVybiBibG9iLmFycmF5QnVmZmVyKCkudGhlbihmdW5jdGlvbiAoYnVmKSB7XG4gICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYnVmKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgdmFyIGZyID0gbmV3IEZpbGVSZWFkZXIoKTtcblxuICAgIGZyLnJlYWRBc0FycmF5QnVmZmVyKGJsb2IpO1xuXG4gICAgZnIub25sb2FkID0gZnVuY3Rpb24gKCkgeyByZXNvbHZlKG5ldyBVaW50OEFycmF5KGZyLnJlc3VsdCkpOyB9O1xuICAgIGZyLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZWplY3QobmV3IEVycm9yKCdJbWFnZUJsb2JSZWR1Y2U6IGZhaWxlZCB0byBsb2FkIGRhdGEgZnJvbSBpbnB1dCBibG9iJykpO1xuICAgICAgZnIuYWJvcnQoKTtcbiAgICB9O1xuICAgIGZyLm9uYWJvcnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZWplY3QobmV3IEVycm9yKCdJbWFnZUJsb2JSZWR1Y2U6IGZhaWxlZCB0byBsb2FkIGRhdGEgZnJvbSBpbnB1dCBibG9iIChhYm9ydGVkKScpKTtcbiAgICB9O1xuICB9KTtcbn07XG5cblxuSW1hZ2VCbG9iUmVkdWNlLnBpY2EgPSBwaWNhO1xuXG52YXIgaW1hZ2VCbG9iUmVkdWNlID0gSW1hZ2VCbG9iUmVkdWNlO1xuXG5leHBvcnQgZGVmYXVsdCBpbWFnZUJsb2JSZWR1Y2U7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../../node_modules/image-blob-reduce/dist/image-blob-reduce.esm.mjs\n");
|
|
29
29
|
|
|
30
30
|
/***/ }),
|
|
31
31
|
|
|
@@ -36,7 +36,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
36
36
|
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
|
37
37
|
|
|
38
38
|
"use strict";
|
|
39
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ e)\n/* harmony export */ });\nvar __awaiter = undefined && undefined.__awaiter || function (thisArg, _arguments, P, generator) {\n function adopt(value) {\n return value instanceof P ? value : new P(function (resolve) {\n resolve(value);\n });\n }\n\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) {\n try {\n step(generator.next(value));\n } catch (e) {\n reject(e);\n }\n }\n\n function rejected(value) {\n try {\n step(generator[\"throw\"](value));\n } catch (e) {\n reject(e);\n }\n }\n\n function step(result) {\n result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n }\n\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\nvar e = (e = [{}]) => __awaiter(void 0, void 0, void 0, function* () {\n return Array.isArray(e) || (e = [e]), e[0].recursive = e[0].recursive || !1, new Promise((t, r) => {\n const i = document.createElement(\"input\");\n i.type = \"file\", i.webkitdirectory = !0;\n\n const c = e => {\n \"function\" == typeof a && a(), t(e);\n },\n a = e[0].legacySetup && e[0].legacySetup(c, () => a(r), i);\n\n i.addEventListener(\"change\", () => {\n let t = Array.from(i.files);\n e[0].recursive ? e[0].recursive && e[0].skipDirectory && (t = t.filter(t => t.webkitRelativePath.split(\"/\").every(t => !e[0].skipDirectory({\n name: t,\n kind: \"directory\"\n })))) : t = t.filter(e => 2 === e.webkitRelativePath.split(\"/\").length), c(t);\n }), i.click();\n });\n});\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
39
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ e)\n/* harmony export */ });\nvar __awaiter = undefined && undefined.__awaiter || function (thisArg, _arguments, P, generator) {\n function adopt(value) {\n return value instanceof P ? value : new P(function (resolve) {\n resolve(value);\n });\n }\n\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) {\n try {\n step(generator.next(value));\n } catch (e) {\n reject(e);\n }\n }\n\n function rejected(value) {\n try {\n step(generator[\"throw\"](value));\n } catch (e) {\n reject(e);\n }\n }\n\n function step(result) {\n result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n }\n\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\nvar e = (e = [{}]) => __awaiter(void 0, void 0, void 0, function* () {\n return Array.isArray(e) || (e = [e]), e[0].recursive = e[0].recursive || !1, new Promise((t, r) => {\n const i = document.createElement(\"input\");\n i.type = \"file\", i.webkitdirectory = !0;\n\n const c = e => {\n \"function\" == typeof a && a(), t(e);\n },\n a = e[0].legacySetup && e[0].legacySetup(c, () => a(r), i);\n\n i.addEventListener(\"change\", () => {\n let t = Array.from(i.files);\n e[0].recursive ? e[0].recursive && e[0].skipDirectory && (t = t.filter(t => t.webkitRelativePath.split(\"/\").every(t => !e[0].skipDirectory({\n name: t,\n kind: \"directory\"\n })))) : t = t.filter(e => 2 === e.webkitRelativePath.split(\"/\").length), c(t);\n }), i.click();\n });\n});\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Jyb3dzZXItZnMtYWNjZXNzL2Rpc3QvZGlyZWN0b3J5LW9wZW4tMDE1NjM2NjYuanMuanMiLCJtYXBwaW5ncyI6Ijs7OztBQUFBLGdCQUFnQixTQUFJLElBQUksU0FBSTtBQUM1QjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIOztBQUVBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTCxHQUFHO0FBQ0gsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYnJvd3Nlci1mcy1hY2Nlc3MvZGlzdC9kaXJlY3Rvcnktb3Blbi0wMTU2MzY2Ni5qcz8zOTg4Il0sInNvdXJjZXNDb250ZW50IjpbInZhciBfX2F3YWl0ZXIgPSB0aGlzICYmIHRoaXMuX19hd2FpdGVyIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkge1xuICAgICAgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7XG4gICAgfVxuXG4gICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICB9KTtcbn07XG5cbnZhciBlID0gKGUgPSBbe31dKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoZSkgfHwgKGUgPSBbZV0pLCBlWzBdLnJlY3Vyc2l2ZSA9IGVbMF0ucmVjdXJzaXZlIHx8ICExLCBuZXcgUHJvbWlzZSgodCwgcikgPT4ge1xuICAgIGNvbnN0IGkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG4gICAgaS50eXBlID0gXCJmaWxlXCIsIGkud2Via2l0ZGlyZWN0b3J5ID0gITA7XG5cbiAgICBjb25zdCBjID0gZSA9PiB7XG4gICAgICBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIGEgJiYgYSgpLCB0KGUpO1xuICAgIH0sXG4gICAgICAgICAgYSA9IGVbMF0ubGVnYWN5U2V0dXAgJiYgZVswXS5sZWdhY3lTZXR1cChjLCAoKSA9PiBhKHIpLCBpKTtcblxuICAgIGkuYWRkRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLCAoKSA9PiB7XG4gICAgICBsZXQgdCA9IEFycmF5LmZyb20oaS5maWxlcyk7XG4gICAgICBlWzBdLnJlY3Vyc2l2ZSA/IGVbMF0ucmVjdXJzaXZlICYmIGVbMF0uc2tpcERpcmVjdG9yeSAmJiAodCA9IHQuZmlsdGVyKHQgPT4gdC53ZWJraXRSZWxhdGl2ZVBhdGguc3BsaXQoXCIvXCIpLmV2ZXJ5KHQgPT4gIWVbMF0uc2tpcERpcmVjdG9yeSh7XG4gICAgICAgIG5hbWU6IHQsXG4gICAgICAgIGtpbmQ6IFwiZGlyZWN0b3J5XCJcbiAgICAgIH0pKSkpIDogdCA9IHQuZmlsdGVyKGUgPT4gMiA9PT0gZS53ZWJraXRSZWxhdGl2ZVBhdGguc3BsaXQoXCIvXCIpLmxlbmd0aCksIGModCk7XG4gICAgfSksIGkuY2xpY2soKTtcbiAgfSk7XG59KTtcblxuZXhwb3J0IHsgZSBhcyBkZWZhdWx0IH07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../../node_modules/browser-fs-access/dist/directory-open-01563666.js\n");
|
|
40
40
|
|
|
41
41
|
/***/ }),
|
|
42
42
|
|
|
@@ -47,7 +47,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
47
47
|
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
|
48
48
|
|
|
49
49
|
"use strict";
|
|
50
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ t)\n/* harmony export */ });\nvar __awaiter = undefined && undefined.__awaiter || function (thisArg, _arguments, P, generator) {\n function adopt(value) {\n return value instanceof P ? value : new P(function (resolve) {\n resolve(value);\n });\n }\n\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) {\n try {\n step(generator.next(value));\n } catch (e) {\n reject(e);\n }\n }\n\n function rejected(value) {\n try {\n step(generator[\"throw\"](value));\n } catch (e) {\n reject(e);\n }\n }\n\n function step(result) {\n result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n }\n\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\nfunction e(r) {\n function t(e) {\n if (Object(e) !== e) return Promise.reject(new TypeError(e + \" is not an object.\"));\n var r = e.done;\n return Promise.resolve(e.value).then(function (e) {\n return {\n value: e,\n done: r\n };\n });\n }\n\n return e = function (e) {\n this.s = e, this.n = e.next;\n }, e.prototype = {\n s: null,\n n: null,\n next: function () {\n return t(this.n.apply(this.s, arguments));\n },\n return: function (e) {\n var r = this.s.return;\n return void 0 === r ? Promise.resolve({\n value: e,\n done: !0\n }) : t(r.apply(this.s, arguments));\n },\n throw: function (e) {\n var r = this.s.return;\n return void 0 === r ? Promise.reject(e) : t(r.apply(this.s, arguments));\n }\n }, new e(r);\n}\n\nconst r = (t, n, i = t.name, a) => __awaiter(void 0, void 0, void 0, function* () {\n const o = [],\n l = [];\n var s,\n u = !1,\n c = !1;\n\n try {\n for (var y, f = function (r) {\n var t,\n n,\n i,\n a = 2;\n\n for (\"undefined\" != typeof Symbol && (n = Symbol.asyncIterator, i = Symbol.iterator); a--;) {\n if (n && null != (t = r[n])) return t.call(r);\n if (i && null != (t = r[i])) return new e(t.call(r));\n n = \"@@asyncIterator\", i = \"@@iterator\";\n }\n\n throw new TypeError(\"Object is not async iterable\");\n }(t.values()); u = !(y = yield f.next()).done; u = !1) {\n const e = y.value,\n s = `${i}/${e.name}`;\n \"file\" === e.kind ? l.push(e.getFile().then(r => (r.directoryHandle = t, r.handle = e, Object.defineProperty(r, \"webkitRelativePath\", {\n configurable: !0,\n enumerable: !0,\n get: () => s\n })))) : \"directory\" !== e.kind || !n || a && a(e) || o.push(r(e, n, s, a));\n }\n } catch (e) {\n c = !0, s = e;\n } finally {\n try {\n u && null != f.return && (yield f.return());\n } finally {\n if (c) throw s;\n }\n }\n\n return [...(yield Promise.all(o)).flat(), ...(yield Promise.all(l))];\n});\n\nvar t = (e = {}) => __awaiter(void 0, void 0, void 0, function* () {\n e.recursive = e.recursive || !1;\n const t = yield window.showDirectoryPicker({\n id: e.id,\n startIn: e.startIn\n });\n return r(t, e.recursive, void 0, e.skipDirectory);\n});\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
50
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ t)\n/* harmony export */ });\nvar __awaiter = undefined && undefined.__awaiter || function (thisArg, _arguments, P, generator) {\n function adopt(value) {\n return value instanceof P ? value : new P(function (resolve) {\n resolve(value);\n });\n }\n\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) {\n try {\n step(generator.next(value));\n } catch (e) {\n reject(e);\n }\n }\n\n function rejected(value) {\n try {\n step(generator[\"throw\"](value));\n } catch (e) {\n reject(e);\n }\n }\n\n function step(result) {\n result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n }\n\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\nfunction e(r) {\n function t(e) {\n if (Object(e) !== e) return Promise.reject(new TypeError(e + \" is not an object.\"));\n var r = e.done;\n return Promise.resolve(e.value).then(function (e) {\n return {\n value: e,\n done: r\n };\n });\n }\n\n return e = function (e) {\n this.s = e, this.n = e.next;\n }, e.prototype = {\n s: null,\n n: null,\n next: function () {\n return t(this.n.apply(this.s, arguments));\n },\n return: function (e) {\n var r = this.s.return;\n return void 0 === r ? Promise.resolve({\n value: e,\n done: !0\n }) : t(r.apply(this.s, arguments));\n },\n throw: function (e) {\n var r = this.s.return;\n return void 0 === r ? Promise.reject(e) : t(r.apply(this.s, arguments));\n }\n }, new e(r);\n}\n\nconst r = (t, n, i = t.name, a) => __awaiter(void 0, void 0, void 0, function* () {\n const o = [],\n l = [];\n var s,\n u = !1,\n c = !1;\n\n try {\n for (var y, f = function (r) {\n var t,\n n,\n i,\n a = 2;\n\n for (\"undefined\" != typeof Symbol && (n = Symbol.asyncIterator, i = Symbol.iterator); a--;) {\n if (n && null != (t = r[n])) return t.call(r);\n if (i && null != (t = r[i])) return new e(t.call(r));\n n = \"@@asyncIterator\", i = \"@@iterator\";\n }\n\n throw new TypeError(\"Object is not async iterable\");\n }(t.values()); u = !(y = yield f.next()).done; u = !1) {\n const e = y.value,\n s = `${i}/${e.name}`;\n \"file\" === e.kind ? l.push(e.getFile().then(r => (r.directoryHandle = t, r.handle = e, Object.defineProperty(r, \"webkitRelativePath\", {\n configurable: !0,\n enumerable: !0,\n get: () => s\n })))) : \"directory\" !== e.kind || !n || a && a(e) || o.push(r(e, n, s, a));\n }\n } catch (e) {\n c = !0, s = e;\n } finally {\n try {\n u && null != f.return && (yield f.return());\n } finally {\n if (c) throw s;\n }\n }\n\n return [...(yield Promise.all(o)).flat(), ...(yield Promise.all(l))];\n});\n\nvar t = (e = {}) => __awaiter(void 0, void 0, void 0, function* () {\n e.recursive = e.recursive || !1;\n const t = yield window.showDirectoryPicker({\n id: e.id,\n startIn: e.startIn\n });\n return r(t, e.recursive, void 0, e.skipDirectory);\n});\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Jyb3dzZXItZnMtYWNjZXNzL2Rpc3QvZGlyZWN0b3J5LW9wZW4tNGVkMTE4ZDAuanMuanMiLCJtYXBwaW5ncyI6Ijs7OztBQUFBLGdCQUFnQixTQUFJLElBQUksU0FBSTtBQUM1QjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsNEZBQTRGLElBQUk7QUFDaEc7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLLGNBQWMsZ0NBQWdDO0FBQ25EO0FBQ0EsbUJBQW1CLEVBQUUsR0FBRyxPQUFPO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRCxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9icm93c2VyLWZzLWFjY2Vzcy9kaXN0L2RpcmVjdG9yeS1vcGVuLTRlZDExOGQwLmpzP2E1MDMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIF9fYXdhaXRlciA9IHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7XG4gICAgICByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTtcbiAgICB9XG5cbiAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gIH0pO1xufTtcblxuZnVuY3Rpb24gZShyKSB7XG4gIGZ1bmN0aW9uIHQoZSkge1xuICAgIGlmIChPYmplY3QoZSkgIT09IGUpIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgVHlwZUVycm9yKGUgKyBcIiBpcyBub3QgYW4gb2JqZWN0LlwiKSk7XG4gICAgdmFyIHIgPSBlLmRvbmU7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShlLnZhbHVlKS50aGVuKGZ1bmN0aW9uIChlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogZSxcbiAgICAgICAgZG9uZTogclxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBlID0gZnVuY3Rpb24gKGUpIHtcbiAgICB0aGlzLnMgPSBlLCB0aGlzLm4gPSBlLm5leHQ7XG4gIH0sIGUucHJvdG90eXBlID0ge1xuICAgIHM6IG51bGwsXG4gICAgbjogbnVsbCxcbiAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdCh0aGlzLm4uYXBwbHkodGhpcy5zLCBhcmd1bWVudHMpKTtcbiAgICB9LFxuICAgIHJldHVybjogZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciByID0gdGhpcy5zLnJldHVybjtcbiAgICAgIHJldHVybiB2b2lkIDAgPT09IHIgPyBQcm9taXNlLnJlc29sdmUoe1xuICAgICAgICB2YWx1ZTogZSxcbiAgICAgICAgZG9uZTogITBcbiAgICAgIH0pIDogdChyLmFwcGx5KHRoaXMucywgYXJndW1lbnRzKSk7XG4gICAgfSxcbiAgICB0aHJvdzogZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciByID0gdGhpcy5zLnJldHVybjtcbiAgICAgIHJldHVybiB2b2lkIDAgPT09IHIgPyBQcm9taXNlLnJlamVjdChlKSA6IHQoci5hcHBseSh0aGlzLnMsIGFyZ3VtZW50cykpO1xuICAgIH1cbiAgfSwgbmV3IGUocik7XG59XG5cbmNvbnN0IHIgPSAodCwgbiwgaSA9IHQubmFtZSwgYSkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gIGNvbnN0IG8gPSBbXSxcbiAgICAgICAgbCA9IFtdO1xuICB2YXIgcyxcbiAgICAgIHUgPSAhMSxcbiAgICAgIGMgPSAhMTtcblxuICB0cnkge1xuICAgIGZvciAodmFyIHksIGYgPSBmdW5jdGlvbiAocikge1xuICAgICAgdmFyIHQsXG4gICAgICAgICAgbixcbiAgICAgICAgICBpLFxuICAgICAgICAgIGEgPSAyO1xuXG4gICAgICBmb3IgKFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIFN5bWJvbCAmJiAobiA9IFN5bWJvbC5hc3luY0l0ZXJhdG9yLCBpID0gU3ltYm9sLml0ZXJhdG9yKTsgYS0tOykge1xuICAgICAgICBpZiAobiAmJiBudWxsICE9ICh0ID0gcltuXSkpIHJldHVybiB0LmNhbGwocik7XG4gICAgICAgIGlmIChpICYmIG51bGwgIT0gKHQgPSByW2ldKSkgcmV0dXJuIG5ldyBlKHQuY2FsbChyKSk7XG4gICAgICAgIG4gPSBcIkBAYXN5bmNJdGVyYXRvclwiLCBpID0gXCJAQGl0ZXJhdG9yXCI7XG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgaXMgbm90IGFzeW5jIGl0ZXJhYmxlXCIpO1xuICAgIH0odC52YWx1ZXMoKSk7IHUgPSAhKHkgPSB5aWVsZCBmLm5leHQoKSkuZG9uZTsgdSA9ICExKSB7XG4gICAgICBjb25zdCBlID0geS52YWx1ZSxcbiAgICAgICAgICAgIHMgPSBgJHtpfS8ke2UubmFtZX1gO1xuICAgICAgXCJmaWxlXCIgPT09IGUua2luZCA/IGwucHVzaChlLmdldEZpbGUoKS50aGVuKHIgPT4gKHIuZGlyZWN0b3J5SGFuZGxlID0gdCwgci5oYW5kbGUgPSBlLCBPYmplY3QuZGVmaW5lUHJvcGVydHkociwgXCJ3ZWJraXRSZWxhdGl2ZVBhdGhcIiwge1xuICAgICAgICBjb25maWd1cmFibGU6ICEwLFxuICAgICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgICAgZ2V0OiAoKSA9PiBzXG4gICAgICB9KSkpKSA6IFwiZGlyZWN0b3J5XCIgIT09IGUua2luZCB8fCAhbiB8fCBhICYmIGEoZSkgfHwgby5wdXNoKHIoZSwgbiwgcywgYSkpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIGMgPSAhMCwgcyA9IGU7XG4gIH0gZmluYWxseSB7XG4gICAgdHJ5IHtcbiAgICAgIHUgJiYgbnVsbCAhPSBmLnJldHVybiAmJiAoeWllbGQgZi5yZXR1cm4oKSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChjKSB0aHJvdyBzO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBbLi4uKHlpZWxkIFByb21pc2UuYWxsKG8pKS5mbGF0KCksIC4uLih5aWVsZCBQcm9taXNlLmFsbChsKSldO1xufSk7XG5cbnZhciB0ID0gKGUgPSB7fSkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gIGUucmVjdXJzaXZlID0gZS5yZWN1cnNpdmUgfHwgITE7XG4gIGNvbnN0IHQgPSB5aWVsZCB3aW5kb3cuc2hvd0RpcmVjdG9yeVBpY2tlcih7XG4gICAgaWQ6IGUuaWQsXG4gICAgc3RhcnRJbjogZS5zdGFydEluXG4gIH0pO1xuICByZXR1cm4gcih0LCBlLnJlY3Vyc2l2ZSwgdm9pZCAwLCBlLnNraXBEaXJlY3RvcnkpO1xufSk7XG5cbmV4cG9ydCB7IHQgYXMgZGVmYXVsdCB9OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../../node_modules/browser-fs-access/dist/directory-open-4ed118d0.js\n");
|
|
51
51
|
|
|
52
52
|
/***/ }),
|
|
53
53
|
|
|
@@ -58,7 +58,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
58
58
|
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
|
59
59
|
|
|
60
60
|
"use strict";
|
|
61
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ t)\n/* harmony export */ });\nvar __awaiter = undefined && undefined.__awaiter || function (thisArg, _arguments, P, generator) {\n function adopt(value) {\n return value instanceof P ? value : new P(function (resolve) {\n resolve(value);\n });\n }\n\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) {\n try {\n step(generator.next(value));\n } catch (e) {\n reject(e);\n }\n }\n\n function rejected(value) {\n try {\n step(generator[\"throw\"](value));\n } catch (e) {\n reject(e);\n }\n }\n\n function step(result) {\n result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n }\n\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\nconst e = e => __awaiter(void 0, void 0, void 0, function* () {\n const t = yield e.getFile();\n return t.handle = e, t;\n});\n\nvar t = (t = [{}]) => __awaiter(void 0, void 0, void 0, function* () {\n Array.isArray(t) || (t = [t]);\n const i = [];\n t.forEach((e, t) => {\n i[t] = {\n description: e.description || \"\",\n accept: {}\n }, e.mimeTypes ? e.mimeTypes.map(a => {\n i[t].accept[a] = e.extensions || [];\n }) : i[t].accept[\"*/*\"] = e.extensions || [];\n });\n const a = yield window.showOpenFilePicker({\n id: t[0].id,\n startIn: t[0].startIn,\n types: i,\n multiple: t[0].multiple || !1,\n excludeAcceptAllOption: t[0].excludeAcceptAllOption || !1\n }),\n c = yield Promise.all(a.map(e));\n return t[0].multiple ? c : c[0];\n});\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Jyb3dzZXItZnMtYWNjZXNzL2Rpc3QvZmlsZS1vcGVuLTAwMmFiNDA4LmpzLmpzIiwibWFwcGluZ3MiOiI7Ozs7QUFBQSxnQkFBZ0IsU0FBSSxJQUFJLFNBQUk7QUFDNUI7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVELGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYnJvd3Nlci1mcy1hY2Nlc3MvZGlzdC9maWxlLW9wZW4tMDAyYWI0MDguanM/
|
|
61
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ t)\n/* harmony export */ });\nvar __awaiter = undefined && undefined.__awaiter || function (thisArg, _arguments, P, generator) {\n function adopt(value) {\n return value instanceof P ? value : new P(function (resolve) {\n resolve(value);\n });\n }\n\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) {\n try {\n step(generator.next(value));\n } catch (e) {\n reject(e);\n }\n }\n\n function rejected(value) {\n try {\n step(generator[\"throw\"](value));\n } catch (e) {\n reject(e);\n }\n }\n\n function step(result) {\n result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n }\n\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\nconst e = e => __awaiter(void 0, void 0, void 0, function* () {\n const t = yield e.getFile();\n return t.handle = e, t;\n});\n\nvar t = (t = [{}]) => __awaiter(void 0, void 0, void 0, function* () {\n Array.isArray(t) || (t = [t]);\n const i = [];\n t.forEach((e, t) => {\n i[t] = {\n description: e.description || \"\",\n accept: {}\n }, e.mimeTypes ? e.mimeTypes.map(a => {\n i[t].accept[a] = e.extensions || [];\n }) : i[t].accept[\"*/*\"] = e.extensions || [];\n });\n const a = yield window.showOpenFilePicker({\n id: t[0].id,\n startIn: t[0].startIn,\n types: i,\n multiple: t[0].multiple || !1,\n excludeAcceptAllOption: t[0].excludeAcceptAllOption || !1\n }),\n c = yield Promise.all(a.map(e));\n return t[0].multiple ? c : c[0];\n});\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Jyb3dzZXItZnMtYWNjZXNzL2Rpc3QvZmlsZS1vcGVuLTAwMmFiNDA4LmpzLmpzIiwibWFwcGluZ3MiOiI7Ozs7QUFBQSxnQkFBZ0IsU0FBSSxJQUFJLFNBQUk7QUFDNUI7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVELGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYnJvd3Nlci1mcy1hY2Nlc3MvZGlzdC9maWxlLW9wZW4tMDAyYWI0MDguanM/OTNhNSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgX19hd2FpdGVyID0gdGhpcyAmJiB0aGlzLl9fYXdhaXRlciB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHtcbiAgICAgIHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpO1xuICAgIH1cblxuICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgfSk7XG59O1xuXG5jb25zdCBlID0gZSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgY29uc3QgdCA9IHlpZWxkIGUuZ2V0RmlsZSgpO1xuICByZXR1cm4gdC5oYW5kbGUgPSBlLCB0O1xufSk7XG5cbnZhciB0ID0gKHQgPSBbe31dKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgQXJyYXkuaXNBcnJheSh0KSB8fCAodCA9IFt0XSk7XG4gIGNvbnN0IGkgPSBbXTtcbiAgdC5mb3JFYWNoKChlLCB0KSA9PiB7XG4gICAgaVt0XSA9IHtcbiAgICAgIGRlc2NyaXB0aW9uOiBlLmRlc2NyaXB0aW9uIHx8IFwiXCIsXG4gICAgICBhY2NlcHQ6IHt9XG4gICAgfSwgZS5taW1lVHlwZXMgPyBlLm1pbWVUeXBlcy5tYXAoYSA9PiB7XG4gICAgICBpW3RdLmFjY2VwdFthXSA9IGUuZXh0ZW5zaW9ucyB8fCBbXTtcbiAgICB9KSA6IGlbdF0uYWNjZXB0W1wiKi8qXCJdID0gZS5leHRlbnNpb25zIHx8IFtdO1xuICB9KTtcbiAgY29uc3QgYSA9IHlpZWxkIHdpbmRvdy5zaG93T3BlbkZpbGVQaWNrZXIoe1xuICAgIGlkOiB0WzBdLmlkLFxuICAgIHN0YXJ0SW46IHRbMF0uc3RhcnRJbixcbiAgICB0eXBlczogaSxcbiAgICBtdWx0aXBsZTogdFswXS5tdWx0aXBsZSB8fCAhMSxcbiAgICBleGNsdWRlQWNjZXB0QWxsT3B0aW9uOiB0WzBdLmV4Y2x1ZGVBY2NlcHRBbGxPcHRpb24gfHwgITFcbiAgfSksXG4gICAgICAgIGMgPSB5aWVsZCBQcm9taXNlLmFsbChhLm1hcChlKSk7XG4gIHJldHVybiB0WzBdLm11bHRpcGxlID8gYyA6IGNbMF07XG59KTtcblxuZXhwb3J0IHsgdCBhcyBkZWZhdWx0IH07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../../node_modules/browser-fs-access/dist/file-open-002ab408.js\n");
|
|
62
62
|
|
|
63
63
|
/***/ }),
|
|
64
64
|
|
|
@@ -69,7 +69,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
69
69
|
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
|
70
70
|
|
|
71
71
|
"use strict";
|
|
72
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ e)\n/* harmony export */ });\nvar __awaiter = undefined && undefined.__awaiter || function (thisArg, _arguments, P, generator) {\n function adopt(value) {\n return value instanceof P ? value : new P(function (resolve) {\n resolve(value);\n });\n }\n\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) {\n try {\n step(generator.next(value));\n } catch (e) {\n reject(e);\n }\n }\n\n function rejected(value) {\n try {\n step(generator[\"throw\"](value));\n } catch (e) {\n reject(e);\n }\n }\n\n function step(result) {\n result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n }\n\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\nvar e = (e = [{}]) => __awaiter(void 0, void 0, void 0, function* () {\n return Array.isArray(e) || (e = [e]), new Promise((t, n) => {\n const a = document.createElement(\"input\");\n a.type = \"file\";\n const i = [...e.map(e => e.mimeTypes || []), ...e.map(e => e.extensions || [])].join();\n a.multiple = e[0].multiple || !1, a.accept = i || \"\";\n\n const c = e => {\n \"function\" == typeof l && l(), t(e);\n },\n l = e[0].legacySetup && e[0].legacySetup(c, () => l(n), a);\n\n a.addEventListener(\"change\", () => {\n c(a.multiple ? Array.from(a.files) : a.files[0]);\n }), a.click();\n });\n});\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
72
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ e)\n/* harmony export */ });\nvar __awaiter = undefined && undefined.__awaiter || function (thisArg, _arguments, P, generator) {\n function adopt(value) {\n return value instanceof P ? value : new P(function (resolve) {\n resolve(value);\n });\n }\n\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) {\n try {\n step(generator.next(value));\n } catch (e) {\n reject(e);\n }\n }\n\n function rejected(value) {\n try {\n step(generator[\"throw\"](value));\n } catch (e) {\n reject(e);\n }\n }\n\n function step(result) {\n result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n }\n\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\nvar e = (e = [{}]) => __awaiter(void 0, void 0, void 0, function* () {\n return Array.isArray(e) || (e = [e]), new Promise((t, n) => {\n const a = document.createElement(\"input\");\n a.type = \"file\";\n const i = [...e.map(e => e.mimeTypes || []), ...e.map(e => e.extensions || [])].join();\n a.multiple = e[0].multiple || !1, a.accept = i || \"\";\n\n const c = e => {\n \"function\" == typeof l && l(), t(e);\n },\n l = e[0].legacySetup && e[0].legacySetup(c, () => l(n), a);\n\n a.addEventListener(\"change\", () => {\n c(a.multiple ? Array.from(a.files) : a.files[0]);\n }), a.click();\n });\n});\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Jyb3dzZXItZnMtYWNjZXNzL2Rpc3QvZmlsZS1vcGVuLTdjODAxNjQzLmpzLmpzIiwibWFwcGluZ3MiOiI7Ozs7QUFBQSxnQkFBZ0IsU0FBSSxJQUFJLFNBQUk7QUFDNUI7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDs7QUFFQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNILENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Jyb3dzZXItZnMtYWNjZXNzL2Rpc3QvZmlsZS1vcGVuLTdjODAxNjQzLmpzP2RkZDciXSwic291cmNlc0NvbnRlbnQiOlsidmFyIF9fYXdhaXRlciA9IHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7XG4gICAgICByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTtcbiAgICB9XG5cbiAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gIH0pO1xufTtcblxudmFyIGUgPSAoZSA9IFt7fV0pID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShlKSB8fCAoZSA9IFtlXSksIG5ldyBQcm9taXNlKCh0LCBuKSA9PiB7XG4gICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcbiAgICBhLnR5cGUgPSBcImZpbGVcIjtcbiAgICBjb25zdCBpID0gWy4uLmUubWFwKGUgPT4gZS5taW1lVHlwZXMgfHwgW10pLCAuLi5lLm1hcChlID0+IGUuZXh0ZW5zaW9ucyB8fCBbXSldLmpvaW4oKTtcbiAgICBhLm11bHRpcGxlID0gZVswXS5tdWx0aXBsZSB8fCAhMSwgYS5hY2NlcHQgPSBpIHx8IFwiXCI7XG5cbiAgICBjb25zdCBjID0gZSA9PiB7XG4gICAgICBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIGwgJiYgbCgpLCB0KGUpO1xuICAgIH0sXG4gICAgICAgICAgbCA9IGVbMF0ubGVnYWN5U2V0dXAgJiYgZVswXS5sZWdhY3lTZXR1cChjLCAoKSA9PiBsKG4pLCBhKTtcblxuICAgIGEuYWRkRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLCAoKSA9PiB7XG4gICAgICBjKGEubXVsdGlwbGUgPyBBcnJheS5mcm9tKGEuZmlsZXMpIDogYS5maWxlc1swXSk7XG4gICAgfSksIGEuY2xpY2soKTtcbiAgfSk7XG59KTtcblxuZXhwb3J0IHsgZSBhcyBkZWZhdWx0IH07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../../node_modules/browser-fs-access/dist/file-open-7c801643.js\n");
|
|
73
73
|
|
|
74
74
|
/***/ }),
|
|
75
75
|
|
|
@@ -80,7 +80,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
80
80
|
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
|
81
81
|
|
|
82
82
|
"use strict";
|
|
83
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ e)\n/* harmony export */ });\nvar __awaiter = undefined && undefined.__awaiter || function (thisArg, _arguments, P, generator) {\n function adopt(value) {\n return value instanceof P ? value : new P(function (resolve) {\n resolve(value);\n });\n }\n\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) {\n try {\n step(generator.next(value));\n } catch (e) {\n reject(e);\n }\n }\n\n function rejected(value) {\n try {\n step(generator[\"throw\"](value));\n } catch (e) {\n reject(e);\n }\n }\n\n function step(result) {\n result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n }\n\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\nvar e = (e, t = {}) => __awaiter(void 0, void 0, void 0, function* () {\n Array.isArray(t) && (t = t[0]);\n const n = document.createElement(\"a\");\n let a = e;\n \"body\" in e && (a = yield function (e, t) {\n return __awaiter(this, void 0, void 0, function* () {\n const n = e.getReader(),\n a = new ReadableStream({\n start: e => function t() {\n return __awaiter(this, void 0, void 0, function* () {\n return n.read().then(({\n done: n,\n value: a\n }) => {\n if (!n) return e.enqueue(a), t();\n e.close();\n });\n });\n }()\n }),\n r = new Response(a),\n c = yield r.blob();\n return n.releaseLock(), new Blob([c], {\n type: t\n });\n });\n }(e.body, e.headers.get(\"content-type\"))), n.download = t.fileName || \"Untitled\", n.href = URL.createObjectURL(yield a);\n\n const r = () => {\n \"function\" == typeof c && c();\n },\n c = t.legacySetup && t.legacySetup(r, () => c(reject), n);\n\n return n.addEventListener(\"click\", () => {\n setTimeout(() => URL.revokeObjectURL(n.href), 3e4), r();\n }), n.click(), null;\n});\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
83
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ e)\n/* harmony export */ });\nvar __awaiter = undefined && undefined.__awaiter || function (thisArg, _arguments, P, generator) {\n function adopt(value) {\n return value instanceof P ? value : new P(function (resolve) {\n resolve(value);\n });\n }\n\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) {\n try {\n step(generator.next(value));\n } catch (e) {\n reject(e);\n }\n }\n\n function rejected(value) {\n try {\n step(generator[\"throw\"](value));\n } catch (e) {\n reject(e);\n }\n }\n\n function step(result) {\n result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n }\n\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\nvar e = (e, t = {}) => __awaiter(void 0, void 0, void 0, function* () {\n Array.isArray(t) && (t = t[0]);\n const n = document.createElement(\"a\");\n let a = e;\n \"body\" in e && (a = yield function (e, t) {\n return __awaiter(this, void 0, void 0, function* () {\n const n = e.getReader(),\n a = new ReadableStream({\n start: e => function t() {\n return __awaiter(this, void 0, void 0, function* () {\n return n.read().then(({\n done: n,\n value: a\n }) => {\n if (!n) return e.enqueue(a), t();\n e.close();\n });\n });\n }()\n }),\n r = new Response(a),\n c = yield r.blob();\n return n.releaseLock(), new Blob([c], {\n type: t\n });\n });\n }(e.body, e.headers.get(\"content-type\"))), n.download = t.fileName || \"Untitled\", n.href = URL.createObjectURL(yield a);\n\n const r = () => {\n \"function\" == typeof c && c();\n },\n c = t.legacySetup && t.legacySetup(r, () => c(reject), n);\n\n return n.addEventListener(\"click\", () => {\n setTimeout(() => URL.revokeObjectURL(n.href), 3e4), r();\n }), n.click(), null;\n});\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Jyb3dzZXItZnMtYWNjZXNzL2Rpc3QvZmlsZS1zYXZlLTMxODk2MzFjLmpzLmpzIiwibWFwcGluZ3MiOiI7Ozs7QUFBQSxnQkFBZ0IsU0FBSSxJQUFJLFNBQUk7QUFDNUI7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDs7QUFFQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsV0FBVztBQUNYLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMLEdBQUc7O0FBRUg7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Jyb3dzZXItZnMtYWNjZXNzL2Rpc3QvZmlsZS1zYXZlLTMxODk2MzFjLmpzP2JkMDQiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIF9fYXdhaXRlciA9IHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7XG4gICAgICByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTtcbiAgICB9XG5cbiAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gIH0pO1xufTtcblxudmFyIGUgPSAoZSwgdCA9IHt9KSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgQXJyYXkuaXNBcnJheSh0KSAmJiAodCA9IHRbMF0pO1xuICBjb25zdCBuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIik7XG4gIGxldCBhID0gZTtcbiAgXCJib2R5XCIgaW4gZSAmJiAoYSA9IHlpZWxkIGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgIGNvbnN0IG4gPSBlLmdldFJlYWRlcigpLFxuICAgICAgICAgICAgYSA9IG5ldyBSZWFkYWJsZVN0cmVhbSh7XG4gICAgICAgIHN0YXJ0OiBlID0+IGZ1bmN0aW9uIHQoKSB7XG4gICAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiBuLnJlYWQoKS50aGVuKCh7XG4gICAgICAgICAgICAgIGRvbmU6IG4sXG4gICAgICAgICAgICAgIHZhbHVlOiBhXG4gICAgICAgICAgICB9KSA9PiB7XG4gICAgICAgICAgICAgIGlmICghbikgcmV0dXJuIGUuZW5xdWV1ZShhKSwgdCgpO1xuICAgICAgICAgICAgICBlLmNsb3NlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSgpXG4gICAgICB9KSxcbiAgICAgICAgICAgIHIgPSBuZXcgUmVzcG9uc2UoYSksXG4gICAgICAgICAgICBjID0geWllbGQgci5ibG9iKCk7XG4gICAgICByZXR1cm4gbi5yZWxlYXNlTG9jaygpLCBuZXcgQmxvYihbY10sIHtcbiAgICAgICAgdHlwZTogdFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0oZS5ib2R5LCBlLmhlYWRlcnMuZ2V0KFwiY29udGVudC10eXBlXCIpKSksIG4uZG93bmxvYWQgPSB0LmZpbGVOYW1lIHx8IFwiVW50aXRsZWRcIiwgbi5ocmVmID0gVVJMLmNyZWF0ZU9iamVjdFVSTCh5aWVsZCBhKTtcblxuICBjb25zdCByID0gKCkgPT4ge1xuICAgIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgYyAmJiBjKCk7XG4gIH0sXG4gICAgICAgIGMgPSB0LmxlZ2FjeVNldHVwICYmIHQubGVnYWN5U2V0dXAociwgKCkgPT4gYyhyZWplY3QpLCBuKTtcblxuICByZXR1cm4gbi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgIHNldFRpbWVvdXQoKCkgPT4gVVJMLnJldm9rZU9iamVjdFVSTChuLmhyZWYpLCAzZTQpLCByKCk7XG4gIH0pLCBuLmNsaWNrKCksIG51bGw7XG59KTtcblxuZXhwb3J0IHsgZSBhcyBkZWZhdWx0IH07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../../node_modules/browser-fs-access/dist/file-save-3189631c.js\n");
|
|
84
84
|
|
|
85
85
|
/***/ }),
|
|
86
86
|
|
|
@@ -91,7 +91,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
91
91
|
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
|
92
92
|
|
|
93
93
|
"use strict";
|
|
94
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ e)\n/* harmony export */ });\nvar __awaiter = undefined && undefined.__awaiter || function (thisArg, _arguments, P, generator) {\n function adopt(value) {\n return value instanceof P ? value : new P(function (resolve) {\n resolve(value);\n });\n }\n\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) {\n try {\n step(generator.next(value));\n } catch (e) {\n reject(e);\n }\n }\n\n function rejected(value) {\n try {\n step(generator[\"throw\"](value));\n } catch (e) {\n reject(e);\n }\n }\n\n function step(result) {\n result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n }\n\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\nvar e = (e, t = [{}], a = null, i = !1, n = null) => __awaiter(void 0, void 0, void 0, function* () {\n Array.isArray(t) || (t = [t]), t[0].fileName = t[0].fileName || \"Untitled\";\n const s = [];\n let c = null;\n if (e instanceof Blob && e.type ? c = e.type : e.headers && e.headers.get(\"content-type\") && (c = e.headers.get(\"content-type\")), t.forEach((e, t) => {\n s[t] = {\n description: e.description || \"\",\n accept: {}\n }, e.mimeTypes ? (0 === t && c && e.mimeTypes.push(c), e.mimeTypes.map(a => {\n s[t].accept[a] = e.extensions || [];\n })) : c && (s[t].accept[c] = e.extensions || []);\n }), a) try {\n yield a.getFile();\n } catch (e) {\n if (a = null, i) throw e;\n }\n const r = a || (yield window.showSaveFilePicker({\n suggestedName: t[0].fileName,\n id: t[0].id,\n startIn: t[0].startIn,\n types: s,\n excludeAcceptAllOption: t[0].excludeAcceptAllOption || !1\n }));\n !a && n && n();\n const l = yield r.createWritable();\n\n if (\"stream\" in e) {\n const t = e.stream();\n return yield t.pipeTo(l), r;\n }\n\n return \"body\" in e ? (yield e.body.pipeTo(l), r) : (yield l.write(yield e), yield l.close(), r);\n});\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
94
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ e)\n/* harmony export */ });\nvar __awaiter = undefined && undefined.__awaiter || function (thisArg, _arguments, P, generator) {\n function adopt(value) {\n return value instanceof P ? value : new P(function (resolve) {\n resolve(value);\n });\n }\n\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) {\n try {\n step(generator.next(value));\n } catch (e) {\n reject(e);\n }\n }\n\n function rejected(value) {\n try {\n step(generator[\"throw\"](value));\n } catch (e) {\n reject(e);\n }\n }\n\n function step(result) {\n result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n }\n\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\nvar e = (e, t = [{}], a = null, i = !1, n = null) => __awaiter(void 0, void 0, void 0, function* () {\n Array.isArray(t) || (t = [t]), t[0].fileName = t[0].fileName || \"Untitled\";\n const s = [];\n let c = null;\n if (e instanceof Blob && e.type ? c = e.type : e.headers && e.headers.get(\"content-type\") && (c = e.headers.get(\"content-type\")), t.forEach((e, t) => {\n s[t] = {\n description: e.description || \"\",\n accept: {}\n }, e.mimeTypes ? (0 === t && c && e.mimeTypes.push(c), e.mimeTypes.map(a => {\n s[t].accept[a] = e.extensions || [];\n })) : c && (s[t].accept[c] = e.extensions || []);\n }), a) try {\n yield a.getFile();\n } catch (e) {\n if (a = null, i) throw e;\n }\n const r = a || (yield window.showSaveFilePicker({\n suggestedName: t[0].fileName,\n id: t[0].id,\n startIn: t[0].startIn,\n types: s,\n excludeAcceptAllOption: t[0].excludeAcceptAllOption || !1\n }));\n !a && n && n();\n const l = yield r.createWritable();\n\n if (\"stream\" in e) {\n const t = e.stream();\n return yield t.pipeTo(l), r;\n }\n\n return \"body\" in e ? (yield e.body.pipeTo(l), r) : (yield l.write(yield e), yield l.close(), r);\n});\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Jyb3dzZXItZnMtYWNjZXNzL2Rpc3QvZmlsZS1zYXZlLTc0NWViYTg4LmpzLmpzIiwibWFwcGluZ3MiOiI7Ozs7QUFBQSxnQkFBZ0IsU0FBSSxJQUFJLFNBQUk7QUFDNUI7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDs7QUFFQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Jyb3dzZXItZnMtYWNjZXNzL2Rpc3QvZmlsZS1zYXZlLTc0NWViYTg4LmpzP2EwOGMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIF9fYXdhaXRlciA9IHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7XG4gICAgICByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTtcbiAgICB9XG5cbiAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gIH0pO1xufTtcblxudmFyIGUgPSAoZSwgdCA9IFt7fV0sIGEgPSBudWxsLCBpID0gITEsIG4gPSBudWxsKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgQXJyYXkuaXNBcnJheSh0KSB8fCAodCA9IFt0XSksIHRbMF0uZmlsZU5hbWUgPSB0WzBdLmZpbGVOYW1lIHx8IFwiVW50aXRsZWRcIjtcbiAgY29uc3QgcyA9IFtdO1xuICBsZXQgYyA9IG51bGw7XG4gIGlmIChlIGluc3RhbmNlb2YgQmxvYiAmJiBlLnR5cGUgPyBjID0gZS50eXBlIDogZS5oZWFkZXJzICYmIGUuaGVhZGVycy5nZXQoXCJjb250ZW50LXR5cGVcIikgJiYgKGMgPSBlLmhlYWRlcnMuZ2V0KFwiY29udGVudC10eXBlXCIpKSwgdC5mb3JFYWNoKChlLCB0KSA9PiB7XG4gICAgc1t0XSA9IHtcbiAgICAgIGRlc2NyaXB0aW9uOiBlLmRlc2NyaXB0aW9uIHx8IFwiXCIsXG4gICAgICBhY2NlcHQ6IHt9XG4gICAgfSwgZS5taW1lVHlwZXMgPyAoMCA9PT0gdCAmJiBjICYmIGUubWltZVR5cGVzLnB1c2goYyksIGUubWltZVR5cGVzLm1hcChhID0+IHtcbiAgICAgIHNbdF0uYWNjZXB0W2FdID0gZS5leHRlbnNpb25zIHx8IFtdO1xuICAgIH0pKSA6IGMgJiYgKHNbdF0uYWNjZXB0W2NdID0gZS5leHRlbnNpb25zIHx8IFtdKTtcbiAgfSksIGEpIHRyeSB7XG4gICAgeWllbGQgYS5nZXRGaWxlKCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoYSA9IG51bGwsIGkpIHRocm93IGU7XG4gIH1cbiAgY29uc3QgciA9IGEgfHwgKHlpZWxkIHdpbmRvdy5zaG93U2F2ZUZpbGVQaWNrZXIoe1xuICAgIHN1Z2dlc3RlZE5hbWU6IHRbMF0uZmlsZU5hbWUsXG4gICAgaWQ6IHRbMF0uaWQsXG4gICAgc3RhcnRJbjogdFswXS5zdGFydEluLFxuICAgIHR5cGVzOiBzLFxuICAgIGV4Y2x1ZGVBY2NlcHRBbGxPcHRpb246IHRbMF0uZXhjbHVkZUFjY2VwdEFsbE9wdGlvbiB8fCAhMVxuICB9KSk7XG4gICFhICYmIG4gJiYgbigpO1xuICBjb25zdCBsID0geWllbGQgci5jcmVhdGVXcml0YWJsZSgpO1xuXG4gIGlmIChcInN0cmVhbVwiIGluIGUpIHtcbiAgICBjb25zdCB0ID0gZS5zdHJlYW0oKTtcbiAgICByZXR1cm4geWllbGQgdC5waXBlVG8obCksIHI7XG4gIH1cblxuICByZXR1cm4gXCJib2R5XCIgaW4gZSA/ICh5aWVsZCBlLmJvZHkucGlwZVRvKGwpLCByKSA6ICh5aWVsZCBsLndyaXRlKHlpZWxkIGUpLCB5aWVsZCBsLmNsb3NlKCksIHIpO1xufSk7XG5cbmV4cG9ydCB7IGUgYXMgZGVmYXVsdCB9OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../../node_modules/browser-fs-access/dist/file-save-745eba88.js\n");
|
|
95
95
|
|
|
96
96
|
/***/ })
|
|
97
97
|
|