@ankhorage/zora 23.4.3 → 24.0.0

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.
Files changed (268) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +1 -1
  3. package/dist/constants/authoring.d.ts +3 -3
  4. package/dist/constants/authoring.d.ts.map +1 -1
  5. package/dist/constants/authoring.js +1 -1
  6. package/dist/constants/authoring.js.map +1 -1
  7. package/dist/features/accordion/accordionItemMeta.d.ts +1 -1
  8. package/dist/features/bottom-sheet/bottomSheetMeta.d.ts +1 -1
  9. package/dist/features/card/cardMeta.d.ts +1 -1
  10. package/dist/features/card/mediaCardMeta.d.ts +1 -1
  11. package/dist/features/card/postCardMeta.d.ts +1 -1
  12. package/dist/features/chat/messageBubbleMeta.d.ts +1 -1
  13. package/dist/features/dialog/dialogMeta.d.ts +2 -2
  14. package/dist/features/gradient/gradientMeta.d.ts +1 -1
  15. package/dist/features/keyboard-avoiding-view/keyboardAvoidingViewMeta.d.ts +1 -1
  16. package/dist/features/layout/gridMeta.d.ts +1 -1
  17. package/dist/features/layout/screenMeta.d.ts +1 -1
  18. package/dist/features/layout/scrollViewMeta.d.ts +1 -1
  19. package/dist/features/layout/viewMeta.d.ts +1 -1
  20. package/dist/features/list/flatListMeta.d.ts +1 -1
  21. package/dist/features/list/sectionListMeta.d.ts +1 -1
  22. package/dist/features/reader/adapters/inbound/Reader.d.ts +9 -0
  23. package/dist/features/reader/adapters/inbound/Reader.d.ts.map +1 -0
  24. package/dist/features/reader/adapters/inbound/{ReaderSurface.js → Reader.js} +33 -9
  25. package/dist/features/reader/adapters/inbound/Reader.js.map +1 -0
  26. package/dist/features/reader/composition/useReaderController.d.ts +24 -0
  27. package/dist/features/reader/composition/useReaderController.d.ts.map +1 -0
  28. package/dist/features/reader/composition/useReaderController.js +73 -0
  29. package/dist/features/reader/composition/useReaderController.js.map +1 -0
  30. package/dist/features/reader/meta.d.ts +5 -9
  31. package/dist/features/reader/meta.d.ts.map +1 -1
  32. package/dist/features/reader/meta.js +3 -7
  33. package/dist/features/reader/meta.js.map +1 -1
  34. package/dist/features/reader/public.d.ts +2 -2
  35. package/dist/features/reader/public.d.ts.map +1 -1
  36. package/dist/features/reader/public.js +1 -1
  37. package/dist/features/reader/public.js.map +1 -1
  38. package/dist/features/registry/ZORA_COMPONENT_REGISTRY.js +2 -2
  39. package/dist/features/registry/ZORA_COMPONENT_REGISTRY.js.map +1 -1
  40. package/dist/features/registry/bindableComponentMeta.d.ts +5 -9
  41. package/dist/features/registry/bindableComponentMeta.d.ts.map +1 -1
  42. package/dist/features/registry/bindableComponentMeta.js +4 -4
  43. package/dist/features/registry/bindableComponentMeta.js.map +1 -1
  44. package/dist/features/registry/componentMeta.js +2 -2
  45. package/dist/features/registry/componentMeta.js.map +1 -1
  46. package/dist/features/scanner/meta.d.ts +2 -2
  47. package/dist/features/section/screenSectionMeta.d.ts +1 -1
  48. package/dist/features/surface/surfaceMeta.d.ts +1 -1
  49. package/dist/features/tabs/tabPanelMeta.d.ts +1 -1
  50. package/dist/index.d.ts +2 -2
  51. package/dist/index.d.ts.map +1 -1
  52. package/dist/index.js +1 -1
  53. package/dist/index.js.map +1 -1
  54. package/dist/types/reader.d.ts +3 -21
  55. package/dist/types/reader.d.ts.map +1 -1
  56. package/dist/types/reader.js.map +1 -1
  57. package/package.json +3 -2
  58. package/src/constants/authoring.ts +1 -1
  59. package/src/features/reader/adapters/inbound/{ReaderSurface.test.ts → Reader.test.ts} +6 -5
  60. package/src/features/reader/adapters/inbound/{ReaderSurface.tsx → Reader.tsx} +67 -33
  61. package/src/features/reader/composition/useReaderController.ts +110 -0
  62. package/src/features/reader/meta.ts +3 -8
  63. package/src/features/reader/public.ts +2 -2
  64. package/src/features/reader/utils/resolveReaderProgress.test.ts +1 -1
  65. package/src/features/registry/ZORA_COMPONENT_REGISTRY.ts +2 -2
  66. package/src/features/registry/bindableComponentMeta.test.ts +2 -2
  67. package/src/features/registry/bindableComponentMeta.ts +4 -4
  68. package/src/features/registry/componentMeta.test.ts +5 -5
  69. package/src/features/registry/componentMeta.ts +2 -2
  70. package/src/index.ts +2 -2
  71. package/src/interactionPolicy.test.ts +3 -3
  72. package/src/showcaseCoverage.test.ts +1 -1
  73. package/src/types/reader.ts +16 -29
  74. package/web-dist/chunks/{Accordion-ct805sm7.js → Accordion-0acrkcyd.js} +3 -3
  75. package/web-dist/chunks/{Accordion-m4brcz8v.js → Accordion-122fdtp0.js} +6 -6
  76. package/web-dist/chunks/{Accordion-6xrse5my.js → Accordion-1dah5bqg.js} +1 -1
  77. package/web-dist/chunks/{Accordion-yae3m7g7.js → Accordion-2afa2z5x.js} +4 -4
  78. package/web-dist/chunks/{Accordion-0047zyx7.js → Accordion-2bsecqwf.js} +4 -4
  79. package/web-dist/chunks/{Accordion-basd2gyf.js → Accordion-2csc57rv.js} +2 -2
  80. package/web-dist/chunks/{Accordion-73x0gt11.js → Accordion-2d3hbryv.js} +7 -7
  81. package/web-dist/chunks/{Accordion-8fne0gf9.js → Accordion-2q6p67xe.js} +5 -5
  82. package/web-dist/chunks/{Accordion-axxgq453.js → Accordion-3f5vnfk8.js} +7 -7
  83. package/web-dist/chunks/{Accordion-gkx1kszz.js → Accordion-3hg1wprb.js} +2 -2
  84. package/web-dist/chunks/{Accordion-d24n7srd.js → Accordion-3rv8psbv.js} +4 -4
  85. package/web-dist/chunks/{Accordion-8z7naxj2.js → Accordion-74rt38d4.js} +1 -1
  86. package/web-dist/chunks/{Accordion-2dqpjya2.js → Accordion-7bb37pdc.js} +7 -7
  87. package/web-dist/chunks/{Accordion-adc7k14q.js → Accordion-7q1qf7c0.js} +5 -5
  88. package/web-dist/chunks/{Accordion-zgzrah0a.js → Accordion-7rvtpcwt.js} +6 -6
  89. package/web-dist/chunks/{Accordion-a1ervhyg.js → Accordion-9rhbc32v.js} +14 -14
  90. package/web-dist/chunks/{Accordion-37n4bt3g.js → Accordion-ae7m1dkn.js} +2 -2
  91. package/web-dist/chunks/{Accordion-ekjwm5dw.js → Accordion-ansfkmye.js} +4 -4
  92. package/web-dist/chunks/{Accordion-qyssgtwe.js → Accordion-apwk2wjr.js} +2 -2
  93. package/web-dist/chunks/{Accordion-vjgk1sz7.js → Accordion-avnt7nkz.js} +2 -2
  94. package/web-dist/chunks/{Accordion-wxbh98kp.js → Accordion-brt4drx3.js} +9 -9
  95. package/web-dist/chunks/{Accordion-6ytrt7xj.js → Accordion-cs8k948c.js} +6 -6
  96. package/web-dist/chunks/{Accordion-693gvpde.js → Accordion-egq42kdy.js} +4 -4
  97. package/web-dist/chunks/{Accordion-8bxy3g7a.js → Accordion-fvkwq99h.js} +4 -4
  98. package/web-dist/chunks/{Accordion-mbqtk7y0.js → Accordion-g0c439br.js} +2 -2
  99. package/web-dist/chunks/{Accordion-3m6de80j.js → Accordion-h46676ex.js} +2 -2
  100. package/web-dist/chunks/{Accordion-7y9wt946.js → Accordion-hwd5ntgm.js} +2 -2
  101. package/web-dist/chunks/{Accordion-k6dg8zd2.js → Accordion-jdwwf626.js} +3 -3
  102. package/web-dist/chunks/{Accordion-q9zge7kd.js → Accordion-jkhq422b.js} +2 -2
  103. package/web-dist/chunks/{Accordion-p0fh69qq.js → Accordion-jtrpmvzs.js} +6 -6
  104. package/web-dist/chunks/{Accordion-tdjh81ax.js → Accordion-k8tfv274.js} +6 -6
  105. package/web-dist/chunks/{Accordion-1xpq9bxk.js → Accordion-kcwdwd5z.js} +8 -8
  106. package/web-dist/chunks/{Accordion-v4n4ygwn.js → Accordion-kpap0trj.js} +1 -1
  107. package/web-dist/chunks/{Accordion-rmp9sfra.js → Accordion-kpxyryke.js} +2 -2
  108. package/web-dist/chunks/{Accordion-wgesygtk.js → Accordion-mdc214tk.js} +11 -11
  109. package/web-dist/chunks/{Accordion-nkd7nhyx.js → Accordion-nanvzve9.js} +5 -5
  110. package/web-dist/chunks/{Accordion-ph15h010.js → Accordion-nay7yexy.js} +11 -11
  111. package/web-dist/chunks/{Accordion-9qvmwkxe.js → Accordion-nh0cs9hq.js} +31 -1
  112. package/web-dist/chunks/{Accordion-snyacfyh.js → Accordion-nj9g6p48.js} +9 -9
  113. package/web-dist/chunks/{Accordion-dbxpv5eq.js → Accordion-q1mnv5g8.js} +4 -4
  114. package/web-dist/chunks/{Accordion-1e1nfhtc.js → Accordion-qj4qxx1p.js} +6 -6
  115. package/web-dist/chunks/{Accordion-bz2dzbad.js → Accordion-qsxx5q34.js} +10 -10
  116. package/web-dist/chunks/{Accordion-ancjf7q8.js → Accordion-rg763dfb.js} +4 -4
  117. package/web-dist/chunks/{Accordion-g2d4fskg.js → Accordion-rkt7qdmj.js} +2 -2
  118. package/web-dist/chunks/{Accordion-pvz3r99n.js → Accordion-sek2q4r1.js} +1 -1
  119. package/web-dist/chunks/{Accordion-0yhkg017.js → Accordion-sxfqnnx6.js} +10 -10
  120. package/web-dist/chunks/{Accordion-wytj5wwc.js → Accordion-sxzax4x4.js} +4 -4
  121. package/web-dist/chunks/{Accordion-e2kr1z3g.js → Accordion-t3hm5tcv.js} +6 -6
  122. package/web-dist/chunks/{Accordion-0yvepteg.js → Accordion-vewrj1kr.js} +6 -6
  123. package/web-dist/chunks/Accordion-vgkvvdvg.js +4295 -0
  124. package/web-dist/chunks/{Accordion-kxa15n19.js → Accordion-x3tphbvw.js} +1 -1
  125. package/web-dist/chunks/{Accordion-ebw6xj6x.js → Accordion-x5v1p4df.js} +5 -5
  126. package/web-dist/chunks/{Accordion-70g7n6tk.js → Accordion-y2eyyqrk.js} +9 -9
  127. package/web-dist/chunks/ReadiumCSS-after.css-2389epxb.js +477 -0
  128. package/web-dist/chunks/ReadiumCSS-after.css-8se5z2w3.js +492 -0
  129. package/web-dist/chunks/ReadiumCSS-after.css-x15y26r7.js +532 -0
  130. package/web-dist/chunks/ReadiumCSS-after.css-z23c32jh.js +594 -0
  131. package/web-dist/chunks/ReadiumCSS-before.css-1t98py7y.js +531 -0
  132. package/web-dist/chunks/ReadiumCSS-before.css-hszzyv5p.js +531 -0
  133. package/web-dist/chunks/ReadiumCSS-before.css-mjvegqjq.js +532 -0
  134. package/web-dist/chunks/ReadiumCSS-before.css-pnpxcrwx.js +531 -0
  135. package/web-dist/chunks/ReadiumCSS-default.css-8gxjy9na.js +185 -0
  136. package/web-dist/chunks/ReadiumCSS-default.css-m8ts96nj.js +182 -0
  137. package/web-dist/chunks/ReadiumCSS-default.css-rg94gstv.js +164 -0
  138. package/web-dist/chunks/ReadiumCSS-default.css-y8p5hk56.js +164 -0
  139. package/web-dist/chunks/ReadiumCSS-ebpaj_fonts_patch.css-50yy1az9.js +84 -0
  140. package/web-dist/chunks/zip-reader-f0yphjb9.js +103 -0
  141. package/web-dist/components/accordion/Accordion.js +12 -12
  142. package/web-dist/components/accordion-item/AccordionItem.js +12 -12
  143. package/web-dist/components/activity-indicator/ActivityIndicator.js +4 -4
  144. package/web-dist/components/app-bar/AppBar.js +19 -19
  145. package/web-dist/components/app-header/AppHeader.js +19 -19
  146. package/web-dist/components/app-shell/AppShell.js +6 -6
  147. package/web-dist/components/auth-screen/AuthScreen.js +21 -21
  148. package/web-dist/components/avatar/Avatar.js +12 -12
  149. package/web-dist/components/avatar-group/AvatarGroup.js +12 -12
  150. package/web-dist/components/badge/Badge.js +7 -7
  151. package/web-dist/components/barcode-scanner-view/BarcodeScannerView.js +20 -20
  152. package/web-dist/components/bottom-sheet/BottomSheet.js +8 -8
  153. package/web-dist/components/bottom-sheet-flat-list/BottomSheetFlatList.js +8 -8
  154. package/web-dist/components/bottom-sheet-scroll-view/BottomSheetScrollView.js +8 -8
  155. package/web-dist/components/bottom-sheet-section-list/BottomSheetSectionList.js +8 -8
  156. package/web-dist/components/bottom-sheet-view/BottomSheetView.js +8 -8
  157. package/web-dist/components/bottom-sheet-virtualized-list/BottomSheetVirtualizedList.js +8 -8
  158. package/web-dist/components/breadcrumbs/Breadcrumbs.js +14 -14
  159. package/web-dist/components/button/Button.js +12 -12
  160. package/web-dist/components/button-group/ButtonGroup.js +12 -12
  161. package/web-dist/components/camera-permission-view/CameraPermissionView.js +20 -20
  162. package/web-dist/components/card/Card.js +19 -19
  163. package/web-dist/components/card-back/CardBack.js +4 -4
  164. package/web-dist/components/card-hand/CardHand.js +4 -4
  165. package/web-dist/components/chat-list-item/ChatListItem.js +16 -16
  166. package/web-dist/components/checkbox/Checkbox.js +12 -12
  167. package/web-dist/components/checkbox-group/CheckboxGroup.js +12 -12
  168. package/web-dist/components/chess-board/ChessBoard.js +4 -4
  169. package/web-dist/components/chip/Chip.js +13 -13
  170. package/web-dist/components/chip-group/ChipGroup.js +13 -13
  171. package/web-dist/components/collection-editor/CollectionEditor.js +19 -19
  172. package/web-dist/components/content-rail/ContentRail.js +14 -14
  173. package/web-dist/components/data-table/DataTable.js +27 -27
  174. package/web-dist/components/date-picker/DatePicker.js +17 -17
  175. package/web-dist/components/dialog/Dialog.js +12 -12
  176. package/web-dist/components/divider/Divider.js +6 -6
  177. package/web-dist/components/empty-state/EmptyState.js +20 -20
  178. package/web-dist/components/field/Field.js +12 -12
  179. package/web-dist/components/flat-list/FlatList.js +13 -13
  180. package/web-dist/components/forgot-password-form/ForgotPasswordForm.js +21 -21
  181. package/web-dist/components/form/Form.js +16 -16
  182. package/web-dist/components/form-actions/FormActions.js +16 -16
  183. package/web-dist/components/form-error/FormError.js +16 -16
  184. package/web-dist/components/game/Game.js +7 -7
  185. package/web-dist/components/game-entity/GameEntity.js +7 -7
  186. package/web-dist/components/game-field/GameField.js +7 -7
  187. package/web-dist/components/game-input-zone/GameInputZone.js +7 -7
  188. package/web-dist/components/game-measurement-probe/GameMeasurementProbe.js +7 -7
  189. package/web-dist/components/game-overlay/GameOverlay.js +7 -7
  190. package/web-dist/components/gradient/Gradient.js +7 -7
  191. package/web-dist/components/gradient-renderer-provider/GradientRendererProvider.js +7 -7
  192. package/web-dist/components/graph-view/GraphView.js +1 -1
  193. package/web-dist/components/grid/Grid.js +6 -6
  194. package/web-dist/components/heading/Heading.js +6 -6
  195. package/web-dist/components/hero/Hero.js +19 -19
  196. package/web-dist/components/icon/Icon.js +4 -4
  197. package/web-dist/components/icon-button/IconButton.js +12 -12
  198. package/web-dist/components/image/Image.js +10 -10
  199. package/web-dist/components/keyboard-avoiding-view/KeyboardAvoidingView.js +3 -3
  200. package/web-dist/components/list/List.js +13 -13
  201. package/web-dist/components/list-item/ListItem.js +13 -13
  202. package/web-dist/components/list-section/ListSection.js +13 -13
  203. package/web-dist/components/media-card/MediaCard.js +19 -19
  204. package/web-dist/components/message-bubble/MessageBubble.js +16 -16
  205. package/web-dist/components/metric-card/MetricCard.js +19 -19
  206. package/web-dist/components/missing-element/MissingElement.js +12 -12
  207. package/web-dist/components/o-auth-provider-button/OAuthProviderButton.js +21 -21
  208. package/web-dist/components/o-auth-provider-list/OAuthProviderList.js +21 -21
  209. package/web-dist/components/opening-book/OpeningBook.js +4 -4
  210. package/web-dist/components/otp-form/OtpForm.js +21 -21
  211. package/web-dist/components/pagination/Pagination.js +13 -13
  212. package/web-dist/components/palette-item/PaletteItem.js +19 -19
  213. package/web-dist/components/playing-card/PlayingCard.js +4 -4
  214. package/web-dist/components/poker-training-table/PokerTrainingTable.js +4 -4
  215. package/web-dist/components/popover-menu/PopoverMenu.js +14 -14
  216. package/web-dist/components/post-card/PostCard.js +19 -19
  217. package/web-dist/components/product-card/ProductCard.js +19 -19
  218. package/web-dist/components/progress/Progress.js +10 -10
  219. package/web-dist/components/progress-ring/ProgressRing.js +10 -10
  220. package/web-dist/components/radio/Radio.js +14 -14
  221. package/web-dist/components/radio-group/RadioGroup.js +14 -14
  222. package/web-dist/components/rating/Rating.js +9 -9
  223. package/web-dist/components/reader/Reader.d.ts +3 -0
  224. package/web-dist/components/reader/Reader.js +38562 -0
  225. package/web-dist/components/reader/index.d.ts +1 -0
  226. package/web-dist/components/reader/index.js +2 -0
  227. package/web-dist/components/scan-overlay/ScanOverlay.js +20 -20
  228. package/web-dist/components/screen/Screen.js +6 -6
  229. package/web-dist/components/screen-section/ScreenSection.js +10 -10
  230. package/web-dist/components/scroll-view/ScrollView.js +6 -6
  231. package/web-dist/components/search-input/SearchInput.js +13 -13
  232. package/web-dist/components/section-header/SectionHeader.js +10 -10
  233. package/web-dist/components/section-list/SectionList.js +13 -13
  234. package/web-dist/components/select/Select.js +16 -16
  235. package/web-dist/components/selectable-item/SelectableItem.js +6 -6
  236. package/web-dist/components/selection-provider/SelectionProvider.js +6 -6
  237. package/web-dist/components/sign-in-form/SignInForm.js +21 -21
  238. package/web-dist/components/sign-up-form/SignUpForm.js +21 -21
  239. package/web-dist/components/skeleton/Skeleton.js +22 -22
  240. package/web-dist/components/skeleton-card/SkeletonCard.js +22 -22
  241. package/web-dist/components/skeleton-list/SkeletonList.js +22 -22
  242. package/web-dist/components/skeleton-text/SkeletonText.js +22 -22
  243. package/web-dist/components/surface/Surface.js +7 -7
  244. package/web-dist/components/switch/Switch.js +7 -7
  245. package/web-dist/components/tab/Tab.js +7 -7
  246. package/web-dist/components/tab-list/TabList.js +7 -7
  247. package/web-dist/components/tab-panel/TabPanel.js +7 -7
  248. package/web-dist/components/tabletop-table/TabletopTable.js +4 -4
  249. package/web-dist/components/tabs/Tabs.js +7 -7
  250. package/web-dist/components/text/Text.js +6 -6
  251. package/web-dist/components/text-input/TextInput.js +13 -13
  252. package/web-dist/components/time-picker/TimePicker.js +18 -18
  253. package/web-dist/components/timeline/Timeline.js +11 -11
  254. package/web-dist/components/toast/Toast.js +9 -9
  255. package/web-dist/components/toast-provider/ToastProvider.js +9 -9
  256. package/web-dist/components/toolbar/Toolbar.js +19 -19
  257. package/web-dist/components/tree-item/TreeItem.js +18 -18
  258. package/web-dist/components/uploader/Uploader.js +22 -22
  259. package/web-dist/components/view/View.js +6 -6
  260. package/web-dist/manifest.json +1615 -1601
  261. package/web-dist/runtime/ZoraProvider.js +9 -9
  262. package/dist/features/reader/adapters/inbound/ReaderSurface.d.ts +0 -11
  263. package/dist/features/reader/adapters/inbound/ReaderSurface.d.ts.map +0 -1
  264. package/dist/features/reader/adapters/inbound/ReaderSurface.js.map +0 -1
  265. package/web-dist/components/reader-surface/ReaderSurface.d.ts +0 -3
  266. package/web-dist/components/reader-surface/ReaderSurface.js +0 -360
  267. package/web-dist/components/reader-surface/index.d.ts +0 -1
  268. package/web-dist/components/reader-surface/index.js +0 -2
@@ -0,0 +1,4295 @@
1
+ 'use client';
2
+ // node_modules/@zip.js/zip.js/lib/core/constants.js
3
+ var MAX_32_BITS = 4294967295;
4
+ var MAX_16_BITS = 65535;
5
+ var MAX_8_BITS = 255;
6
+ var COMPRESSION_METHOD_DEFLATE = 8;
7
+ var COMPRESSION_METHOD_DEFLATE_64 = 9;
8
+ var COMPRESSION_METHOD_STORE = 0;
9
+ var COMPRESSION_METHOD_AES = 99;
10
+ var LOCAL_FILE_HEADER_SIGNATURE = 67324752;
11
+ var SPLIT_ZIP_FILE_SIGNATURE = 134695760;
12
+ var TEMPORARY_SPLIT_ZIP_FILE_SIGNATURE = 808471376;
13
+ var DATA_DESCRIPTOR_RECORD_SIGNATURE = SPLIT_ZIP_FILE_SIGNATURE;
14
+ var ARCHIVE_EXTRA_DATA_SIGNATURE = 134630224;
15
+ var DIGITAL_SIGNATURE_RECORD_SIGNATURE = 84233040;
16
+ var CENTRAL_FILE_HEADER_SIGNATURE = 33639248;
17
+ var END_OF_CENTRAL_DIR_SIGNATURE = 101010256;
18
+ var ZIP64_END_OF_CENTRAL_DIR_SIGNATURE = 101075792;
19
+ var ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE = 117853008;
20
+ var CENTRAL_FILE_HEADER_LENGTH = 46;
21
+ var END_OF_CENTRAL_DIR_LENGTH = 22;
22
+ var ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH = 20;
23
+ var ZIP64_END_OF_CENTRAL_DIR_LENGTH = 56;
24
+ var ZIP64_END_OF_CENTRAL_DIR_TOTAL_LENGTH = END_OF_CENTRAL_DIR_LENGTH + ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH + ZIP64_END_OF_CENTRAL_DIR_LENGTH;
25
+ var DATA_DESCRIPTOR_RECORD_LENGTH = 12;
26
+ var DATA_DESCRIPTOR_RECORD_ZIP_64_LENGTH = 20;
27
+ var DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH = 4;
28
+ var SPLIT_ZIP_FILE_SIGNATURE_LENGTH = 4;
29
+ var EXTRAFIELD_TYPE_ZIP64 = 1;
30
+ var EXTRAFIELD_TYPE_AES = 39169;
31
+ var EXTRAFIELD_TYPE_NTFS = 10;
32
+ var EXTRAFIELD_TYPE_NTFS_TAG1 = 1;
33
+ var EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP = 21589;
34
+ var EXTRAFIELD_TYPE_UNICODE_PATH = 28789;
35
+ var EXTRAFIELD_TYPE_UNICODE_COMMENT = 25461;
36
+ var EXTRAFIELD_TYPE_USDZ = 6534;
37
+ var EXTRAFIELD_TYPE_INFOZIP = 30837;
38
+ var EXTRAFIELD_TYPE_UNIX = 30805;
39
+ var EXTRAFIELD_TYPE_UNIX_TYPE1 = 22613;
40
+ var EXTRAFIELD_TYPE_PKWARE_UNIX = 13;
41
+ var BITFLAG_ENCRYPTED = 1;
42
+ var BITFLAG_LEVEL = 6;
43
+ var BITFLAG_DATA_DESCRIPTOR = 8;
44
+ var BITFLAG_COMPRESSED_PATCHED_DATA = 32;
45
+ var BITFLAG_STRONG_ENCRYPTION = 64;
46
+ var BITFLAG_LANG_ENCODING_FLAG = 2048;
47
+ var BITFLAG_MASKED_LOCAL_HEADERS = 8192;
48
+ var FILE_ATTR_MSDOS_DIR_MASK = 16;
49
+ var FILE_ATTR_MSDOS_READONLY_MASK = 1;
50
+ var FILE_ATTR_MSDOS_HIDDEN_MASK = 2;
51
+ var FILE_ATTR_MSDOS_SYSTEM_MASK = 4;
52
+ var FILE_ATTR_MSDOS_ARCHIVE_MASK = 32;
53
+ var FILE_ATTR_UNIX_TYPE_MASK = 61440;
54
+ var FILE_ATTR_UNIX_TYPE_DIR = 16384;
55
+ var FILE_ATTR_UNIX_TYPE_SYMLINK = 40960;
56
+ var FILE_ATTR_UNIX_EXECUTABLE_MASK = 73;
57
+ var FILE_ATTR_UNIX_DEFAULT_MASK = 420;
58
+ var FILE_ATTR_UNIX_SETUID_MASK = 2048;
59
+ var FILE_ATTR_UNIX_SETGID_MASK = 1024;
60
+ var FILE_ATTR_UNIX_STICKY_MASK = 512;
61
+ var DIRECTORY_SIGNATURE = "/";
62
+ var HEADER_SIZE = 30;
63
+ var HEADER_OFFSET_SIGNATURE = 10;
64
+ var HEADER_OFFSET_COMPRESSED_SIZE = 14;
65
+ var HEADER_OFFSET_UNCOMPRESSED_SIZE = 18;
66
+ var MAX_DATE = new Date(2107, 11, 31, 23, 59, 58);
67
+ var MIN_DATE = new Date(1980, 0, 1);
68
+ var UNDEFINED_VALUE = undefined;
69
+ var ERR_LOCAL_FILE_HEADER_NOT_FOUND2 = "Local file header not found";
70
+ var ERR_OVERLAPPING_ENTRY2 = "Overlapping entry found";
71
+ var ERR_EXTRAFIELD_ZIP64_NOT_FOUND2 = "Zip64 extra field not found";
72
+ var UNDEFINED_TYPE = "undefined";
73
+ var FUNCTION_TYPE = "function";
74
+ var STRING_TYPE = "string";
75
+ var NUMBER_TYPE = "number";
76
+ var BOOLEAN_TYPE = "boolean";
77
+ var EMPTY_UINT8_ARRAY = new Uint8Array;
78
+ var SYMBOL_ASYNC_DISPOSE = Symbol.asyncDispose || Symbol();
79
+
80
+ // node_modules/@zip.js/zip.js/lib/core/options.js
81
+ var OPTION_FILENAME_ENCODING = "filenameEncoding";
82
+ var OPTION_COMMENT_ENCODING = "commentEncoding";
83
+ var OPTION_DECODE_TEXT = "decodeText";
84
+ var OPTION_EXTRACT_PREPENDED_DATA = "extractPrependedData";
85
+ var OPTION_EXTRACT_APPENDED_DATA = "extractAppendedData";
86
+ var OPTION_PASSWORD = "password";
87
+ var OPTION_RAW_PASSWORD = "rawPassword";
88
+ var OPTION_PASS_THROUGH = "passThrough";
89
+ var OPTION_SIGNAL = "signal";
90
+ var OPTION_CHECK_PASSWORD_ONLY = "checkPasswordOnly";
91
+ var OPTION_CHECK_OVERLAPPING_ENTRY_ONLY = "checkOverlappingEntryOnly";
92
+ var OPTION_CHECK_OVERLAPPING_ENTRY = "checkOverlappingEntry";
93
+ var OPTION_CHECK_AMBIGUITY = "checkAmbiguity";
94
+ var OPTION_CHECK_LOCAL_DIRECTORY = "checkLocalDirectory";
95
+ var OPTION_CHECK_LOCAL_FILENAME = "checkLocalFilename";
96
+ var OPTION_CHECK_SIGNATURE = "checkSignature";
97
+ var OPTION_CHECK_CRC32 = "checkCrc32";
98
+ var OPTION_CHECK_AUTHENTICATION_CODE = "checkAuthenticationCode";
99
+ var OPTION_USE_WEB_WORKERS = "useWebWorkers";
100
+ var OPTION_USE_COMPRESSION_STREAM = "useCompressionStream";
101
+ var OPTION_PREVENT_CLOSE = "preventClose";
102
+ var OPTION_STRICTNESS = "strictness";
103
+ var OPTION_FILENAME_VALIDATION = "filenameValidation";
104
+ var OPTION_NORMALIZE_FILENAME = "normalizeFilename";
105
+ var OPTION_MAX_APPENDED_DATA_SIZE = "maxAppendedDataSize";
106
+ var OPTION_DECRYPT_CENTRAL_DIRECTORY = "decryptCentralDirectory";
107
+ var TEXT_TYPE_FILENAME = "filename";
108
+ var TEXT_TYPE_COMMENT = "comment";
109
+ var STRICTNESS_STRICT = "strict";
110
+ var STRICTNESS_BALANCED = "balanced";
111
+ var STRICTNESS_TOLERANT = "tolerant";
112
+ var PASS_THROUGH_COMPRESSED = "compressed";
113
+ var ERR_INVALID_FUNCTION_OPTION = "Invalid option (must be a function)";
114
+ var ERR_INVALID_SIGNAL = "Invalid signal (must be an AbortSignal instance)";
115
+ var ERR_INVALID_PASSWORD_TYPE = "Invalid password (password must be a string, rawPassword must be a Uint8Array)";
116
+ var ERR_INVALID_PASS_THROUGH_VALUE = "Invalid passThrough option (must be a boolean or 'compressed')";
117
+ var ERR_ABORTED = "The operation was aborted";
118
+ var ABORT_ERROR_NAME = "AbortError";
119
+ function checkFunctionOption(value) {
120
+ if (value && typeof value != FUNCTION_TYPE) {
121
+ throw new Error(ERR_INVALID_FUNCTION_OPTION);
122
+ }
123
+ return value;
124
+ }
125
+ function checkSignalOption(signal) {
126
+ if (signal && (typeof signal.addEventListener != FUNCTION_TYPE || typeof signal.aborted != BOOLEAN_TYPE)) {
127
+ throw new Error(ERR_INVALID_SIGNAL);
128
+ }
129
+ return signal || UNDEFINED_VALUE;
130
+ }
131
+ function throwIfAborted(signal) {
132
+ if (signal && signal.aborted) {
133
+ throw signal.reason === UNDEFINED_VALUE ? new DOMException(ERR_ABORTED, ABORT_ERROR_NAME) : signal.reason;
134
+ }
135
+ }
136
+ function checkPasswordOption(password, rawPassword) {
137
+ if (password && typeof password != STRING_TYPE || rawPassword && !(rawPassword instanceof Uint8Array)) {
138
+ throw new Error(ERR_INVALID_PASSWORD_TYPE);
139
+ }
140
+ }
141
+ function checkPassThroughOption(passThrough) {
142
+ if (passThrough !== UNDEFINED_VALUE && typeof passThrough != BOOLEAN_TYPE && passThrough !== PASS_THROUGH_COMPRESSED) {
143
+ throw new Error(ERR_INVALID_PASS_THROUGH_VALUE);
144
+ }
145
+ return passThrough;
146
+ }
147
+ function toNumber(value) {
148
+ return typeof value == STRING_TYPE && value.trim() ? Number(value) : value;
149
+ }
150
+
151
+ // node_modules/@zip.js/zip.js/lib/core/configuration.js
152
+ var DEFAULT_CHUNK_SIZE = 256 * 1024;
153
+ var MINIMUM_CHUNK_SIZE = 64;
154
+ var MINIMUM_PROPERTY_VALUE = 1;
155
+ var ERR_INVALID_MAX_WORKERS = "Invalid maxWorkers (must be an integer greater than 0)";
156
+ var ERR_INVALID_BASE_URI = "Invalid baseURI (must be a string)";
157
+ var ERR_INVALID_URI = "Invalid URI (must be a string or a function returning a string)";
158
+ var maxWorkers = 2;
159
+ try {
160
+ if (typeof navigator != UNDEFINED_TYPE && navigator.hardwareConcurrency) {
161
+ maxWorkers = navigator.hardwareConcurrency;
162
+ }
163
+ } catch {}
164
+ var DEFAULT_CONFIGURATION = {
165
+ workerURI: "./core/web-worker-wasm.js",
166
+ wasmURI: "./core/streams/zlib-wasm/zlib-streams.wasm",
167
+ chunkSize: DEFAULT_CHUNK_SIZE,
168
+ maxWorkers,
169
+ terminateWorkerTimeout: 5000,
170
+ workerStarvationTimeout: 5000,
171
+ workerStartupTimeout: 5000,
172
+ useWebWorkers: true,
173
+ useCompressionStream: true,
174
+ CompressionStream: typeof CompressionStream != UNDEFINED_TYPE && CompressionStream,
175
+ DecompressionStream: typeof DecompressionStream != UNDEFINED_TYPE && DecompressionStream
176
+ };
177
+ var PROPERTY_NAME_MAX_WORKERS = "maxWorkers";
178
+ var PROPERTY_NAME_BASE_URI = "baseURI";
179
+ var URI_PROPERTY_NAMES = [
180
+ "wasmURI",
181
+ "workerURI"
182
+ ];
183
+ var BOOLEAN_PROPERTY_NAMES = [
184
+ "useCompressionStream",
185
+ "useWebWorkers"
186
+ ];
187
+ var NUMBER_PROPERTY_NAMES = [
188
+ "chunkSize",
189
+ PROPERTY_NAME_MAX_WORKERS,
190
+ "terminateWorkerTimeout",
191
+ "workerStarvationTimeout",
192
+ "workerStartupTimeout"
193
+ ];
194
+ var FUNCTION_PROPERTY_NAMES = [
195
+ "createWorker",
196
+ "CompressionStream",
197
+ "DecompressionStream",
198
+ "CompressionStreamFallback",
199
+ "DecompressionStreamFallback"
200
+ ];
201
+ var CONFIGURABLE_PROPERTY_NAMES = [
202
+ PROPERTY_NAME_BASE_URI,
203
+ ...URI_PROPERTY_NAMES,
204
+ ...BOOLEAN_PROPERTY_NAMES,
205
+ ...NUMBER_PROPERTY_NAMES,
206
+ ...FUNCTION_PROPERTY_NAMES
207
+ ];
208
+ var config = { ...DEFAULT_CONFIGURATION };
209
+ function getConfiguration() {
210
+ return config;
211
+ }
212
+ function getChunkSize(config) {
213
+ return normalizeChunkSize(config.chunkSize);
214
+ }
215
+ function normalizeChunkSize(chunkSize) {
216
+ chunkSize = toNumber(chunkSize);
217
+ return Number.isInteger(chunkSize) && chunkSize >= MINIMUM_PROPERTY_VALUE ? Math.max(chunkSize, MINIMUM_CHUNK_SIZE) : DEFAULT_CHUNK_SIZE;
218
+ }
219
+ function checkConfiguration(configuration) {
220
+ const checkedConfiguration = {};
221
+ for (const propertyName of CONFIGURABLE_PROPERTY_NAMES) {
222
+ const propertyValue = configuration[propertyName];
223
+ if (propertyValue !== UNDEFINED_VALUE) {
224
+ checkedConfiguration[propertyName] = checkPropertyValue(propertyName, propertyValue);
225
+ }
226
+ }
227
+ return checkedConfiguration;
228
+ }
229
+ function checkPropertyValue(propertyName, propertyValue) {
230
+ if (NUMBER_PROPERTY_NAMES.includes(propertyName)) {
231
+ propertyValue = toNumber(propertyValue);
232
+ if (propertyName == PROPERTY_NAME_MAX_WORKERS && (!Number.isInteger(propertyValue) || propertyValue < MINIMUM_PROPERTY_VALUE)) {
233
+ throw new Error(ERR_INVALID_MAX_WORKERS);
234
+ }
235
+ } else if (FUNCTION_PROPERTY_NAMES.includes(propertyName)) {
236
+ checkFunctionOption(propertyValue);
237
+ } else if (propertyName == PROPERTY_NAME_BASE_URI) {
238
+ if (propertyValue && typeof propertyValue != STRING_TYPE) {
239
+ throw new Error(ERR_INVALID_BASE_URI);
240
+ }
241
+ } else if (URI_PROPERTY_NAMES.includes(propertyName)) {
242
+ if (propertyValue && typeof propertyValue != STRING_TYPE && typeof propertyValue != FUNCTION_TYPE) {
243
+ throw new Error(ERR_INVALID_URI);
244
+ }
245
+ }
246
+ return propertyValue;
247
+ }
248
+ function normalizeConfiguration(configuration) {
249
+ configuration = configuration || {};
250
+ const { CompressionStreamZlib, DecompressionStreamZlib } = configuration;
251
+ if (CompressionStreamZlib === UNDEFINED_VALUE && DecompressionStreamZlib === UNDEFINED_VALUE) {
252
+ return configuration;
253
+ }
254
+ const normalizedConfiguration = Object.assign({}, configuration);
255
+ if (normalizedConfiguration.CompressionStreamFallback === UNDEFINED_VALUE) {
256
+ normalizedConfiguration.CompressionStreamFallback = CompressionStreamZlib;
257
+ }
258
+ if (normalizedConfiguration.DecompressionStreamFallback === UNDEFINED_VALUE) {
259
+ normalizedConfiguration.DecompressionStreamFallback = DecompressionStreamZlib;
260
+ }
261
+ return normalizedConfiguration;
262
+ }
263
+ function setDefaultConfiguration(configuration) {
264
+ const checkedConfiguration = checkConfiguration(normalizeConfiguration(configuration));
265
+ Object.assign(DEFAULT_CONFIGURATION, checkedConfiguration);
266
+ Object.assign(config, checkedConfiguration);
267
+ }
268
+
269
+ // node_modules/@zip.js/zip.js/lib/core/codec-registry.js
270
+ var ERR_INVALID_CODEC_MODULE = "Invalid codec module";
271
+ var ERR_UNSUPPORTED_COMPRESSION2 = "Compression method not supported";
272
+ var registeredCodecs = new Map;
273
+ var codecStreams = new Map;
274
+ function getRegisteredCodec(compressionMethod) {
275
+ return registeredCodecs.get(compressionMethod);
276
+ }
277
+ function getCodecStreams(format) {
278
+ return codecStreams.get(format);
279
+ }
280
+ function setCodecStreams(format, streams) {
281
+ const { CompressionStream: CompressionStream2, DecompressionStream: DecompressionStream2 } = streams;
282
+ if (typeof CompressionStream2 != FUNCTION_TYPE && typeof DecompressionStream2 != FUNCTION_TYPE) {
283
+ throw new Error(ERR_INVALID_CODEC_MODULE);
284
+ }
285
+ codecStreams.set(format, { CompressionStream: CompressionStream2, DecompressionStream: DecompressionStream2 });
286
+ }
287
+ async function ensureCodecStreams(format, codecURI) {
288
+ if (!codecStreams.has(format) && codecURI) {
289
+ setCodecStreams(format, await import(codecURI));
290
+ }
291
+ }
292
+
293
+ // node_modules/@zip.js/zip.js/lib/core/streams/codecs/crc32.js
294
+ var T = [[], [], [], [], [], [], [], []];
295
+ for (let n = 0;n < 256; n++) {
296
+ let t = n;
297
+ for (let j = 0;j < 8; j++) {
298
+ t = t & 1 ? t >>> 1 ^ 3988292384 : t >>> 1;
299
+ }
300
+ T[0][n] = t;
301
+ }
302
+ for (let n = 0;n < 256; n++) {
303
+ for (let k = 1;k < 8; k++) {
304
+ const previous = T[k - 1][n];
305
+ T[k][n] = previous >>> 8 ^ T[0][previous & 255];
306
+ }
307
+ }
308
+ var [T0, T1, T2, T3, T4, T5, T6, T7] = T;
309
+
310
+ class Crc32 {
311
+ constructor(crc) {
312
+ this.crc = crc || -1;
313
+ }
314
+ append(data) {
315
+ let crc = this.crc | 0;
316
+ const length = data.length | 0;
317
+ let offset = 0;
318
+ if (length >= 8 && data.buffer) {
319
+ const view = new DataView(data.buffer, data.byteOffset, length);
320
+ const end = length - 8;
321
+ for (;offset <= end; offset += 8) {
322
+ const a = crc ^ view.getInt32(offset, true);
323
+ const b = view.getInt32(offset + 4, true);
324
+ crc = T7[a & 255] ^ T6[a >>> 8 & 255] ^ T5[a >>> 16 & 255] ^ T4[a >>> 24 & 255] ^ T3[b & 255] ^ T2[b >>> 8 & 255] ^ T1[b >>> 16 & 255] ^ T0[b >>> 24 & 255];
325
+ }
326
+ }
327
+ for (;offset < length; offset++) {
328
+ crc = crc >>> 8 ^ T0[(crc ^ data[offset]) & 255];
329
+ }
330
+ this.crc = crc;
331
+ }
332
+ get() {
333
+ return ~this.crc;
334
+ }
335
+ }
336
+
337
+ // node_modules/@zip.js/zip.js/lib/core/streams/crc32-stream.js
338
+ class Crc32Stream extends TransformStream {
339
+ constructor() {
340
+ let stream;
341
+ const crc32 = new Crc32;
342
+ super({
343
+ transform(chunk, controller) {
344
+ crc32.append(chunk);
345
+ controller.enqueue(chunk);
346
+ },
347
+ flush() {
348
+ const value = new Uint8Array(4);
349
+ const dataView = new DataView(value.buffer);
350
+ dataView.setUint32(0, crc32.get());
351
+ stream.value = value;
352
+ }
353
+ });
354
+ stream = this;
355
+ }
356
+ }
357
+
358
+ // node_modules/@zip.js/zip.js/lib/core/util/encode-text.js
359
+ function encodeText(value) {
360
+ if (typeof TextEncoder == UNDEFINED_TYPE) {
361
+ value = unescape(encodeURIComponent(value));
362
+ const result = new Uint8Array(value.length);
363
+ for (let i = 0;i < result.length; i++) {
364
+ result[i] = value.charCodeAt(i);
365
+ }
366
+ return result;
367
+ } else {
368
+ return new TextEncoder().encode(value);
369
+ }
370
+ }
371
+
372
+ // node_modules/@zip.js/zip.js/lib/core/util/array.js
373
+ function concat(first, second) {
374
+ const result = new Uint8Array(first.length + second.length);
375
+ result.set(first);
376
+ result.set(second, first.length);
377
+ return result;
378
+ }
379
+ function toExactUint8Array(array) {
380
+ return array.byteOffset || array.byteLength != array.buffer.byteLength ? new Uint8Array(array) : array;
381
+ }
382
+ function getDataView(array) {
383
+ return new DataView(array.buffer, array.byteOffset, array.byteLength);
384
+ }
385
+
386
+ // node_modules/@zip.js/zip.js/lib/core/streams/codecs/aes-hmac-sha1.js
387
+ var BLOCK_LENGTH = 16;
388
+ var ROUND_KEYS_LENGTH = 60;
389
+ var SHA1_BLOCK_LENGTH = 64;
390
+ var SHA1_DIGEST_LENGTH = 20;
391
+ var SHA1_SCHEDULE_LENGTH = 16;
392
+ var SHA1_LENGTH_OFFSET = 56;
393
+ var SHA1_PADDING = new Uint8Array([128]);
394
+ var SHA1_ZERO = new Uint8Array(1);
395
+ var SHA1_INITIAL_STATE = new Int32Array([1732584193, 4023233417, 2562383102, 271733878, 3285377520]);
396
+ var HMAC_INNER_PADDING = 54;
397
+ var HMAC_OUTER_PADDING = 92;
398
+ var S_BOX = new Uint8Array(256);
399
+ var T02 = new Int32Array(256);
400
+ var T12 = new Int32Array(256);
401
+ var T22 = new Int32Array(256);
402
+ var T32 = new Int32Array(256);
403
+ var tablesInitialized = false;
404
+ function createEngine(key, authenticationKey) {
405
+ initTables();
406
+ const roundKeys = new Int32Array(ROUND_KEYS_LENGTH);
407
+ const rounds = expandKey(key, roundKeys);
408
+ const keystream = new Int32Array(BLOCK_LENGTH / 4);
409
+ const hmac = createHmac(authenticationKey);
410
+ let counter0 = 0;
411
+ let counter1 = 0;
412
+ let counter2 = 0;
413
+ let counter3 = 0;
414
+ return {
415
+ process(data, decrypt) {
416
+ if (decrypt) {
417
+ hmac.update(data, 0, data.length);
418
+ }
419
+ encrypt(data);
420
+ if (!decrypt) {
421
+ hmac.update(data, 0, data.length);
422
+ }
423
+ },
424
+ digest() {
425
+ return hmac.digest();
426
+ }
427
+ };
428
+ function encrypt(data) {
429
+ const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
430
+ const length = data.length;
431
+ let offset = 0;
432
+ for (;offset + BLOCK_LENGTH <= length; offset += BLOCK_LENGTH) {
433
+ nextKeystream();
434
+ view.setInt32(offset, view.getInt32(offset) ^ keystream[0]);
435
+ view.setInt32(offset + 4, view.getInt32(offset + 4) ^ keystream[1]);
436
+ view.setInt32(offset + 8, view.getInt32(offset + 8) ^ keystream[2]);
437
+ view.setInt32(offset + 12, view.getInt32(offset + 12) ^ keystream[3]);
438
+ }
439
+ if (offset < length) {
440
+ nextKeystream();
441
+ for (let indexByte = 0;offset < length; offset++, indexByte++) {
442
+ data[offset] ^= keystream[indexByte >> 2] >>> 24 - 8 * (indexByte & 3);
443
+ }
444
+ }
445
+ }
446
+ function nextKeystream() {
447
+ counter0 = counter0 + 1 | 0;
448
+ if (!counter0) {
449
+ counter1 = counter1 + 1 | 0;
450
+ if (!counter1) {
451
+ counter2 = counter2 + 1 | 0;
452
+ if (!counter2) {
453
+ counter3 = counter3 + 1 | 0;
454
+ }
455
+ }
456
+ }
457
+ let s0 = swapBytes(counter0) ^ roundKeys[0];
458
+ let s1 = swapBytes(counter1) ^ roundKeys[1];
459
+ let s2 = swapBytes(counter2) ^ roundKeys[2];
460
+ let s3 = swapBytes(counter3) ^ roundKeys[3];
461
+ let t0 = T02[s0 >>> 24] ^ T12[s1 >>> 16 & 255] ^ T22[s2 >>> 8 & 255] ^ T32[s3 & 255] ^ roundKeys[4];
462
+ let t1 = T02[s1 >>> 24] ^ T12[s2 >>> 16 & 255] ^ T22[s3 >>> 8 & 255] ^ T32[s0 & 255] ^ roundKeys[5];
463
+ let t2 = T02[s2 >>> 24] ^ T12[s3 >>> 16 & 255] ^ T22[s0 >>> 8 & 255] ^ T32[s1 & 255] ^ roundKeys[6];
464
+ let t3 = T02[s3 >>> 24] ^ T12[s0 >>> 16 & 255] ^ T22[s1 >>> 8 & 255] ^ T32[s2 & 255] ^ roundKeys[7];
465
+ s0 = T02[t0 >>> 24] ^ T12[t1 >>> 16 & 255] ^ T22[t2 >>> 8 & 255] ^ T32[t3 & 255] ^ roundKeys[8];
466
+ s1 = T02[t1 >>> 24] ^ T12[t2 >>> 16 & 255] ^ T22[t3 >>> 8 & 255] ^ T32[t0 & 255] ^ roundKeys[9];
467
+ s2 = T02[t2 >>> 24] ^ T12[t3 >>> 16 & 255] ^ T22[t0 >>> 8 & 255] ^ T32[t1 & 255] ^ roundKeys[10];
468
+ s3 = T02[t3 >>> 24] ^ T12[t0 >>> 16 & 255] ^ T22[t1 >>> 8 & 255] ^ T32[t2 & 255] ^ roundKeys[11];
469
+ t0 = T02[s0 >>> 24] ^ T12[s1 >>> 16 & 255] ^ T22[s2 >>> 8 & 255] ^ T32[s3 & 255] ^ roundKeys[12];
470
+ t1 = T02[s1 >>> 24] ^ T12[s2 >>> 16 & 255] ^ T22[s3 >>> 8 & 255] ^ T32[s0 & 255] ^ roundKeys[13];
471
+ t2 = T02[s2 >>> 24] ^ T12[s3 >>> 16 & 255] ^ T22[s0 >>> 8 & 255] ^ T32[s1 & 255] ^ roundKeys[14];
472
+ t3 = T02[s3 >>> 24] ^ T12[s0 >>> 16 & 255] ^ T22[s1 >>> 8 & 255] ^ T32[s2 & 255] ^ roundKeys[15];
473
+ s0 = T02[t0 >>> 24] ^ T12[t1 >>> 16 & 255] ^ T22[t2 >>> 8 & 255] ^ T32[t3 & 255] ^ roundKeys[16];
474
+ s1 = T02[t1 >>> 24] ^ T12[t2 >>> 16 & 255] ^ T22[t3 >>> 8 & 255] ^ T32[t0 & 255] ^ roundKeys[17];
475
+ s2 = T02[t2 >>> 24] ^ T12[t3 >>> 16 & 255] ^ T22[t0 >>> 8 & 255] ^ T32[t1 & 255] ^ roundKeys[18];
476
+ s3 = T02[t3 >>> 24] ^ T12[t0 >>> 16 & 255] ^ T22[t1 >>> 8 & 255] ^ T32[t2 & 255] ^ roundKeys[19];
477
+ t0 = T02[s0 >>> 24] ^ T12[s1 >>> 16 & 255] ^ T22[s2 >>> 8 & 255] ^ T32[s3 & 255] ^ roundKeys[20];
478
+ t1 = T02[s1 >>> 24] ^ T12[s2 >>> 16 & 255] ^ T22[s3 >>> 8 & 255] ^ T32[s0 & 255] ^ roundKeys[21];
479
+ t2 = T02[s2 >>> 24] ^ T12[s3 >>> 16 & 255] ^ T22[s0 >>> 8 & 255] ^ T32[s1 & 255] ^ roundKeys[22];
480
+ t3 = T02[s3 >>> 24] ^ T12[s0 >>> 16 & 255] ^ T22[s1 >>> 8 & 255] ^ T32[s2 & 255] ^ roundKeys[23];
481
+ s0 = T02[t0 >>> 24] ^ T12[t1 >>> 16 & 255] ^ T22[t2 >>> 8 & 255] ^ T32[t3 & 255] ^ roundKeys[24];
482
+ s1 = T02[t1 >>> 24] ^ T12[t2 >>> 16 & 255] ^ T22[t3 >>> 8 & 255] ^ T32[t0 & 255] ^ roundKeys[25];
483
+ s2 = T02[t2 >>> 24] ^ T12[t3 >>> 16 & 255] ^ T22[t0 >>> 8 & 255] ^ T32[t1 & 255] ^ roundKeys[26];
484
+ s3 = T02[t3 >>> 24] ^ T12[t0 >>> 16 & 255] ^ T22[t1 >>> 8 & 255] ^ T32[t2 & 255] ^ roundKeys[27];
485
+ t0 = T02[s0 >>> 24] ^ T12[s1 >>> 16 & 255] ^ T22[s2 >>> 8 & 255] ^ T32[s3 & 255] ^ roundKeys[28];
486
+ t1 = T02[s1 >>> 24] ^ T12[s2 >>> 16 & 255] ^ T22[s3 >>> 8 & 255] ^ T32[s0 & 255] ^ roundKeys[29];
487
+ t2 = T02[s2 >>> 24] ^ T12[s3 >>> 16 & 255] ^ T22[s0 >>> 8 & 255] ^ T32[s1 & 255] ^ roundKeys[30];
488
+ t3 = T02[s3 >>> 24] ^ T12[s0 >>> 16 & 255] ^ T22[s1 >>> 8 & 255] ^ T32[s2 & 255] ^ roundKeys[31];
489
+ s0 = T02[t0 >>> 24] ^ T12[t1 >>> 16 & 255] ^ T22[t2 >>> 8 & 255] ^ T32[t3 & 255] ^ roundKeys[32];
490
+ s1 = T02[t1 >>> 24] ^ T12[t2 >>> 16 & 255] ^ T22[t3 >>> 8 & 255] ^ T32[t0 & 255] ^ roundKeys[33];
491
+ s2 = T02[t2 >>> 24] ^ T12[t3 >>> 16 & 255] ^ T22[t0 >>> 8 & 255] ^ T32[t1 & 255] ^ roundKeys[34];
492
+ s3 = T02[t3 >>> 24] ^ T12[t0 >>> 16 & 255] ^ T22[t1 >>> 8 & 255] ^ T32[t2 & 255] ^ roundKeys[35];
493
+ t0 = T02[s0 >>> 24] ^ T12[s1 >>> 16 & 255] ^ T22[s2 >>> 8 & 255] ^ T32[s3 & 255] ^ roundKeys[36];
494
+ t1 = T02[s1 >>> 24] ^ T12[s2 >>> 16 & 255] ^ T22[s3 >>> 8 & 255] ^ T32[s0 & 255] ^ roundKeys[37];
495
+ t2 = T02[s2 >>> 24] ^ T12[s3 >>> 16 & 255] ^ T22[s0 >>> 8 & 255] ^ T32[s1 & 255] ^ roundKeys[38];
496
+ t3 = T02[s3 >>> 24] ^ T12[s0 >>> 16 & 255] ^ T22[s1 >>> 8 & 255] ^ T32[s2 & 255] ^ roundKeys[39];
497
+ let indexKey = 40;
498
+ if (rounds > 10) {
499
+ s0 = T02[t0 >>> 24] ^ T12[t1 >>> 16 & 255] ^ T22[t2 >>> 8 & 255] ^ T32[t3 & 255] ^ roundKeys[40];
500
+ s1 = T02[t1 >>> 24] ^ T12[t2 >>> 16 & 255] ^ T22[t3 >>> 8 & 255] ^ T32[t0 & 255] ^ roundKeys[41];
501
+ s2 = T02[t2 >>> 24] ^ T12[t3 >>> 16 & 255] ^ T22[t0 >>> 8 & 255] ^ T32[t1 & 255] ^ roundKeys[42];
502
+ s3 = T02[t3 >>> 24] ^ T12[t0 >>> 16 & 255] ^ T22[t1 >>> 8 & 255] ^ T32[t2 & 255] ^ roundKeys[43];
503
+ t0 = T02[s0 >>> 24] ^ T12[s1 >>> 16 & 255] ^ T22[s2 >>> 8 & 255] ^ T32[s3 & 255] ^ roundKeys[44];
504
+ t1 = T02[s1 >>> 24] ^ T12[s2 >>> 16 & 255] ^ T22[s3 >>> 8 & 255] ^ T32[s0 & 255] ^ roundKeys[45];
505
+ t2 = T02[s2 >>> 24] ^ T12[s3 >>> 16 & 255] ^ T22[s0 >>> 8 & 255] ^ T32[s1 & 255] ^ roundKeys[46];
506
+ t3 = T02[s3 >>> 24] ^ T12[s0 >>> 16 & 255] ^ T22[s1 >>> 8 & 255] ^ T32[s2 & 255] ^ roundKeys[47];
507
+ indexKey = 48;
508
+ }
509
+ if (rounds > 12) {
510
+ s0 = T02[t0 >>> 24] ^ T12[t1 >>> 16 & 255] ^ T22[t2 >>> 8 & 255] ^ T32[t3 & 255] ^ roundKeys[48];
511
+ s1 = T02[t1 >>> 24] ^ T12[t2 >>> 16 & 255] ^ T22[t3 >>> 8 & 255] ^ T32[t0 & 255] ^ roundKeys[49];
512
+ s2 = T02[t2 >>> 24] ^ T12[t3 >>> 16 & 255] ^ T22[t0 >>> 8 & 255] ^ T32[t1 & 255] ^ roundKeys[50];
513
+ s3 = T02[t3 >>> 24] ^ T12[t0 >>> 16 & 255] ^ T22[t1 >>> 8 & 255] ^ T32[t2 & 255] ^ roundKeys[51];
514
+ t0 = T02[s0 >>> 24] ^ T12[s1 >>> 16 & 255] ^ T22[s2 >>> 8 & 255] ^ T32[s3 & 255] ^ roundKeys[52];
515
+ t1 = T02[s1 >>> 24] ^ T12[s2 >>> 16 & 255] ^ T22[s3 >>> 8 & 255] ^ T32[s0 & 255] ^ roundKeys[53];
516
+ t2 = T02[s2 >>> 24] ^ T12[s3 >>> 16 & 255] ^ T22[s0 >>> 8 & 255] ^ T32[s1 & 255] ^ roundKeys[54];
517
+ t3 = T02[s3 >>> 24] ^ T12[s0 >>> 16 & 255] ^ T22[s1 >>> 8 & 255] ^ T32[s2 & 255] ^ roundKeys[55];
518
+ indexKey = 56;
519
+ }
520
+ keystream[0] = (S_BOX[t0 >>> 24] << 24 | S_BOX[t1 >>> 16 & 255] << 16 | S_BOX[t2 >>> 8 & 255] << 8 | S_BOX[t3 & 255]) ^ roundKeys[indexKey];
521
+ keystream[1] = (S_BOX[t1 >>> 24] << 24 | S_BOX[t2 >>> 16 & 255] << 16 | S_BOX[t3 >>> 8 & 255] << 8 | S_BOX[t0 & 255]) ^ roundKeys[indexKey + 1];
522
+ keystream[2] = (S_BOX[t2 >>> 24] << 24 | S_BOX[t3 >>> 16 & 255] << 16 | S_BOX[t0 >>> 8 & 255] << 8 | S_BOX[t1 & 255]) ^ roundKeys[indexKey + 2];
523
+ keystream[3] = (S_BOX[t3 >>> 24] << 24 | S_BOX[t0 >>> 16 & 255] << 16 | S_BOX[t1 >>> 8 & 255] << 8 | S_BOX[t2 & 255]) ^ roundKeys[indexKey + 3];
524
+ }
525
+ }
526
+ function pbkdf2(password, salt, iterations, length) {
527
+ const hmac = createHmac(password);
528
+ const result = new Uint8Array(length);
529
+ const block = new Uint8Array(salt.length + 4);
530
+ const blockView = new DataView(block.buffer);
531
+ block.set(salt);
532
+ for (let indexBlock = 1, offset = 0;offset < length; indexBlock++, offset += SHA1_DIGEST_LENGTH) {
533
+ blockView.setUint32(salt.length, indexBlock);
534
+ hmac.update(block, 0, block.length);
535
+ let previous = hmac.digest();
536
+ const output = previous.slice();
537
+ for (let iteration = 1;iteration < iterations; iteration++) {
538
+ hmac.update(previous, 0, SHA1_DIGEST_LENGTH);
539
+ previous = hmac.digest();
540
+ for (let indexByte = 0;indexByte < SHA1_DIGEST_LENGTH; indexByte++) {
541
+ output[indexByte] ^= previous[indexByte];
542
+ }
543
+ }
544
+ result.set(output.subarray(0, Math.min(SHA1_DIGEST_LENGTH, length - offset)), offset);
545
+ }
546
+ return result;
547
+ }
548
+ function createHmac(key) {
549
+ const sha1 = createSha1();
550
+ const innerKey = new Uint8Array(SHA1_BLOCK_LENGTH);
551
+ const outerKey = new Uint8Array(SHA1_BLOCK_LENGTH);
552
+ if (key.length > SHA1_BLOCK_LENGTH) {
553
+ sha1.update(key, 0, key.length);
554
+ key = sha1.digest();
555
+ }
556
+ for (let indexByte = 0;indexByte < SHA1_BLOCK_LENGTH; indexByte++) {
557
+ const keyByte = indexByte < key.length ? key[indexByte] : 0;
558
+ innerKey[indexByte] = keyByte ^ HMAC_INNER_PADDING;
559
+ outerKey[indexByte] = keyByte ^ HMAC_OUTER_PADDING;
560
+ }
561
+ sha1.update(innerKey, 0, SHA1_BLOCK_LENGTH);
562
+ return {
563
+ update(data, offset, length) {
564
+ sha1.update(data, offset, length);
565
+ },
566
+ digest() {
567
+ const innerDigest = sha1.digest();
568
+ sha1.update(outerKey, 0, SHA1_BLOCK_LENGTH);
569
+ sha1.update(innerDigest, 0, SHA1_DIGEST_LENGTH);
570
+ const result = sha1.digest();
571
+ sha1.update(innerKey, 0, SHA1_BLOCK_LENGTH);
572
+ return result;
573
+ }
574
+ };
575
+ }
576
+ function createSha1() {
577
+ const state = new Int32Array(SHA1_INITIAL_STATE);
578
+ const schedule = new Int32Array(SHA1_SCHEDULE_LENGTH);
579
+ const block = new Uint8Array(SHA1_BLOCK_LENGTH);
580
+ const blockView = new DataView(block.buffer);
581
+ const lengthBytes = new Uint8Array(8);
582
+ let blockLength = 0;
583
+ let totalLength = 0;
584
+ return {
585
+ update,
586
+ digest
587
+ };
588
+ function update(data, offset, length) {
589
+ const end = offset + length;
590
+ totalLength += length;
591
+ if (blockLength) {
592
+ while (offset < end && blockLength < SHA1_BLOCK_LENGTH) {
593
+ block[blockLength++] = data[offset++];
594
+ }
595
+ if (blockLength == SHA1_BLOCK_LENGTH) {
596
+ compress(blockView, 0);
597
+ blockLength = 0;
598
+ }
599
+ }
600
+ if (offset + SHA1_BLOCK_LENGTH <= end) {
601
+ const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
602
+ for (;offset + SHA1_BLOCK_LENGTH <= end; offset += SHA1_BLOCK_LENGTH) {
603
+ compress(view, offset);
604
+ }
605
+ }
606
+ while (offset < end) {
607
+ block[blockLength++] = data[offset++];
608
+ }
609
+ }
610
+ function digest() {
611
+ const bits = totalLength * 8;
612
+ const high = Math.floor(bits / 4294967296);
613
+ const low = bits >>> 0;
614
+ update(SHA1_PADDING, 0, 1);
615
+ while (blockLength != SHA1_LENGTH_OFFSET) {
616
+ update(SHA1_ZERO, 0, 1);
617
+ }
618
+ lengthBytes[0] = high >>> 24;
619
+ lengthBytes[1] = high >>> 16;
620
+ lengthBytes[2] = high >>> 8;
621
+ lengthBytes[3] = high;
622
+ lengthBytes[4] = low >>> 24;
623
+ lengthBytes[5] = low >>> 16;
624
+ lengthBytes[6] = low >>> 8;
625
+ lengthBytes[7] = low;
626
+ update(lengthBytes, 0, 8);
627
+ const result = new Uint8Array(SHA1_DIGEST_LENGTH);
628
+ const resultView = new DataView(result.buffer);
629
+ for (let indexWord = 0;indexWord < state.length; indexWord++) {
630
+ resultView.setInt32(4 * indexWord, state[indexWord]);
631
+ }
632
+ state.set(SHA1_INITIAL_STATE);
633
+ blockLength = 0;
634
+ totalLength = 0;
635
+ return result;
636
+ }
637
+ function compress(view, offset) {
638
+ for (let index = 0;index < 16; index++) {
639
+ schedule[index] = view.getInt32(offset + 4 * index);
640
+ }
641
+ let a = state[0];
642
+ let b = state[1];
643
+ let c = state[2];
644
+ let d = state[3];
645
+ let e = state[4];
646
+ let t;
647
+ for (let index = 0;index < 15; index += 5) {
648
+ e = (a << 5 | a >>> 27) + ((c ^ d) & b ^ d) + e + 1518500249 + schedule[index] | 0;
649
+ b = b << 30 | b >>> 2;
650
+ d = (e << 5 | e >>> 27) + ((b ^ c) & a ^ c) + d + 1518500249 + schedule[index + 1] | 0;
651
+ a = a << 30 | a >>> 2;
652
+ c = (d << 5 | d >>> 27) + ((a ^ b) & e ^ b) + c + 1518500249 + schedule[index + 2] | 0;
653
+ e = e << 30 | e >>> 2;
654
+ b = (c << 5 | c >>> 27) + ((e ^ a) & d ^ a) + b + 1518500249 + schedule[index + 3] | 0;
655
+ d = d << 30 | d >>> 2;
656
+ a = (b << 5 | b >>> 27) + ((d ^ e) & c ^ e) + a + 1518500249 + schedule[index + 4] | 0;
657
+ c = c << 30 | c >>> 2;
658
+ }
659
+ e = (a << 5 | a >>> 27) + ((c ^ d) & b ^ d) + e + 1518500249 + schedule[15] | 0;
660
+ b = b << 30 | b >>> 2;
661
+ t = schedule[13] ^ schedule[8] ^ schedule[2] ^ schedule[0];
662
+ t = t << 1 | t >>> 31;
663
+ schedule[0] = t;
664
+ d = (e << 5 | e >>> 27) + ((b ^ c) & a ^ c) + d + 1518500249 + t | 0;
665
+ a = a << 30 | a >>> 2;
666
+ t = schedule[14] ^ schedule[9] ^ schedule[3] ^ schedule[1];
667
+ t = t << 1 | t >>> 31;
668
+ schedule[1] = t;
669
+ c = (d << 5 | d >>> 27) + ((a ^ b) & e ^ b) + c + 1518500249 + t | 0;
670
+ e = e << 30 | e >>> 2;
671
+ t = schedule[15] ^ schedule[10] ^ schedule[4] ^ schedule[2];
672
+ t = t << 1 | t >>> 31;
673
+ schedule[2] = t;
674
+ b = (c << 5 | c >>> 27) + ((e ^ a) & d ^ a) + b + 1518500249 + t | 0;
675
+ d = d << 30 | d >>> 2;
676
+ t = schedule[0] ^ schedule[11] ^ schedule[5] ^ schedule[3];
677
+ t = t << 1 | t >>> 31;
678
+ schedule[3] = t;
679
+ a = (b << 5 | b >>> 27) + ((d ^ e) & c ^ e) + a + 1518500249 + t | 0;
680
+ c = c << 30 | c >>> 2;
681
+ for (let index = 20;index < 40; index += 5) {
682
+ t = schedule[index - 3 & 15] ^ schedule[index - 8 & 15] ^ schedule[index - 14 & 15] ^ schedule[index & 15];
683
+ t = t << 1 | t >>> 31;
684
+ schedule[index & 15] = t;
685
+ e = (a << 5 | a >>> 27) + (b ^ c ^ d) + e + 1859775393 + t | 0;
686
+ b = b << 30 | b >>> 2;
687
+ t = schedule[index - 2 & 15] ^ schedule[index - 7 & 15] ^ schedule[index - 13 & 15] ^ schedule[index + 1 & 15];
688
+ t = t << 1 | t >>> 31;
689
+ schedule[index + 1 & 15] = t;
690
+ d = (e << 5 | e >>> 27) + (a ^ b ^ c) + d + 1859775393 + t | 0;
691
+ a = a << 30 | a >>> 2;
692
+ t = schedule[index - 1 & 15] ^ schedule[index - 6 & 15] ^ schedule[index - 12 & 15] ^ schedule[index + 2 & 15];
693
+ t = t << 1 | t >>> 31;
694
+ schedule[index + 2 & 15] = t;
695
+ c = (d << 5 | d >>> 27) + (e ^ a ^ b) + c + 1859775393 + t | 0;
696
+ e = e << 30 | e >>> 2;
697
+ t = schedule[index & 15] ^ schedule[index - 5 & 15] ^ schedule[index - 11 & 15] ^ schedule[index + 3 & 15];
698
+ t = t << 1 | t >>> 31;
699
+ schedule[index + 3 & 15] = t;
700
+ b = (c << 5 | c >>> 27) + (d ^ e ^ a) + b + 1859775393 + t | 0;
701
+ d = d << 30 | d >>> 2;
702
+ t = schedule[index + 1 & 15] ^ schedule[index - 4 & 15] ^ schedule[index - 10 & 15] ^ schedule[index + 4 & 15];
703
+ t = t << 1 | t >>> 31;
704
+ schedule[index + 4 & 15] = t;
705
+ a = (b << 5 | b >>> 27) + (c ^ d ^ e) + a + 1859775393 + t | 0;
706
+ c = c << 30 | c >>> 2;
707
+ }
708
+ for (let index = 40;index < 60; index += 5) {
709
+ t = schedule[index - 3 & 15] ^ schedule[index - 8 & 15] ^ schedule[index - 14 & 15] ^ schedule[index & 15];
710
+ t = t << 1 | t >>> 31;
711
+ schedule[index & 15] = t;
712
+ e = (a << 5 | a >>> 27) + (b & c | (b | c) & d) + e + 2400959708 + t | 0;
713
+ b = b << 30 | b >>> 2;
714
+ t = schedule[index - 2 & 15] ^ schedule[index - 7 & 15] ^ schedule[index - 13 & 15] ^ schedule[index + 1 & 15];
715
+ t = t << 1 | t >>> 31;
716
+ schedule[index + 1 & 15] = t;
717
+ d = (e << 5 | e >>> 27) + (a & b | (a | b) & c) + d + 2400959708 + t | 0;
718
+ a = a << 30 | a >>> 2;
719
+ t = schedule[index - 1 & 15] ^ schedule[index - 6 & 15] ^ schedule[index - 12 & 15] ^ schedule[index + 2 & 15];
720
+ t = t << 1 | t >>> 31;
721
+ schedule[index + 2 & 15] = t;
722
+ c = (d << 5 | d >>> 27) + (e & a | (e | a) & b) + c + 2400959708 + t | 0;
723
+ e = e << 30 | e >>> 2;
724
+ t = schedule[index & 15] ^ schedule[index - 5 & 15] ^ schedule[index - 11 & 15] ^ schedule[index + 3 & 15];
725
+ t = t << 1 | t >>> 31;
726
+ schedule[index + 3 & 15] = t;
727
+ b = (c << 5 | c >>> 27) + (d & e | (d | e) & a) + b + 2400959708 + t | 0;
728
+ d = d << 30 | d >>> 2;
729
+ t = schedule[index + 1 & 15] ^ schedule[index - 4 & 15] ^ schedule[index - 10 & 15] ^ schedule[index + 4 & 15];
730
+ t = t << 1 | t >>> 31;
731
+ schedule[index + 4 & 15] = t;
732
+ a = (b << 5 | b >>> 27) + (c & d | (c | d) & e) + a + 2400959708 + t | 0;
733
+ c = c << 30 | c >>> 2;
734
+ }
735
+ for (let index = 60;index < 80; index += 5) {
736
+ t = schedule[index - 3 & 15] ^ schedule[index - 8 & 15] ^ schedule[index - 14 & 15] ^ schedule[index & 15];
737
+ t = t << 1 | t >>> 31;
738
+ schedule[index & 15] = t;
739
+ e = (a << 5 | a >>> 27) + (b ^ c ^ d) + e + 3395469782 + t | 0;
740
+ b = b << 30 | b >>> 2;
741
+ t = schedule[index - 2 & 15] ^ schedule[index - 7 & 15] ^ schedule[index - 13 & 15] ^ schedule[index + 1 & 15];
742
+ t = t << 1 | t >>> 31;
743
+ schedule[index + 1 & 15] = t;
744
+ d = (e << 5 | e >>> 27) + (a ^ b ^ c) + d + 3395469782 + t | 0;
745
+ a = a << 30 | a >>> 2;
746
+ t = schedule[index - 1 & 15] ^ schedule[index - 6 & 15] ^ schedule[index - 12 & 15] ^ schedule[index + 2 & 15];
747
+ t = t << 1 | t >>> 31;
748
+ schedule[index + 2 & 15] = t;
749
+ c = (d << 5 | d >>> 27) + (e ^ a ^ b) + c + 3395469782 + t | 0;
750
+ e = e << 30 | e >>> 2;
751
+ t = schedule[index & 15] ^ schedule[index - 5 & 15] ^ schedule[index - 11 & 15] ^ schedule[index + 3 & 15];
752
+ t = t << 1 | t >>> 31;
753
+ schedule[index + 3 & 15] = t;
754
+ b = (c << 5 | c >>> 27) + (d ^ e ^ a) + b + 3395469782 + t | 0;
755
+ d = d << 30 | d >>> 2;
756
+ t = schedule[index + 1 & 15] ^ schedule[index - 4 & 15] ^ schedule[index - 10 & 15] ^ schedule[index + 4 & 15];
757
+ t = t << 1 | t >>> 31;
758
+ schedule[index + 4 & 15] = t;
759
+ a = (b << 5 | b >>> 27) + (c ^ d ^ e) + a + 3395469782 + t | 0;
760
+ c = c << 30 | c >>> 2;
761
+ }
762
+ state[0] = state[0] + a | 0;
763
+ state[1] = state[1] + b | 0;
764
+ state[2] = state[2] + c | 0;
765
+ state[3] = state[3] + d | 0;
766
+ state[4] = state[4] + e | 0;
767
+ }
768
+ }
769
+ function initTables() {
770
+ if (!tablesInitialized) {
771
+ let p = 1;
772
+ let q = 1;
773
+ do {
774
+ p = (p ^ p << 1 ^ (p & 128 ? 27 : 0)) & 255;
775
+ q = (q ^ q << 1) & 255;
776
+ q = (q ^ q << 2) & 255;
777
+ q = (q ^ q << 4) & 255;
778
+ if (q & 128) {
779
+ q ^= 9;
780
+ }
781
+ S_BOX[p] = (q ^ (q << 1 | q >> 7) ^ (q << 2 | q >> 6) ^ (q << 3 | q >> 5) ^ (q << 4 | q >> 4) ^ 99) & 255;
782
+ } while (p != 1);
783
+ S_BOX[0] = 99;
784
+ for (let index = 0;index < 256; index++) {
785
+ const s = S_BOX[index];
786
+ const s2 = multiplyByTwo(s);
787
+ const t = s2 << 24 | s << 16 | s << 8 | s2 ^ s;
788
+ T02[index] = t;
789
+ T12[index] = t >>> 8 | t << 24;
790
+ T22[index] = t >>> 16 | t << 16;
791
+ T32[index] = t >>> 24 | t << 8;
792
+ }
793
+ tablesInitialized = true;
794
+ }
795
+ }
796
+ function expandKey(key, roundKeys) {
797
+ const keyWords = key.length >> 2;
798
+ const rounds = keyWords + 6;
799
+ const total = 4 * (rounds + 1);
800
+ let roundConstant = 1;
801
+ for (let index = 0;index < keyWords; index++) {
802
+ roundKeys[index] = key[4 * index] << 24 | key[4 * index + 1] << 16 | key[4 * index + 2] << 8 | key[4 * index + 3];
803
+ }
804
+ for (let index = keyWords;index < total; index++) {
805
+ let word = roundKeys[index - 1];
806
+ if (index % keyWords == 0) {
807
+ word = substituteWord(word << 8 | word >>> 24) ^ roundConstant << 24;
808
+ roundConstant = multiplyByTwo(roundConstant);
809
+ } else if (keyWords > 6 && index % keyWords == 4) {
810
+ word = substituteWord(word);
811
+ }
812
+ roundKeys[index] = roundKeys[index - keyWords] ^ word;
813
+ }
814
+ return rounds;
815
+ }
816
+ function substituteWord(word) {
817
+ return S_BOX[word >>> 24] << 24 | S_BOX[word >>> 16 & 255] << 16 | S_BOX[word >>> 8 & 255] << 8 | S_BOX[word & 255];
818
+ }
819
+ function swapBytes(value) {
820
+ return value << 24 | (value & 65280) << 8 | value >>> 8 & 65280 | value >>> 24;
821
+ }
822
+ function multiplyByTwo(value) {
823
+ return (value << 1 ^ (value >> 7) * 27) & 255;
824
+ }
825
+
826
+ // node_modules/@zip.js/zip.js/lib/core/streams/common-crypto.js
827
+ var GET_RANDOM_VALUES_SUPPORTED = typeof crypto != UNDEFINED_TYPE && typeof crypto.getRandomValues == FUNCTION_TYPE;
828
+ var ERR_INVALID_PASSWORD2 = "Invalid password";
829
+ var ERR_INVALID_AUTHENTICATION_CODE2 = "Invalid authentication code";
830
+ var ERR_ABORT_CHECK_PASSWORD = "zipjs-abort-check-password";
831
+ var ERR_UNSUPPORTED_CRYPTO_API = "Crypto API not supported";
832
+ function getRandomValues(array) {
833
+ if (GET_RANDOM_VALUES_SUPPORTED) {
834
+ return crypto.getRandomValues(array);
835
+ } else {
836
+ throw new Error(ERR_UNSUPPORTED_CRYPTO_API);
837
+ }
838
+ }
839
+
840
+ // node_modules/@zip.js/zip.js/lib/core/streams/aes-crypto-stream.js
841
+ var BLOCK_LENGTH2 = 16;
842
+ var RAW_FORMAT = "raw";
843
+ var PBKDF2_ALGORITHM = { name: "PBKDF2" };
844
+ var HASH_ALGORITHM = { name: "HMAC" };
845
+ var HASH_FUNCTION = "SHA-1";
846
+ var PBKDF2_ITERATIONS = 1000;
847
+ var BASE_KEY_ALGORITHM = Object.assign({ hash: HASH_ALGORITHM }, PBKDF2_ALGORITHM);
848
+ var DERIVED_BITS_ALGORITHM = Object.assign({ iterations: PBKDF2_ITERATIONS, hash: { name: HASH_FUNCTION } }, PBKDF2_ALGORITHM);
849
+ var DERIVED_BITS_USAGE = ["deriveBits"];
850
+ var SALT_LENGTH = [8, 12, 16];
851
+ var KEY_LENGTH = [16, 24, 32];
852
+ var AUTHENTICATION_CODE_LENGTH = 10;
853
+ var PASSWORD_VERIFICATION_LENGTH = 2;
854
+ var CRYPTO_API_SUPPORTED = typeof crypto != UNDEFINED_TYPE;
855
+ var subtle = CRYPTO_API_SUPPORTED && crypto.subtle;
856
+ var SUBTLE_API_SUPPORTED = CRYPTO_API_SUPPORTED && typeof subtle != UNDEFINED_TYPE;
857
+ var DERIVE_BITS_SUPPORTED = SUBTLE_API_SUPPORTED && typeof subtle.importKey == FUNCTION_TYPE && typeof subtle.deriveBits == FUNCTION_TYPE;
858
+ var createEngine2 = createEngine;
859
+
860
+ class AESDecryptionStream extends TransformStream {
861
+ constructor({ password, rawPassword, encryptionStrength, checkPasswordOnly, checkAuthenticationCode = true }) {
862
+ const aesCrypto = {};
863
+ super({
864
+ start() {
865
+ initAesCrypto(aesCrypto, password, rawPassword, encryptionStrength);
866
+ },
867
+ async transform(chunk, controller) {
868
+ const {
869
+ password,
870
+ strength,
871
+ resolveReady,
872
+ ready
873
+ } = aesCrypto;
874
+ if (password) {
875
+ await createDecryptionKeys(aesCrypto, strength, password, subarray(chunk, 0, SALT_LENGTH[strength] + PASSWORD_VERIFICATION_LENGTH));
876
+ chunk = subarray(chunk, SALT_LENGTH[strength] + PASSWORD_VERIFICATION_LENGTH);
877
+ if (checkPasswordOnly) {
878
+ disposeEngine(aesCrypto);
879
+ controller.error(new Error(ERR_ABORT_CHECK_PASSWORD));
880
+ } else {
881
+ resolveReady();
882
+ }
883
+ } else {
884
+ await ready;
885
+ }
886
+ if (aesCrypto.discarded) {
887
+ return;
888
+ }
889
+ const output = new Uint8Array(chunk.length - AUTHENTICATION_CODE_LENGTH - (chunk.length - AUTHENTICATION_CODE_LENGTH) % BLOCK_LENGTH2);
890
+ controller.enqueue(append(aesCrypto, chunk, output, 0, AUTHENTICATION_CODE_LENGTH, true));
891
+ },
892
+ async flush(controller) {
893
+ const {
894
+ engine,
895
+ pendingInput,
896
+ ready
897
+ } = aesCrypto;
898
+ if (engine) {
899
+ await ready;
900
+ if (aesCrypto.discarded) {
901
+ return;
902
+ }
903
+ const originalAuthenticationCode = subarray(pendingInput, pendingInput.length - AUTHENTICATION_CODE_LENGTH);
904
+ const decryptedChunkArray = new Uint8Array(subarray(pendingInput, 0, pendingInput.length - AUTHENTICATION_CODE_LENGTH));
905
+ engine.process(decryptedChunkArray, true);
906
+ const authenticationCode = engine.digest();
907
+ let invalidAuthenticationCode = pendingInput.length < AUTHENTICATION_CODE_LENGTH ? 1 : 0;
908
+ for (let indexByte = 0;indexByte < AUTHENTICATION_CODE_LENGTH; indexByte++) {
909
+ invalidAuthenticationCode |= authenticationCode[indexByte] ^ originalAuthenticationCode[indexByte];
910
+ }
911
+ if (invalidAuthenticationCode && checkAuthenticationCode) {
912
+ controller.error(new Error(ERR_INVALID_AUTHENTICATION_CODE2));
913
+ return;
914
+ }
915
+ controller.enqueue(decryptedChunkArray);
916
+ }
917
+ }
918
+ });
919
+ setDisposingReadable(this, aesCrypto);
920
+ }
921
+ }
922
+
923
+ class AESEncryptionStream extends TransformStream {
924
+ constructor({ password, rawPassword, encryptionStrength }) {
925
+ const aesCrypto = {};
926
+ super({
927
+ start() {
928
+ initAesCrypto(aesCrypto, password, rawPassword, encryptionStrength);
929
+ },
930
+ async transform(chunk, controller) {
931
+ const {
932
+ password,
933
+ strength,
934
+ resolveReady,
935
+ ready
936
+ } = aesCrypto;
937
+ let preamble = EMPTY_UINT8_ARRAY;
938
+ if (password) {
939
+ preamble = await createEncryptionKeys(aesCrypto, strength, password);
940
+ resolveReady();
941
+ } else {
942
+ await ready;
943
+ }
944
+ if (aesCrypto.discarded) {
945
+ return;
946
+ }
947
+ const output = new Uint8Array(preamble.length + chunk.length - chunk.length % BLOCK_LENGTH2);
948
+ output.set(preamble, 0);
949
+ controller.enqueue(append(aesCrypto, chunk, output, preamble.length, 0, false));
950
+ },
951
+ async flush(controller) {
952
+ const {
953
+ engine,
954
+ pendingInput,
955
+ ready
956
+ } = aesCrypto;
957
+ if (engine) {
958
+ await ready;
959
+ if (aesCrypto.discarded) {
960
+ return;
961
+ }
962
+ const encryptedChunkArray = new Uint8Array(pendingInput);
963
+ engine.process(encryptedChunkArray, false);
964
+ const authenticationCode = subarray(engine.digest(), 0, AUTHENTICATION_CODE_LENGTH);
965
+ controller.enqueue(concat(encryptedChunkArray, authenticationCode));
966
+ }
967
+ }
968
+ });
969
+ setDisposingReadable(this, aesCrypto);
970
+ }
971
+ }
972
+ function setAESEngine(createEngineFunction) {
973
+ createEngine2 = createEngineFunction || createEngine;
974
+ }
975
+ function initAesCrypto(aesCrypto, password, rawPassword, encryptionStrength) {
976
+ Object.assign(aesCrypto, {
977
+ ready: new Promise((resolve) => aesCrypto.resolveReady = resolve),
978
+ password: encodePassword(password, rawPassword),
979
+ strength: encryptionStrength - 1,
980
+ pendingInput: EMPTY_UINT8_ARRAY,
981
+ discarded: false
982
+ });
983
+ }
984
+ function setDisposingReadable(stream, aesCrypto) {
985
+ const reader = stream.readable.getReader();
986
+ const readable = new ReadableStream({
987
+ async pull(controller) {
988
+ try {
989
+ const { value, done } = await reader.read();
990
+ if (done) {
991
+ controller.close();
992
+ } else {
993
+ controller.enqueue(value);
994
+ }
995
+ } catch (error) {
996
+ disposeEngine(aesCrypto);
997
+ reader.cancel(error).catch(() => {});
998
+ throw error;
999
+ }
1000
+ },
1001
+ cancel(reason) {
1002
+ disposeEngine(aesCrypto);
1003
+ return reader.cancel(reason);
1004
+ }
1005
+ });
1006
+ Object.defineProperty(stream, "readable", {
1007
+ get() {
1008
+ return readable;
1009
+ }
1010
+ });
1011
+ }
1012
+ function append(aesCrypto, input, output, paddingStart, paddingEnd, decrypt) {
1013
+ const {
1014
+ engine,
1015
+ pendingInput
1016
+ } = aesCrypto;
1017
+ if (pendingInput.length) {
1018
+ input = concat(pendingInput, input);
1019
+ }
1020
+ const inputLength = input.length - paddingEnd;
1021
+ const alignedLength = inputLength - inputLength % BLOCK_LENGTH2;
1022
+ output = expand(output, paddingStart + alignedLength);
1023
+ if (alignedLength) {
1024
+ const chunk = subarray(output, paddingStart, paddingStart + alignedLength);
1025
+ chunk.set(subarray(input, 0, alignedLength));
1026
+ engine.process(chunk, decrypt);
1027
+ }
1028
+ aesCrypto.pendingInput = subarray(input, alignedLength);
1029
+ return output;
1030
+ }
1031
+ async function createDecryptionKeys(decrypt, strength, password, preamble) {
1032
+ const passwordVerificationKey = await createKeys(decrypt, strength, password, subarray(preamble, 0, SALT_LENGTH[strength]));
1033
+ const passwordVerification = subarray(preamble, SALT_LENGTH[strength]);
1034
+ if (passwordVerificationKey[0] != passwordVerification[0] || passwordVerificationKey[1] != passwordVerification[1]) {
1035
+ disposeEngine(decrypt);
1036
+ throw new Error(ERR_INVALID_PASSWORD2);
1037
+ }
1038
+ }
1039
+ function disposeEngine(aesCrypto) {
1040
+ const { engine } = aesCrypto;
1041
+ aesCrypto.discarded = true;
1042
+ if (engine && engine.dispose) {
1043
+ engine.dispose();
1044
+ }
1045
+ }
1046
+ async function createEncryptionKeys(encrypt, strength, password) {
1047
+ const salt = getRandomValues(new Uint8Array(SALT_LENGTH[strength]));
1048
+ const passwordVerification = await createKeys(encrypt, strength, password, salt);
1049
+ return concat(salt, passwordVerification);
1050
+ }
1051
+ async function createKeys(aesCrypto, strength, password, salt) {
1052
+ aesCrypto.password = null;
1053
+ const keyLength = KEY_LENGTH[strength];
1054
+ const compositeKey = await deriveKey(password, salt, keyLength * 2 + PASSWORD_VERIFICATION_LENGTH);
1055
+ aesCrypto.engine = createEngine2(subarray(compositeKey, 0, keyLength), subarray(compositeKey, keyLength, keyLength * 2));
1056
+ if (aesCrypto.discarded) {
1057
+ disposeEngine(aesCrypto);
1058
+ }
1059
+ return subarray(compositeKey, keyLength * 2);
1060
+ }
1061
+ async function deriveKey(password, salt, length) {
1062
+ if (DERIVE_BITS_SUPPORTED) {
1063
+ try {
1064
+ const baseKey = await subtle.importKey(RAW_FORMAT, password, BASE_KEY_ALGORITHM, false, DERIVED_BITS_USAGE);
1065
+ return new Uint8Array(await subtle.deriveBits(Object.assign({ salt }, DERIVED_BITS_ALGORITHM), baseKey, length * 8));
1066
+ } catch {
1067
+ DERIVE_BITS_SUPPORTED = false;
1068
+ }
1069
+ }
1070
+ return pbkdf2(password, salt, PBKDF2_ITERATIONS, length);
1071
+ }
1072
+ function encodePassword(password, rawPassword) {
1073
+ if (rawPassword === UNDEFINED_VALUE) {
1074
+ return encodeText(password);
1075
+ } else {
1076
+ return rawPassword;
1077
+ }
1078
+ }
1079
+ function expand(inputArray, length) {
1080
+ if (length && length > inputArray.length) {
1081
+ const array = inputArray;
1082
+ inputArray = new Uint8Array(length);
1083
+ inputArray.set(array, 0);
1084
+ }
1085
+ return inputArray;
1086
+ }
1087
+ function subarray(array, begin, end) {
1088
+ return array.subarray(begin, end);
1089
+ }
1090
+
1091
+ // node_modules/@zip.js/zip.js/lib/core/streams/zip-crypto-stream.js
1092
+ var HEADER_LENGTH = 12;
1093
+
1094
+ class ZipCryptoDecryptionStream extends TransformStream {
1095
+ constructor({ password, rawPassword, passwordVerification, checkPasswordOnly }) {
1096
+ super({
1097
+ start() {
1098
+ initZipCrypto(this, password, rawPassword, passwordVerification);
1099
+ },
1100
+ transform(chunk, controller) {
1101
+ const zipCrypto = this;
1102
+ if (zipCrypto.password || zipCrypto.rawPassword) {
1103
+ const decryptedHeader = decrypt(zipCrypto, chunk.subarray(0, HEADER_LENGTH));
1104
+ zipCrypto.password = zipCrypto.rawPassword = null;
1105
+ if ((decryptedHeader[HEADER_LENGTH - 1] ^ zipCrypto.passwordVerification) != 0) {
1106
+ throw new Error(ERR_INVALID_PASSWORD2);
1107
+ }
1108
+ chunk = chunk.subarray(HEADER_LENGTH);
1109
+ }
1110
+ if (checkPasswordOnly) {
1111
+ controller.error(new Error(ERR_ABORT_CHECK_PASSWORD));
1112
+ } else {
1113
+ controller.enqueue(decrypt(zipCrypto, chunk));
1114
+ }
1115
+ }
1116
+ });
1117
+ }
1118
+ }
1119
+
1120
+ class ZipCryptoEncryptionStream extends TransformStream {
1121
+ constructor({ password, rawPassword, passwordVerification }) {
1122
+ super({
1123
+ start() {
1124
+ initZipCrypto(this, password, rawPassword, passwordVerification);
1125
+ },
1126
+ transform(chunk, controller) {
1127
+ const zipCrypto = this;
1128
+ let output;
1129
+ let offset;
1130
+ if (zipCrypto.password || zipCrypto.rawPassword) {
1131
+ zipCrypto.password = zipCrypto.rawPassword = null;
1132
+ const header = getRandomValues(new Uint8Array(HEADER_LENGTH));
1133
+ header[HEADER_LENGTH - 1] = zipCrypto.passwordVerification;
1134
+ output = new Uint8Array(chunk.length + header.length);
1135
+ output.set(encrypt(zipCrypto, header), 0);
1136
+ offset = HEADER_LENGTH;
1137
+ } else {
1138
+ output = new Uint8Array(chunk.length);
1139
+ offset = 0;
1140
+ }
1141
+ output.set(encrypt(zipCrypto, chunk), offset);
1142
+ controller.enqueue(output);
1143
+ }
1144
+ });
1145
+ }
1146
+ }
1147
+ function initZipCrypto(zipCrypto, password, rawPassword, passwordVerification) {
1148
+ Object.assign(zipCrypto, {
1149
+ password,
1150
+ rawPassword,
1151
+ passwordVerification
1152
+ });
1153
+ createKeys2(zipCrypto, password, rawPassword);
1154
+ }
1155
+ function decrypt(target, input) {
1156
+ const output = new Uint8Array(input.length);
1157
+ for (let index = 0;index < input.length; index++) {
1158
+ output[index] = getByte(target) ^ input[index];
1159
+ updateKeys(target, output[index]);
1160
+ }
1161
+ return output;
1162
+ }
1163
+ function encrypt(target, input) {
1164
+ const output = new Uint8Array(input.length);
1165
+ for (let index = 0;index < input.length; index++) {
1166
+ output[index] = getByte(target) ^ input[index];
1167
+ updateKeys(target, input[index]);
1168
+ }
1169
+ return output;
1170
+ }
1171
+ function createKeys2(target, password, rawPassword) {
1172
+ const cryptoKeys = [305419896, 591751049, 878082192];
1173
+ Object.assign(target, {
1174
+ cryptoKeys,
1175
+ crcKey0: new Crc32(cryptoKeys[0]),
1176
+ crcKey2: new Crc32(cryptoKeys[2])
1177
+ });
1178
+ if (rawPassword) {
1179
+ for (let index = 0;index < rawPassword.length; index++) {
1180
+ updateKeys(target, rawPassword[index]);
1181
+ }
1182
+ } else {
1183
+ for (let index = 0;index < password.length; index++) {
1184
+ updateKeys(target, password.charCodeAt(index));
1185
+ }
1186
+ }
1187
+ }
1188
+ function updateKeys(target, byte) {
1189
+ let [, key1] = target.cryptoKeys;
1190
+ target.crcKey0.append([byte]);
1191
+ const key0 = ~target.crcKey0.get();
1192
+ key1 = getInt32(Math.imul(getInt32(key1 + getInt8(key0)), 134775813) + 1);
1193
+ target.crcKey2.append([key1 >>> 24]);
1194
+ const key2 = ~target.crcKey2.get();
1195
+ target.cryptoKeys = [key0, key1, key2];
1196
+ }
1197
+ function getByte(target) {
1198
+ const temp = target.cryptoKeys[2] | 2;
1199
+ return getInt8(Math.imul(temp, temp ^ 1) >>> 8);
1200
+ }
1201
+ function getInt8(number) {
1202
+ return number & 255;
1203
+ }
1204
+ function getInt32(number) {
1205
+ return number & 4294967295;
1206
+ }
1207
+
1208
+ // node_modules/@zip.js/zip.js/lib/core/util/compatible-streams.js
1209
+ function toCompatibleReadable(readable) {
1210
+ if (readable instanceof ReadableStream) {
1211
+ return readable;
1212
+ }
1213
+ const reader = readable.getReader();
1214
+ return new ReadableStream({
1215
+ async pull(controller) {
1216
+ try {
1217
+ const { value, done } = await reader.read();
1218
+ if (done) {
1219
+ controller.close();
1220
+ } else {
1221
+ controller.enqueue(value);
1222
+ }
1223
+ } catch (error) {
1224
+ reader.cancel(error).catch(() => {});
1225
+ throw error;
1226
+ }
1227
+ },
1228
+ cancel(reason) {
1229
+ return reader.cancel(reason);
1230
+ }
1231
+ });
1232
+ }
1233
+ function streamToBlob(readable, contentType) {
1234
+ readable = toCompatibleReadable(readable);
1235
+ const blobOptions = contentType ? { type: contentType } : {};
1236
+ if (responseSupportsGlobalReadable()) {
1237
+ return new Response(readable).blob().then((blob) => contentType ? new Blob([blob], blobOptions) : blob);
1238
+ }
1239
+ const chunks = [];
1240
+ return readable.pipeTo(new WritableStream({
1241
+ write(chunk) {
1242
+ chunks.push(chunk);
1243
+ }
1244
+ })).then(() => new Blob(chunks, blobOptions));
1245
+ }
1246
+ function responseSupportsGlobalReadable() {
1247
+ return typeof Blob.prototype.stream != FUNCTION_TYPE || new Blob([]).stream() instanceof ReadableStream;
1248
+ }
1249
+ function toCompatibleWritable(writable) {
1250
+ if (writable instanceof WritableStream) {
1251
+ return writable;
1252
+ }
1253
+ const writer = writable.getWriter();
1254
+ return new WritableStream({
1255
+ write(chunk) {
1256
+ return writer.write(chunk);
1257
+ },
1258
+ close() {
1259
+ return writer.close();
1260
+ },
1261
+ abort(reason) {
1262
+ return writer.abort(reason);
1263
+ }
1264
+ });
1265
+ }
1266
+
1267
+ // node_modules/@zip.js/zip.js/lib/core/util/error.js
1268
+ function isErrorObject(error) {
1269
+ return Boolean(error) && typeof error == "object";
1270
+ }
1271
+
1272
+ // node_modules/@zip.js/zip.js/lib/core/streams/zip-entry-stream.js
1273
+ var ERR_INVALID_UNCOMPRESSED_SIZE2 = "Invalid uncompressed size";
1274
+ var ERR_INVALID_COMPRESSED_DATA2 = "Invalid compressed data";
1275
+ var ERR_CODEC_OUT_OF_MEMORY2 = "Codec out of memory";
1276
+ var ERR_INVALID_CRC322 = "Invalid CRC32";
1277
+ var Z_MEM_ERROR_CODE = "Z_MEM_ERROR";
1278
+ var FORMAT_DEFLATE_RAW = "deflate-raw";
1279
+ var FORMAT_DEFLATE64_RAW = "deflate64-raw";
1280
+ var FORMAT_GZIP = "gzip";
1281
+ var GZIP_HEADER_LENGTH = 10;
1282
+ var GZIP_TRAILER_LENGTH = 8;
1283
+ var GZIP_HEADER_BYTES = [31, 139, 8];
1284
+
1285
+ class DeflateStream extends TransformStream {
1286
+ constructor(options, { chunkSize, CompressionStreamFallback, CompressionStream: CompressionStream2 }) {
1287
+ super({});
1288
+ const { compressed, encrypted, useCompressionStream, zipCrypto, computeCrc32, level, deflate64, format, compressionMethod, inputSize } = options;
1289
+ const stream = this;
1290
+ let crc32Stream, encryptionStream, gzipCrc32Stream;
1291
+ let readable = super.readable;
1292
+ const codecStreams = format && getCodecStreams(format);
1293
+ const GzipCompressionStream = getGzipCodecStream(useCompressionStream, CompressionStream2, CompressionStreamFallback);
1294
+ const useGzipCrc32 = computeCrc32 && compressed && !deflate64 && !codecStreams && (!encrypted || zipCrypto) && Boolean(GzipCompressionStream);
1295
+ if ((!encrypted || zipCrypto) && computeCrc32 && !useGzipCrc32) {
1296
+ crc32Stream = new Crc32Stream;
1297
+ readable = pipeThrough(readable, crc32Stream);
1298
+ }
1299
+ if (compressed) {
1300
+ if (codecStreams) {
1301
+ readable = pipeThroughBackpressured(readable, createCodecStream(codecStreams.CompressionStream, format, { level, chunkSize, compressionMethod, uncompressedSize: inputSize }));
1302
+ } else if (useGzipCrc32) {
1303
+ gzipCrc32Stream = new GzipToRawDeflateStream;
1304
+ readable = pipeThroughBackpressured(readable, new GzipCompressionStream(FORMAT_GZIP, { level, chunkSize }));
1305
+ readable = pipeThrough(readable, gzipCrc32Stream);
1306
+ } else {
1307
+ try {
1308
+ readable = pipeThroughCompressionStream(readable, useCompressionStream, { level, chunkSize }, CompressionStream2, CompressionStreamFallback);
1309
+ } catch (error) {
1310
+ if (!useCompressionStream && CompressionStreamFallback) {
1311
+ throw mapMemoryError(error);
1312
+ }
1313
+ let gzipStream;
1314
+ try {
1315
+ gzipStream = new CompressionStream2(FORMAT_GZIP);
1316
+ } catch {
1317
+ throw mapMemoryError(error);
1318
+ }
1319
+ readable = pipeThroughBackpressured(readable, gzipStream);
1320
+ readable = pipeThrough(readable, new GzipToRawDeflateStream);
1321
+ }
1322
+ }
1323
+ }
1324
+ if (encrypted) {
1325
+ if (zipCrypto) {
1326
+ readable = pipeThrough(readable, new ZipCryptoEncryptionStream(options));
1327
+ } else {
1328
+ encryptionStream = new AESEncryptionStream(options);
1329
+ readable = pipeThrough(readable, encryptionStream);
1330
+ }
1331
+ }
1332
+ setReadable(stream, readable, () => {
1333
+ if ((!encrypted || zipCrypto) && computeCrc32) {
1334
+ stream.crc32 = useGzipCrc32 ? gzipCrc32Stream.crc32 : new DataView(crc32Stream.value.buffer).getUint32(0);
1335
+ }
1336
+ });
1337
+ }
1338
+ }
1339
+
1340
+ class GzipToRawDeflateStream extends TransformStream {
1341
+ constructor() {
1342
+ let stream;
1343
+ let headerBytesLeft = GZIP_HEADER_LENGTH;
1344
+ let trailerCandidate = new Uint8Array(0);
1345
+ super({
1346
+ transform(chunk, controller) {
1347
+ if (headerBytesLeft) {
1348
+ const droppedLength = Math.min(headerBytesLeft, chunk.length);
1349
+ headerBytesLeft -= droppedLength;
1350
+ chunk = chunk.subarray(droppedLength);
1351
+ if (!chunk.length) {
1352
+ return;
1353
+ }
1354
+ }
1355
+ const availableLength = trailerCandidate.length + chunk.length;
1356
+ if (availableLength <= GZIP_TRAILER_LENGTH) {
1357
+ trailerCandidate = concat(trailerCandidate, chunk);
1358
+ return;
1359
+ }
1360
+ const emitLength = availableLength - GZIP_TRAILER_LENGTH;
1361
+ const emittedFromTrailer = Math.min(emitLength, trailerCandidate.length);
1362
+ controller.enqueue(concat(trailerCandidate.subarray(0, emittedFromTrailer), chunk.subarray(0, emitLength - emittedFromTrailer)));
1363
+ trailerCandidate = concat(trailerCandidate.subarray(emittedFromTrailer), chunk.subarray(emitLength - emittedFromTrailer));
1364
+ },
1365
+ flush() {
1366
+ const dataView = getDataView(trailerCandidate);
1367
+ stream.crc32 = dataView.getUint32(0, true);
1368
+ stream.uncompressedSize = dataView.getUint32(4, true);
1369
+ }
1370
+ });
1371
+ stream = this;
1372
+ }
1373
+ }
1374
+ function pipeThroughGzipDecompressionStream(readable, gzipStream, outputSize, crc32, sourceErrors) {
1375
+ const writer = gzipStream.writable.getWriter();
1376
+ const reader = gzipStream.readable.getReader();
1377
+ const outputCrc32 = crc32 === UNDEFINED_VALUE ? new Crc32 : UNDEFINED_VALUE;
1378
+ let outputLength = 0;
1379
+ let trailerWritten = false;
1380
+ let settled = false;
1381
+ let resolvePull, controller;
1382
+ const output = new ReadableStream({
1383
+ start(streamController) {
1384
+ controller = streamController;
1385
+ },
1386
+ pull() {
1387
+ resumePump();
1388
+ },
1389
+ cancel(reason) {
1390
+ settled = true;
1391
+ resumePump();
1392
+ return reader.cancel(reason);
1393
+ }
1394
+ });
1395
+ pump();
1396
+ drain();
1397
+ return output;
1398
+ async function pump() {
1399
+ const inputReader = readable.getReader();
1400
+ try {
1401
+ const header = new Uint8Array(GZIP_HEADER_LENGTH);
1402
+ header.set(GZIP_HEADER_BYTES);
1403
+ await writer.write(header);
1404
+ for (;; ) {
1405
+ await outputCapacity();
1406
+ await writer.ready;
1407
+ const { value, done } = await readSource(inputReader, sourceErrors);
1408
+ if (done) {
1409
+ break;
1410
+ }
1411
+ await writer.write(value);
1412
+ }
1413
+ if (outputCrc32) {
1414
+ await writer.write(new Uint8Array(0));
1415
+ }
1416
+ const trailer = new Uint8Array(GZIP_TRAILER_LENGTH);
1417
+ const dataView = getDataView(trailer);
1418
+ dataView.setUint32(0, outputCrc32 ? outputCrc32.get() : crc32, true);
1419
+ dataView.setUint32(4, outputSize, true);
1420
+ trailerWritten = true;
1421
+ await writer.write(trailer);
1422
+ await writer.close();
1423
+ } catch (error) {
1424
+ await abort(writer, error);
1425
+ await cancel(inputReader, error);
1426
+ }
1427
+ }
1428
+ async function drain() {
1429
+ try {
1430
+ for (;; ) {
1431
+ const { value, done } = await read();
1432
+ if (done) {
1433
+ break;
1434
+ }
1435
+ outputLength += value.length;
1436
+ if (outputLength > outputSize) {
1437
+ throw new Error(ERR_INVALID_UNCOMPRESSED_SIZE2);
1438
+ }
1439
+ if (outputCrc32) {
1440
+ outputCrc32.append(value);
1441
+ }
1442
+ controller.enqueue(value);
1443
+ }
1444
+ if (!settled) {
1445
+ settled = true;
1446
+ controller.close();
1447
+ }
1448
+ } catch (error) {
1449
+ fail(error);
1450
+ await cancel(reader, error);
1451
+ }
1452
+ }
1453
+ function read() {
1454
+ return reader.read().catch((error) => {
1455
+ if (trailerWritten) {
1456
+ if (!outputCrc32) {
1457
+ throw mapError(error, ERR_INVALID_CRC322);
1458
+ }
1459
+ if (outputLength != outputSize) {
1460
+ throw mapError(error, ERR_INVALID_UNCOMPRESSED_SIZE2);
1461
+ }
1462
+ return { done: true };
1463
+ }
1464
+ throw mapCodecError(error, sourceErrors);
1465
+ });
1466
+ }
1467
+ function outputCapacity() {
1468
+ if (!settled && controller.desiredSize <= 0) {
1469
+ return new Promise((resolve) => resolvePull = resolve);
1470
+ }
1471
+ }
1472
+ function resumePump() {
1473
+ if (resolvePull) {
1474
+ const resolve = resolvePull;
1475
+ resolvePull = UNDEFINED_VALUE;
1476
+ resolve();
1477
+ }
1478
+ }
1479
+ function fail(error) {
1480
+ if (!settled) {
1481
+ settled = true;
1482
+ controller.error(error);
1483
+ resumePump();
1484
+ }
1485
+ }
1486
+ }
1487
+
1488
+ class InflateStream extends TransformStream {
1489
+ constructor(options, { chunkSize, DecompressionStreamFallback, DecompressionStream: DecompressionStream2 }) {
1490
+ super({});
1491
+ const { zipCrypto, encrypted, checkCrc32, crc32, compressed, useCompressionStream, deflate64, format, compressionMethod, rawBitFlag, outputSize } = options;
1492
+ let crc32Stream, decryptionStream, gzipCrc32;
1493
+ let readable = super.readable;
1494
+ if (encrypted) {
1495
+ if (zipCrypto) {
1496
+ readable = pipeThrough(readable, new ZipCryptoDecryptionStream(options));
1497
+ } else {
1498
+ decryptionStream = new AESDecryptionStream(options);
1499
+ readable = pipeThrough(readable, decryptionStream);
1500
+ }
1501
+ }
1502
+ if (compressed) {
1503
+ const sourceErrors = new Set;
1504
+ const codecStreams = format && getCodecStreams(format);
1505
+ let gzipStream;
1506
+ if (codecStreams) {
1507
+ readable = pipeThroughBackpressured(readable, createCodecStream(codecStreams.DecompressionStream, format, { chunkSize, compressionMethod, rawBitFlag, uncompressedSize: outputSize }), sourceErrors);
1508
+ } else {
1509
+ const GzipDecompressionStream = getGzipCodecStream(useCompressionStream, DecompressionStream2, DecompressionStreamFallback);
1510
+ if (checkCrc32 && !deflate64 && crc32 !== UNDEFINED_VALUE && outputSize !== UNDEFINED_VALUE && GzipDecompressionStream) {
1511
+ try {
1512
+ gzipStream = new GzipDecompressionStream(FORMAT_GZIP, { chunkSize });
1513
+ } catch {
1514
+ gzipStream = UNDEFINED_VALUE;
1515
+ }
1516
+ }
1517
+ if (!gzipStream) {
1518
+ try {
1519
+ readable = pipeThroughCompressionStream(readable, useCompressionStream, { chunkSize, deflate64 }, DecompressionStream2, DecompressionStreamFallback, sourceErrors);
1520
+ } catch (error) {
1521
+ if (deflate64 || outputSize === UNDEFINED_VALUE || !useCompressionStream && DecompressionStreamFallback) {
1522
+ throw mapMemoryError(error);
1523
+ }
1524
+ try {
1525
+ gzipStream = new DecompressionStream2(FORMAT_GZIP);
1526
+ } catch {
1527
+ throw mapMemoryError(error);
1528
+ }
1529
+ }
1530
+ }
1531
+ }
1532
+ if (gzipStream) {
1533
+ gzipCrc32 = true;
1534
+ readable = pipeThroughGzipDecompressionStream(readable, gzipStream, outputSize, crc32, sourceErrors);
1535
+ } else {
1536
+ readable = mapInflateStreamError(readable, sourceErrors);
1537
+ }
1538
+ }
1539
+ if (checkCrc32 && !gzipCrc32) {
1540
+ crc32Stream = new Crc32Stream;
1541
+ readable = pipeThrough(readable, crc32Stream);
1542
+ }
1543
+ setReadable(this, readable, () => {
1544
+ if (crc32Stream) {
1545
+ const computedCrc32 = new DataView(crc32Stream.value.buffer).getUint32(0, false);
1546
+ if (crc32 != computedCrc32) {
1547
+ throw new Error(ERR_INVALID_CRC322);
1548
+ }
1549
+ }
1550
+ });
1551
+ }
1552
+ }
1553
+ var formatSupportByStream = new Map;
1554
+ function supportsFormat(StreamClass, format) {
1555
+ if (!StreamClass) {
1556
+ return false;
1557
+ }
1558
+ let supportByFormat = formatSupportByStream.get(StreamClass);
1559
+ if (!supportByFormat) {
1560
+ supportByFormat = new Map;
1561
+ formatSupportByStream.set(StreamClass, supportByFormat);
1562
+ }
1563
+ let supported = supportByFormat.get(format);
1564
+ if (supported === UNDEFINED_VALUE) {
1565
+ try {
1566
+ new StreamClass(format);
1567
+ supported = true;
1568
+ } catch {
1569
+ supported = false;
1570
+ }
1571
+ supportByFormat.set(format, supported);
1572
+ }
1573
+ return supported;
1574
+ }
1575
+ function supportsDeflateRaw(StreamClass) {
1576
+ return supportsFormat(StreamClass, FORMAT_DEFLATE_RAW);
1577
+ }
1578
+ function setReadable(stream, readable, flush) {
1579
+ readable = pipeThrough(readable, new TransformStream({ flush }));
1580
+ Object.defineProperty(stream, "readable", {
1581
+ get() {
1582
+ return readable;
1583
+ }
1584
+ });
1585
+ }
1586
+ function createCodecStream(CodecStreamClass, format, options) {
1587
+ if (!CodecStreamClass) {
1588
+ throw new Error(ERR_UNSUPPORTED_COMPRESSION2);
1589
+ }
1590
+ return new CodecStreamClass(format, options);
1591
+ }
1592
+ function getGzipCodecStream(useCompressionStream, CodecStreamNative, CodecStreamFallback) {
1593
+ if (useCompressionStream && CodecStreamNative) {
1594
+ return CodecStreamNative;
1595
+ } else if (CodecStreamFallback && CodecStreamFallback.requiresModule) {
1596
+ return CodecStreamFallback;
1597
+ }
1598
+ }
1599
+ function pipeThroughCompressionStream(readable, useCompressionStream, options, CompressionStreamNative, CompressionStreamFallback, sourceErrors) {
1600
+ const Stream = useCompressionStream && CompressionStreamNative ? CompressionStreamNative : CompressionStreamFallback || CompressionStreamNative;
1601
+ const format = options.deflate64 ? FORMAT_DEFLATE64_RAW : FORMAT_DEFLATE_RAW;
1602
+ let codecStream;
1603
+ try {
1604
+ codecStream = new Stream(format, options);
1605
+ } catch (error) {
1606
+ if (useCompressionStream && CompressionStreamFallback && Stream != CompressionStreamFallback) {
1607
+ codecStream = new CompressionStreamFallback(format, options);
1608
+ } else {
1609
+ throw error;
1610
+ }
1611
+ }
1612
+ return pipeThroughBackpressured(readable, codecStream, sourceErrors);
1613
+ }
1614
+ function pipeThrough(readable, transformStream) {
1615
+ return toCompatibleReadable(readable).pipeThrough(transformStream);
1616
+ }
1617
+ function pipeThroughBackpressured(readable, transformStream, sourceErrors) {
1618
+ const writer = transformStream.writable.getWriter();
1619
+ const reader = readable.getReader();
1620
+ pump();
1621
+ return transformStream.readable;
1622
+ async function pump() {
1623
+ try {
1624
+ for (;; ) {
1625
+ await writer.ready;
1626
+ const result = await readSource(reader, sourceErrors);
1627
+ if (result.done) {
1628
+ await writer.close();
1629
+ break;
1630
+ }
1631
+ await writer.write(result.value);
1632
+ }
1633
+ } catch (error) {
1634
+ await abort(writer, error);
1635
+ await cancel(reader, error);
1636
+ }
1637
+ }
1638
+ }
1639
+ async function abort(writer, error) {
1640
+ try {
1641
+ await writer.abort(error);
1642
+ } catch {}
1643
+ }
1644
+ async function cancel(reader, error) {
1645
+ try {
1646
+ await reader.cancel(error);
1647
+ } catch {}
1648
+ }
1649
+ function readSource(reader, sourceErrors) {
1650
+ const result = reader.read();
1651
+ return sourceErrors ? result.catch((error) => {
1652
+ sourceErrors.add(error);
1653
+ throw error;
1654
+ }) : result;
1655
+ }
1656
+ function mapCodecError(error, sourceErrors) {
1657
+ if (sourceErrors.has(error)) {
1658
+ return error;
1659
+ }
1660
+ return mapError(error, isMemoryError(error) ? ERR_CODEC_OUT_OF_MEMORY2 : ERR_INVALID_COMPRESSED_DATA2);
1661
+ }
1662
+ function mapMemoryError(error) {
1663
+ return isMemoryError(error) ? mapError(error, ERR_CODEC_OUT_OF_MEMORY2) : error;
1664
+ }
1665
+ function isMemoryError(error) {
1666
+ return isErrorObject(error) && error.code == Z_MEM_ERROR_CODE;
1667
+ }
1668
+ function mapError(error, message) {
1669
+ const mappedError = new Error(message);
1670
+ mappedError.cause = error;
1671
+ return mappedError;
1672
+ }
1673
+ function mapInflateStreamError(readable, sourceErrors) {
1674
+ const reader = readable.getReader();
1675
+ return new ReadableStream({
1676
+ async pull(controller) {
1677
+ try {
1678
+ const { value, done } = await reader.read();
1679
+ if (done) {
1680
+ controller.close();
1681
+ } else {
1682
+ controller.enqueue(value);
1683
+ }
1684
+ } catch (error) {
1685
+ await cancel(reader, error);
1686
+ throw mapCodecError(error, sourceErrors);
1687
+ }
1688
+ },
1689
+ cancel(reason) {
1690
+ return reader.cancel(reason);
1691
+ }
1692
+ });
1693
+ }
1694
+
1695
+ // node_modules/@zip.js/zip.js/lib/core/streams/codec-stream.js
1696
+ var DEFAULT_CHUNK_SIZE2 = 256 * 1024;
1697
+ var MESSAGE_EVENT_TYPE = "message";
1698
+ var MESSAGE_START = "start";
1699
+ var MESSAGE_PULL = "pull";
1700
+ var MESSAGE_DATA = "data";
1701
+ var MESSAGE_ACK_DATA = "ack";
1702
+ var MESSAGE_CLOSE = "close";
1703
+ var CODEC_DEFLATE = "deflate";
1704
+ var CODEC_INFLATE = "inflate";
1705
+ class CodecStream extends TransformStream {
1706
+ constructor(options, config) {
1707
+ super({});
1708
+ const codec = this;
1709
+ const { codecType } = options;
1710
+ let Stream;
1711
+ if (codecType.startsWith(CODEC_DEFLATE)) {
1712
+ Stream = DeflateStream;
1713
+ } else if (codecType.startsWith(CODEC_INFLATE)) {
1714
+ Stream = InflateStream;
1715
+ }
1716
+ codec.outputSize = 0;
1717
+ let inputSize = 0;
1718
+ const stream = new Stream(options, config);
1719
+ const readable = super.readable;
1720
+ const inputSizeStream = new TransformStream({
1721
+ transform(chunk, controller) {
1722
+ if (chunk && chunk.length) {
1723
+ inputSize += chunk.length;
1724
+ controller.enqueue(chunk);
1725
+ }
1726
+ },
1727
+ flush() {
1728
+ Object.assign(codec, {
1729
+ inputSize
1730
+ });
1731
+ }
1732
+ });
1733
+ const outputSizeStream = new TransformStream({
1734
+ transform(chunk, controller) {
1735
+ if (chunk && chunk.length) {
1736
+ controller.enqueue(chunk);
1737
+ codec.outputSize += chunk.length;
1738
+ if (options.outputSize !== UNDEFINED_VALUE && codec.outputSize > options.outputSize) {
1739
+ throw new Error(ERR_INVALID_UNCOMPRESSED_SIZE2);
1740
+ }
1741
+ }
1742
+ },
1743
+ flush() {
1744
+ const { crc32 } = stream;
1745
+ Object.assign(codec, {
1746
+ crc32,
1747
+ inputSize
1748
+ });
1749
+ }
1750
+ });
1751
+ Object.defineProperty(codec, "readable", {
1752
+ get() {
1753
+ return readable.pipeThrough(inputSizeStream).pipeThrough(stream).pipeThrough(outputSizeStream);
1754
+ }
1755
+ });
1756
+ }
1757
+ }
1758
+
1759
+ class ChunkStream extends TransformStream {
1760
+ constructor(chunkSize) {
1761
+ const pendingChunks = [];
1762
+ let pendingLength = 0;
1763
+ let outputSize = 0;
1764
+ if (!Number.isFinite(chunkSize) || chunkSize < 1) {
1765
+ chunkSize = DEFAULT_CHUNK_SIZE2;
1766
+ }
1767
+ super({
1768
+ transform(chunk, controller) {
1769
+ pendingChunks.push(chunk);
1770
+ pendingLength += chunk.length;
1771
+ while (pendingLength > chunkSize) {
1772
+ outputSize += chunkSize;
1773
+ controller.enqueue(shiftChunk());
1774
+ }
1775
+ },
1776
+ flush(controller) {
1777
+ if (pendingLength) {
1778
+ outputSize += pendingLength;
1779
+ controller.enqueue(concatChunks(pendingChunks, pendingLength));
1780
+ }
1781
+ }
1782
+ });
1783
+ Object.defineProperty(this, "outputSize", {
1784
+ get: () => outputSize
1785
+ });
1786
+ function shiftChunk() {
1787
+ const result = new Uint8Array(chunkSize);
1788
+ let resultOffset = 0;
1789
+ while (resultOffset < chunkSize) {
1790
+ const firstChunk = pendingChunks[0];
1791
+ const remainingLength = chunkSize - resultOffset;
1792
+ if (firstChunk.length <= remainingLength) {
1793
+ result.set(firstChunk, resultOffset);
1794
+ resultOffset += firstChunk.length;
1795
+ pendingChunks.shift();
1796
+ } else {
1797
+ result.set(firstChunk.subarray(0, remainingLength), resultOffset);
1798
+ pendingChunks[0] = firstChunk.subarray(remainingLength);
1799
+ resultOffset += remainingLength;
1800
+ }
1801
+ }
1802
+ pendingLength -= chunkSize;
1803
+ return result;
1804
+ }
1805
+ function concatChunks(chunks, length) {
1806
+ const result = new Uint8Array(length);
1807
+ let offset = 0;
1808
+ for (const chunk of chunks) {
1809
+ result.set(chunk, offset);
1810
+ offset += chunk.length;
1811
+ }
1812
+ return result;
1813
+ }
1814
+ }
1815
+ }
1816
+
1817
+ // node_modules/@zip.js/zip.js/lib/core/codec-worker.js
1818
+ var ERR_WORKER_STARTUP_TIMEOUT2 = "Worker startup timeout";
1819
+ var webWorkerSupported;
1820
+ var createWorkerFailed;
1821
+ var webWorkerBackend;
1822
+ var initModule = () => {};
1823
+ function configureWorker({ initModule: initModuleFunction }) {
1824
+ initModule = initModuleFunction;
1825
+ }
1826
+ function setWebWorkerBackend(backend) {
1827
+ webWorkerBackend = backend;
1828
+ }
1829
+ async function loadModule(config) {
1830
+ if (initModule) {
1831
+ try {
1832
+ await initModule(config);
1833
+ return true;
1834
+ } catch {}
1835
+ }
1836
+ return false;
1837
+ }
1838
+ function disableWebWorker(workerData) {
1839
+ if (workerData.createWorker) {
1840
+ createWorkerFailed = true;
1841
+ } else {
1842
+ webWorkerSupported = false;
1843
+ }
1844
+ }
1845
+
1846
+ class CodecWorker {
1847
+ constructor(workerData, { readable, writable }, workerOptions, onTaskFinished) {
1848
+ const { options, config, streamOptions, useWebWorkers, workerURI } = workerOptions;
1849
+ let { createWorker } = workerOptions;
1850
+ const { signal } = streamOptions;
1851
+ if (createWorkerFailed) {
1852
+ createWorker = UNDEFINED_VALUE;
1853
+ }
1854
+ Object.assign(workerData, {
1855
+ busy: true,
1856
+ generation: (workerData.generation || 0) + 1,
1857
+ readable: readable.pipeThrough(new ChunkStream(getChunkSize(config))).pipeThrough(new ProgressWatcherStream(streamOptions), { signal }),
1858
+ writable,
1859
+ options: Object.assign({}, options),
1860
+ workerOptions,
1861
+ workerURI,
1862
+ createWorker,
1863
+ terminate() {
1864
+ return new Promise((resolve) => {
1865
+ const { worker, busy } = workerData;
1866
+ if (busy) {
1867
+ workerData.terminateResolvers = workerData.terminateResolvers || [];
1868
+ workerData.terminateResolvers.push(resolve);
1869
+ } else {
1870
+ if (worker) {
1871
+ worker.terminate();
1872
+ workerData.worker = null;
1873
+ }
1874
+ resolve();
1875
+ }
1876
+ workerData.interface = null;
1877
+ });
1878
+ },
1879
+ onTaskFinished() {
1880
+ if (workerData.busy) {
1881
+ const { terminateResolvers, worker } = workerData;
1882
+ if (terminateResolvers) {
1883
+ workerData.terminateResolvers = null;
1884
+ if (worker) {
1885
+ workerData.terminated = true;
1886
+ worker.terminate();
1887
+ }
1888
+ }
1889
+ workerData.busy = false;
1890
+ const pendingTasks = onTaskFinished(workerData);
1891
+ if (terminateResolvers) {
1892
+ terminateResolvers.forEach((resolve) => resolve(pendingTasks));
1893
+ }
1894
+ }
1895
+ }
1896
+ });
1897
+ if (webWorkerSupported === UNDEFINED_VALUE) {
1898
+ webWorkerSupported = typeof Worker != UNDEFINED_TYPE;
1899
+ }
1900
+ return (useWebWorkers && webWorkerBackend && (webWorkerSupported && workerURI || createWorker) ? webWorkerBackend : createWorkerInterface)(workerData, config);
1901
+ }
1902
+ }
1903
+
1904
+ class ProgressWatcherStream extends TransformStream {
1905
+ constructor({ onstart, onprogress, size, onend }) {
1906
+ let chunkOffset = 0;
1907
+ super({
1908
+ async start() {
1909
+ if (onstart) {
1910
+ await callHandler(onstart, size);
1911
+ }
1912
+ },
1913
+ async transform(chunk, controller) {
1914
+ chunkOffset += chunk.length;
1915
+ if (onprogress) {
1916
+ await callHandler(onprogress, chunkOffset, size);
1917
+ }
1918
+ controller.enqueue(chunk);
1919
+ },
1920
+ async flush() {
1921
+ if (onend) {
1922
+ await callHandler(onend, chunkOffset);
1923
+ }
1924
+ }
1925
+ });
1926
+ }
1927
+ }
1928
+ async function callHandler(handler, ...parameters) {
1929
+ try {
1930
+ await handler(...parameters);
1931
+ } catch {}
1932
+ }
1933
+ function createWorkerInterface(workerData, config) {
1934
+ return {
1935
+ run: () => runWorker(workerData, config)
1936
+ };
1937
+ }
1938
+ async function runWorker({ options, readable, writable, onTaskFinished, workerOptions }, config) {
1939
+ let codecStream, chunkStream, modulePromise;
1940
+ try {
1941
+ if (options.compressed && !options.format) {
1942
+ const deflate = options.codecType.startsWith(CODEC_DEFLATE);
1943
+ const FallbackStream = deflate ? config.CompressionStreamFallback : config.DecompressionStreamFallback;
1944
+ const NativeStream = deflate ? config.CompressionStream : config.DecompressionStream;
1945
+ if (!options.useCompressionStream) {
1946
+ if (!await moduleLoaded() && (!FallbackStream || FallbackStream.requiresModule)) {
1947
+ options.useCompressionStream = true;
1948
+ }
1949
+ } else if (FallbackStream && FallbackStream.requiresModule && !supportsDeflateRaw(NativeStream)) {
1950
+ await moduleLoaded();
1951
+ }
1952
+ }
1953
+ if (options.encrypted && !options.zipCrypto) {
1954
+ await moduleLoaded();
1955
+ }
1956
+ codecStream = new CodecStream(options, config);
1957
+ chunkStream = new ChunkStream(getChunkSize(config));
1958
+ const { signal } = workerOptions.streamOptions;
1959
+ await readable.pipeThrough(codecStream).pipeThrough(chunkStream).pipeTo(writable, { preventClose: true, preventAbort: true, signal });
1960
+ const {
1961
+ crc32,
1962
+ inputSize,
1963
+ outputSize
1964
+ } = codecStream;
1965
+ return {
1966
+ crc32,
1967
+ inputSize,
1968
+ outputSize
1969
+ };
1970
+ } catch (error) {
1971
+ if (codecStream) {
1972
+ const outputSize = chunkStream ? chunkStream.outputSize : 0;
1973
+ workerOptions.outputSize = outputSize;
1974
+ if (isErrorObject(error)) {
1975
+ try {
1976
+ error.outputSize = outputSize;
1977
+ } catch {}
1978
+ }
1979
+ }
1980
+ throw error;
1981
+ } finally {
1982
+ onTaskFinished();
1983
+ }
1984
+ function moduleLoaded() {
1985
+ if (!modulePromise) {
1986
+ modulePromise = loadModule(config);
1987
+ }
1988
+ return modulePromise;
1989
+ }
1990
+ }
1991
+
1992
+ // node_modules/@zip.js/zip.js/lib/core/codec-pool.js
1993
+ var pool = [];
1994
+ var pendingRequests = [];
1995
+ var starvationTimeout;
1996
+ var starvationDelay;
1997
+ var indexWorker = 0;
1998
+ async function runWorker2(stream, workerOptions) {
1999
+ const { options, config } = workerOptions;
2000
+ const { useWebWorkers, useCompressionStream, compressed, checkCrc32, computeCrc32, encrypted, format, codecURI } = options;
2001
+ const { workerURI, createWorker, maxWorkers } = config;
2002
+ if (format) {
2003
+ if (codecURI) {
2004
+ options.codecURI = resolveCodecURI(codecURI, config.baseURI);
2005
+ }
2006
+ await ensureCodecStreams(format, options.codecURI);
2007
+ }
2008
+ const streamCopy = !compressed && !checkCrc32 && !computeCrc32 && !encrypted;
2009
+ const workerSupported = format === UNDEFINED_VALUE || Boolean(options.codecURI);
2010
+ workerOptions.useWebWorkers = !streamCopy && workerSupported && (useWebWorkers || useWebWorkers === UNDEFINED_VALUE && config.useWebWorkers);
2011
+ workerOptions.workerURI = workerOptions.useWebWorkers && workerURI ? workerURI : UNDEFINED_VALUE;
2012
+ workerOptions.createWorker = workerOptions.useWebWorkers && createWorker ? createWorker : UNDEFINED_VALUE;
2013
+ options.useCompressionStream = useCompressionStream || useCompressionStream === UNDEFINED_VALUE && config.useCompressionStream;
2014
+ return (await getWorker()).run();
2015
+ async function getWorker() {
2016
+ const workerData = pool.find((workerData) => !workerData.busy);
2017
+ if (workerData) {
2018
+ clearTerminateTimeout(workerData);
2019
+ return new CodecWorker(workerData, stream, workerOptions, onTaskFinished);
2020
+ } else if (pool.length < maxWorkers) {
2021
+ const workerData = { indexWorker };
2022
+ indexWorker++;
2023
+ pool.push(workerData);
2024
+ return new CodecWorker(workerData, stream, workerOptions, onTaskFinished);
2025
+ } else {
2026
+ return new Promise((resolve) => {
2027
+ pendingRequests.push({ resolve, stream, workerOptions });
2028
+ starvationDelay = config.workerStarvationTimeout;
2029
+ armStarvationTimeout();
2030
+ });
2031
+ }
2032
+ }
2033
+ function onTaskFinished(workerData) {
2034
+ clearStarvationTimeout();
2035
+ if (workerData.terminated) {
2036
+ workerData.terminated = false;
2037
+ return runPendingRequestsInline();
2038
+ } else if (pendingRequests.length) {
2039
+ const [{ resolve, stream, workerOptions }] = pendingRequests.splice(0, 1);
2040
+ resolve(new CodecWorker(workerData, stream, workerOptions, onTaskFinished));
2041
+ armStarvationTimeout();
2042
+ } else if (workerData.worker) {
2043
+ clearTerminateTimeout(workerData);
2044
+ terminateWorker(workerData, workerOptions);
2045
+ } else {
2046
+ pool = pool.filter((data) => data != workerData);
2047
+ }
2048
+ }
2049
+ }
2050
+ function resolveCodecURI(codecURI, baseURI) {
2051
+ try {
2052
+ return new URL(codecURI, baseURI).toString();
2053
+ } catch {
2054
+ return codecURI;
2055
+ }
2056
+ }
2057
+ function armStarvationTimeout() {
2058
+ if (!starvationTimeout && pendingRequests.length && Number.isFinite(starvationDelay) && starvationDelay >= 0) {
2059
+ starvationTimeout = setTimeout(onWorkerStarvation, starvationDelay);
2060
+ }
2061
+ }
2062
+ function clearStarvationTimeout() {
2063
+ if (starvationTimeout) {
2064
+ clearTimeout(starvationTimeout);
2065
+ starvationTimeout = null;
2066
+ }
2067
+ }
2068
+ function onWorkerStarvation() {
2069
+ starvationTimeout = null;
2070
+ if (pendingRequests.length) {
2071
+ const [{ resolve, stream, workerOptions }] = pendingRequests.splice(0, 1);
2072
+ resolve(new CodecWorker({}, stream, getInlineWorkerOptions(workerOptions), onInlineTaskFinished));
2073
+ armStarvationTimeout();
2074
+ }
2075
+ }
2076
+ function runPendingRequestsInline() {
2077
+ const tasks = pendingRequests.splice(0).map(({ resolve, stream, workerOptions }) => new Promise((resolveTask) => {
2078
+ resolve(new CodecWorker({}, stream, getInlineWorkerOptions(workerOptions), () => {
2079
+ onInlineTaskFinished();
2080
+ resolveTask();
2081
+ }));
2082
+ }));
2083
+ clearStarvationTimeout();
2084
+ return Promise.all(tasks);
2085
+ }
2086
+ function getInlineWorkerOptions(workerOptions) {
2087
+ return Object.assign({}, workerOptions, { useWebWorkers: false, workerURI: UNDEFINED_VALUE, createWorker: UNDEFINED_VALUE });
2088
+ }
2089
+ function onInlineTaskFinished() {
2090
+ clearStarvationTimeout();
2091
+ armStarvationTimeout();
2092
+ }
2093
+ function terminateWorker(workerData, workerOptions) {
2094
+ const { config } = workerOptions;
2095
+ const { terminateWorkerTimeout } = config;
2096
+ if (Number.isFinite(terminateWorkerTimeout) && terminateWorkerTimeout >= 0) {
2097
+ workerData.terminateTimeout = setTimeout(async () => {
2098
+ pool = pool.filter((data) => data != workerData);
2099
+ try {
2100
+ await workerData.terminate();
2101
+ } catch {}
2102
+ }, terminateWorkerTimeout);
2103
+ }
2104
+ }
2105
+ function clearTerminateTimeout(workerData) {
2106
+ const { terminateTimeout } = workerData;
2107
+ if (terminateTimeout) {
2108
+ clearTimeout(terminateTimeout);
2109
+ workerData.terminateTimeout = null;
2110
+ }
2111
+ }
2112
+
2113
+ // node_modules/@zip.js/zip.js/lib/core/util/decode-cp437.js
2114
+ var CP437 = "\x00☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ".split("");
2115
+ function decodeCP437(stringValue) {
2116
+ let result = "";
2117
+ for (let indexCharacter = 0;indexCharacter < stringValue.length; indexCharacter++) {
2118
+ result += CP437[stringValue[indexCharacter]];
2119
+ }
2120
+ return result;
2121
+ }
2122
+
2123
+ // node_modules/@zip.js/zip.js/lib/core/util/decode-text.js
2124
+ function decodeText(value, encoding) {
2125
+ return decode(value, encoding, true);
2126
+ }
2127
+ function isUTF8Text(value) {
2128
+ if (value.some((byte) => byte > 127)) {
2129
+ try {
2130
+ new TextDecoder("utf-8", { fatal: true }).decode(value);
2131
+ return true;
2132
+ } catch {
2133
+ return false;
2134
+ }
2135
+ } else {
2136
+ return false;
2137
+ }
2138
+ }
2139
+ function decode(value, encoding, ignoreBOM) {
2140
+ if (encoding && encoding.trim().toLowerCase() == "cp437") {
2141
+ return decodeCP437(value);
2142
+ } else {
2143
+ return new TextDecoder(encoding, { ignoreBOM }).decode(value);
2144
+ }
2145
+ }
2146
+
2147
+ // node_modules/@zip.js/zip.js/lib/core/io.js
2148
+ var ERR_ITERATOR_COMPLETED_TOO_SOON = "Writer iterator completed too soon";
2149
+ var ERR_WRITER_NOT_INITIALIZED = "Writer not initialized";
2150
+ var ERR_WRITER_SIZE_NOT_WRITABLE = "Invalid writer (size must be writable)";
2151
+ var DEFAULT_BUFFER_SIZE = 256 * 1024;
2152
+ var DEFAULT_MAXIMUM_RANGE_SIZE = 16 * 1024 * 1024;
2153
+ var END_OF_CENTRAL_DIR_SEARCH_LENGTH = END_OF_CENTRAL_DIR_LENGTH + MAX_16_BITS;
2154
+ var PROPERTY_NAME_WRITABLE = "writable";
2155
+ var DISK_BOUNDARY = Symbol();
2156
+
2157
+ class Stream {
2158
+ constructor() {
2159
+ this.size = 0;
2160
+ }
2161
+ init() {
2162
+ this.initialized = true;
2163
+ }
2164
+ }
2165
+
2166
+ class Reader extends Stream {
2167
+ get readable() {
2168
+ return this.createReadable();
2169
+ }
2170
+ createReadable({ offset = 0, size, chunkSize = getChunkSize(getConfiguration()) } = {}) {
2171
+ const reader = this;
2172
+ let chunkOffset = 0;
2173
+ chunkSize = normalizeChunkSize(chunkSize);
2174
+ return new ReadableStream({
2175
+ async pull(controller) {
2176
+ const dataSize = size === UNDEFINED_VALUE ? chunkSize : Math.min(chunkSize, size - chunkOffset);
2177
+ const data = await readUint8Array(reader, offset + chunkOffset, dataSize);
2178
+ if (data.length) {
2179
+ controller.enqueue(data);
2180
+ chunkOffset += data.length;
2181
+ }
2182
+ if (size !== UNDEFINED_VALUE && chunkOffset >= size || !data.length && dataSize) {
2183
+ controller.close();
2184
+ }
2185
+ }
2186
+ });
2187
+ }
2188
+ }
2189
+
2190
+ class Writer extends Stream {
2191
+ constructor() {
2192
+ super();
2193
+ const writer = this;
2194
+ const writable = new WritableStream({
2195
+ write(chunk) {
2196
+ if (!writer.initialized) {
2197
+ throw new Error(ERR_WRITER_NOT_INITIALIZED);
2198
+ }
2199
+ return writer.writeUint8Array(toExactUint8Array(chunk));
2200
+ }
2201
+ });
2202
+ Object.defineProperty(writer, PROPERTY_NAME_WRITABLE, {
2203
+ get() {
2204
+ return writable;
2205
+ }
2206
+ });
2207
+ }
2208
+ writeUint8Array() {}
2209
+ }
2210
+ var blobSliceReliable;
2211
+ var blobSliceProbe;
2212
+ function probeBlobSliceReliability() {
2213
+ blobSliceProbe = (async () => {
2214
+ try {
2215
+ const slicedBlob = new Blob([new Uint8Array(3)]).slice(1, 2);
2216
+ const streamReader = slicedBlob.stream().getReader();
2217
+ let streamedLength = 0;
2218
+ let result = await streamReader.read();
2219
+ while (!result.done) {
2220
+ streamedLength += result.value.length;
2221
+ result = await streamReader.read();
2222
+ }
2223
+ blobSliceReliable = streamedLength == 1;
2224
+ } catch {
2225
+ blobSliceReliable = false;
2226
+ }
2227
+ })();
2228
+ }
2229
+
2230
+ class BlobReader extends Reader {
2231
+ constructor(blob) {
2232
+ super();
2233
+ Object.assign(this, {
2234
+ sourceBlob: blob,
2235
+ size: blob.size
2236
+ });
2237
+ if (!blobSliceProbe) {
2238
+ probeBlobSliceReliability();
2239
+ }
2240
+ }
2241
+ createReadable(options) {
2242
+ const reader = this;
2243
+ const { sourceBlob, size } = reader;
2244
+ const { offset = 0, size: readSize = size - offset } = options || {};
2245
+ if (typeof sourceBlob.stream == FUNCTION_TYPE) {
2246
+ if (!offset && readSize >= size) {
2247
+ return toCompatibleReadable(sourceBlob.stream());
2248
+ }
2249
+ if (blobSliceReliable) {
2250
+ return toCompatibleReadable(sourceBlob.slice(offset, offset + readSize).stream());
2251
+ }
2252
+ }
2253
+ return super.createReadable(options);
2254
+ }
2255
+ async readUint8Array(offset, length) {
2256
+ const reader = this;
2257
+ const offsetEnd = offset + length;
2258
+ const readsWholeBlob = !offset && offsetEnd >= reader.size;
2259
+ const blob = readsWholeBlob ? reader.sourceBlob : reader.sourceBlob.slice(offset, offsetEnd);
2260
+ let arrayBuffer = await blob.arrayBuffer();
2261
+ const sliceIgnoredByBuggyImplementation = arrayBuffer.byteLength > length;
2262
+ if (sliceIgnoredByBuggyImplementation) {
2263
+ arrayBuffer = arrayBuffer.slice(offset, offsetEnd);
2264
+ }
2265
+ return new Uint8Array(arrayBuffer);
2266
+ }
2267
+ }
2268
+ class Uint8ArrayReader extends Reader {
2269
+ constructor(array) {
2270
+ super();
2271
+ array = new Uint8Array(array.buffer, array.byteOffset, array.byteLength);
2272
+ Object.assign(this, {
2273
+ array,
2274
+ size: array.length
2275
+ });
2276
+ }
2277
+ readUint8Array(index, length) {
2278
+ return this.array.slice(index, index + length);
2279
+ }
2280
+ }
2281
+
2282
+ class Uint8ArrayWriter extends Writer {
2283
+ constructor(defaultBufferSize) {
2284
+ super();
2285
+ this.defaultBufferSize = defaultBufferSize || DEFAULT_BUFFER_SIZE;
2286
+ }
2287
+ init(initSize = 0) {
2288
+ Object.assign(this, {
2289
+ offset: 0,
2290
+ array: new Uint8Array(initSize > 0 ? initSize : this.defaultBufferSize)
2291
+ });
2292
+ super.init();
2293
+ }
2294
+ writeUint8Array(array) {
2295
+ const writer = this;
2296
+ const requiredLength = writer.offset + array.length;
2297
+ if (requiredLength > writer.array.length) {
2298
+ let newLength = writer.array.length ? writer.array.length * 2 : writer.defaultBufferSize;
2299
+ while (newLength < requiredLength) {
2300
+ newLength *= 2;
2301
+ }
2302
+ const previousArray = writer.array;
2303
+ writer.array = new Uint8Array(newLength);
2304
+ writer.array.set(previousArray);
2305
+ }
2306
+ writer.array.set(array, writer.offset);
2307
+ writer.offset += array.length;
2308
+ }
2309
+ getData() {
2310
+ if (this.offset === this.array.length) {
2311
+ return this.array;
2312
+ } else {
2313
+ return this.array.slice(0, this.offset);
2314
+ }
2315
+ }
2316
+ }
2317
+
2318
+ class SplitDataReader extends Reader {
2319
+ constructor(readers) {
2320
+ super();
2321
+ this.readers = readers;
2322
+ }
2323
+ async init() {
2324
+ const reader = this;
2325
+ reader.lastDiskNumber = 0;
2326
+ const readers = reader.readers = await Promise.all(reader.readers.map(initDiskReader));
2327
+ reader.diskOffsets = readers.map((diskReader) => {
2328
+ const diskOffset = reader.size;
2329
+ reader.size += diskReader.size;
2330
+ return diskOffset;
2331
+ });
2332
+ super.init();
2333
+ }
2334
+ getDiskOffset(diskNumber) {
2335
+ const { diskOffsets, size } = this;
2336
+ const diskOffset = diskOffsets[diskNumber];
2337
+ return diskOffset === UNDEFINED_VALUE ? size : diskOffset;
2338
+ }
2339
+ async readUint8Array(offset, length) {
2340
+ const reader = this;
2341
+ const { readers } = this;
2342
+ let result;
2343
+ let currentDiskNumber = 0;
2344
+ let currentReaderOffset = offset;
2345
+ while (readers[currentDiskNumber] && currentReaderOffset >= readers[currentDiskNumber].size) {
2346
+ currentReaderOffset -= readers[currentDiskNumber].size;
2347
+ currentDiskNumber++;
2348
+ }
2349
+ const currentReader = readers[currentDiskNumber];
2350
+ if (currentReader) {
2351
+ const currentReaderSize = currentReader.size;
2352
+ if (currentReaderOffset + length <= currentReaderSize) {
2353
+ result = await readUint8Array(currentReader, currentReaderOffset, length);
2354
+ } else {
2355
+ const chunkLength = currentReaderSize - currentReaderOffset;
2356
+ const firstPart = await readUint8Array(currentReader, currentReaderOffset, chunkLength);
2357
+ const secondPart = await reader.readUint8Array(offset + chunkLength, length - chunkLength);
2358
+ result = concat(firstPart, secondPart);
2359
+ }
2360
+ } else {
2361
+ result = EMPTY_UINT8_ARRAY;
2362
+ }
2363
+ reader.lastDiskNumber = Math.max(currentDiskNumber, reader.lastDiskNumber);
2364
+ return result;
2365
+ }
2366
+ }
2367
+
2368
+ class SplitDataWriter extends Stream {
2369
+ constructor(writerGenerator, maxSize = 4294967295) {
2370
+ super();
2371
+ const writer = this;
2372
+ Object.assign(writer, {
2373
+ diskNumber: 0,
2374
+ diskOffset: 0,
2375
+ size: 0,
2376
+ maxSize,
2377
+ availableSize: maxSize
2378
+ });
2379
+ let diskSourceWriter, diskWritable, diskWriter;
2380
+ const writable = new WritableStream({
2381
+ async write(chunk) {
2382
+ if (chunk === DISK_BOUNDARY) {
2383
+ if (diskWriter) {
2384
+ await endDisk();
2385
+ }
2386
+ return;
2387
+ }
2388
+ const { availableSize } = writer;
2389
+ if (!diskWriter) {
2390
+ const { value, done } = await writerGenerator.next();
2391
+ if (done && !value) {
2392
+ throw new Error(ERR_ITERATOR_COMPLETED_TOO_SOON);
2393
+ } else {
2394
+ diskSourceWriter = value;
2395
+ diskSourceWriter.size = 0;
2396
+ if (diskSourceWriter.maxSize) {
2397
+ writer.maxSize = diskSourceWriter.maxSize;
2398
+ }
2399
+ writer.availableSize = writer.maxSize;
2400
+ await initStream(diskSourceWriter);
2401
+ diskWritable = value.writable;
2402
+ diskWriter = diskWritable.getWriter();
2403
+ }
2404
+ await this.write(chunk);
2405
+ } else if (chunk.length >= availableSize) {
2406
+ await writeChunk(chunk.subarray(0, availableSize));
2407
+ await endDisk();
2408
+ if (chunk.length > availableSize) {
2409
+ await this.write(chunk.subarray(availableSize));
2410
+ }
2411
+ } else {
2412
+ await writeChunk(chunk);
2413
+ }
2414
+ },
2415
+ async close() {
2416
+ if (diskWriter) {
2417
+ await diskWriter.ready;
2418
+ await closeDiskWriter();
2419
+ }
2420
+ },
2421
+ async abort(reason) {
2422
+ if (diskWriter) {
2423
+ await diskWriter.abort(reason);
2424
+ }
2425
+ }
2426
+ });
2427
+ Object.defineProperty(writer, PROPERTY_NAME_WRITABLE, {
2428
+ get() {
2429
+ return writable;
2430
+ }
2431
+ });
2432
+ async function writeChunk(chunk) {
2433
+ const chunkLength = chunk.length;
2434
+ if (chunkLength) {
2435
+ await diskWriter.ready;
2436
+ await diskWriter.write(chunk);
2437
+ diskSourceWriter.size += chunkLength;
2438
+ writer.availableSize -= chunkLength;
2439
+ }
2440
+ }
2441
+ async function endDisk() {
2442
+ await closeDiskWriter();
2443
+ writer.diskOffset += diskSourceWriter.size;
2444
+ writer.diskNumber++;
2445
+ diskWriter = null;
2446
+ writer.availableSize = writer.maxSize;
2447
+ }
2448
+ async function closeDiskWriter() {
2449
+ await diskWriter.close();
2450
+ }
2451
+ }
2452
+ async closeDisk() {
2453
+ const streamWriter = this.writable.getWriter();
2454
+ try {
2455
+ await streamWriter.ready;
2456
+ await streamWriter.write(DISK_BOUNDARY);
2457
+ } finally {
2458
+ streamWriter.releaseLock();
2459
+ }
2460
+ }
2461
+ }
2462
+
2463
+ class GenericReader {
2464
+ constructor(reader) {
2465
+ if (Array.isArray(reader)) {
2466
+ reader = new SplitDataReader(reader);
2467
+ }
2468
+ if (reader instanceof ReadableStream || typeof reader.getReader == FUNCTION_TYPE) {
2469
+ reader = {
2470
+ readable: toCompatibleReadable(reader)
2471
+ };
2472
+ }
2473
+ return reader;
2474
+ }
2475
+ }
2476
+
2477
+ class GenericWriter {
2478
+ constructor(writer) {
2479
+ if (writer.writable === UNDEFINED_VALUE && typeof writer.next == FUNCTION_TYPE) {
2480
+ writer = new SplitDataWriter(writer);
2481
+ }
2482
+ if (writer instanceof WritableStream || typeof writer.getWriter == FUNCTION_TYPE) {
2483
+ writer = {
2484
+ writable: toCompatibleWritable(writer)
2485
+ };
2486
+ }
2487
+ try {
2488
+ writer.size = writer.size === UNDEFINED_VALUE ? 0 : writer.size;
2489
+ } catch {
2490
+ throw new Error(ERR_WRITER_SIZE_NOT_WRITABLE);
2491
+ }
2492
+ return writer;
2493
+ }
2494
+ }
2495
+ function ownsWritable(writer) {
2496
+ return Boolean(writer && writer.getData);
2497
+ }
2498
+ async function initStream(stream, initSize) {
2499
+ if (stream.init && !stream.initialized) {
2500
+ await stream.init(initSize);
2501
+ } else {
2502
+ return Promise.resolve();
2503
+ }
2504
+ }
2505
+ async function initDiskReader(diskReader) {
2506
+ diskReader = new GenericReader(diskReader);
2507
+ await initStream(diskReader);
2508
+ if (diskReader.size === UNDEFINED_VALUE || !diskReader.readUint8Array) {
2509
+ diskReader = new BlobReader(await streamToBlob(diskReader.readable));
2510
+ await initStream(diskReader);
2511
+ }
2512
+ return diskReader;
2513
+ }
2514
+ function readUint8Array(reader, offset, size) {
2515
+ return reader.readUint8Array(offset, size);
2516
+ }
2517
+
2518
+ // node_modules/@zip.js/zip.js/lib/core/util/warnings.js
2519
+ function addWarning(warnings, reason, filename) {
2520
+ if (!warnings.some((warning) => warning.reason == reason)) {
2521
+ const warning = { reason };
2522
+ if (filename !== UNDEFINED_VALUE) {
2523
+ warning.filename = filename;
2524
+ }
2525
+ warnings.push(warning);
2526
+ }
2527
+ }
2528
+
2529
+ // node_modules/@zip.js/zip.js/lib/core/zip-entry.js
2530
+ var PROPERTY_NAME_FILENAME = "filename";
2531
+ var PROPERTY_NAME_RAW_FILENAME = "rawFilename";
2532
+ var PROPERTY_NAME_COMMENT = "comment";
2533
+ var PROPERTY_NAME_RAW_COMMENT = "rawComment";
2534
+ var PROPERTY_NAME_UNCOMPRESSED_SIZE = "uncompressedSize";
2535
+ var PROPERTY_NAME_COMPRESSED_SIZE = "compressedSize";
2536
+ var PROPERTY_NAME_OFFSET = "offset";
2537
+ var PROPERTY_NAME_DISK_NUMBER_START = "diskNumberStart";
2538
+ var PROPERTY_NAME_LAST_MODIFICATION_DATE = "lastModDate";
2539
+ var PROPERTY_NAME_RAW_LAST_MODIFICATION_DATE = "rawLastModDate";
2540
+ var PROPERTY_NAME_LAST_ACCESS_DATE = "lastAccessDate";
2541
+ var PROPERTY_NAME_RAW_LAST_ACCESS_DATE = "rawLastAccessDate";
2542
+ var PROPERTY_NAME_CREATION_DATE = "creationDate";
2543
+ var PROPERTY_NAME_RAW_CREATION_DATE = "rawCreationDate";
2544
+ var PROPERTY_NAME_INTERNAL_FILE_ATTRIBUTES = "internalFileAttributes";
2545
+ var PROPERTY_NAME_EXTERNAL_FILE_ATTRIBUTES = "externalFileAttributes";
2546
+ var PROPERTY_NAME_MSDOS_ATTRIBUTES_RAW = "msdosAttributesRaw";
2547
+ var PROPERTY_NAME_MSDOS_ATTRIBUTES = "msdosAttributes";
2548
+ var PROPERTY_NAME_MS_DOS_COMPATIBLE = "msDosCompatible";
2549
+ var PROPERTY_NAME_ZIP64 = "zip64";
2550
+ var PROPERTY_NAME_ENCRYPTED = "encrypted";
2551
+ var PROPERTY_NAME_VERSION = "version";
2552
+ var PROPERTY_NAME_VERSION_MADE_BY = "versionMadeBy";
2553
+ var PROPERTY_NAME_ZIPCRYPTO = "zipCrypto";
2554
+ var PROPERTY_NAME_DIRECTORY = "directory";
2555
+ var PROPERTY_NAME_EXECUTABLE = "executable";
2556
+ var PROPERTY_NAME_SYMLINK = "symlink";
2557
+ var PROPERTY_NAME_COMPRESSION_METHOD = "compressionMethod";
2558
+ var PROPERTY_NAME_SIGNATURE = "signature";
2559
+ var PROPERTY_NAME_CRC32 = "crc32";
2560
+ var PROPERTY_NAME_EXTRA_FIELD = "extraField";
2561
+ var PROPERTY_NAME_EXTRA_FIELD_INFOZIP = "extraFieldInfoZip";
2562
+ var PROPERTY_NAME_EXTRA_FIELD_UNIX = "extraFieldUnix";
2563
+ var PROPERTY_NAME_EXTRA_FIELD_UNIX_TYPE1 = "extraFieldUnixType1";
2564
+ var PROPERTY_NAME_EXTRA_FIELD_PKWARE_UNIX = "extraFieldPkwareUnix";
2565
+ var PROPERTY_NAME_UID = "uid";
2566
+ var PROPERTY_NAME_GID = "gid";
2567
+ var PROPERTY_NAME_UNIX_MODE = "unixMode";
2568
+ var PROPERTY_NAME_SETUID = "setuid";
2569
+ var PROPERTY_NAME_SETGID = "setgid";
2570
+ var PROPERTY_NAME_STICKY = "sticky";
2571
+ var PROPERTY_NAME_BITFLAG = "bitFlag";
2572
+ var PROPERTY_NAME_RAW_BITFLAG = "rawBitFlag";
2573
+ var PROPERTY_NAME_FILENAME_LENGTH = "filenameLength";
2574
+ var PROPERTY_NAME_EXTRA_FIELD_LENGTH = "extraFieldLength";
2575
+ var PROPERTY_NAME_UNIX_EXTERNAL_UPPER = "unixExternalUpper";
2576
+ var PROPERTY_NAME_FILENAME_UTF8 = "filenameUTF8";
2577
+ var PROPERTY_NAME_COMMENT_UTF8 = "commentUTF8";
2578
+ var PROPERTY_NAME_RAW_EXTRA_FIELD = "rawExtraField";
2579
+ var PROPERTY_NAME_EXTRA_FIELD_ZIP64 = "extraFieldZip64";
2580
+ var PROPERTY_NAME_EXTRA_FIELD_UNICODE_PATH = "extraFieldUnicodePath";
2581
+ var PROPERTY_NAME_EXTRA_FIELD_UNICODE_COMMENT = "extraFieldUnicodeComment";
2582
+ var PROPERTY_NAME_EXTRA_FIELD_AES = "extraFieldAES";
2583
+ var PROPERTY_NAME_EXTRA_FIELD_NTFS = "extraFieldNTFS";
2584
+ var PROPERTY_NAME_EXTRA_FIELD_EXTENDED_TIMESTAMP = "extraFieldExtendedTimestamp";
2585
+ var PROPERTY_NAME_EXTRA_FIELD_USDZ = "extraFieldUSDZ";
2586
+ var PROPERTY_NAMES = [
2587
+ PROPERTY_NAME_FILENAME,
2588
+ PROPERTY_NAME_RAW_FILENAME,
2589
+ PROPERTY_NAME_UNCOMPRESSED_SIZE,
2590
+ PROPERTY_NAME_COMPRESSED_SIZE,
2591
+ PROPERTY_NAME_LAST_MODIFICATION_DATE,
2592
+ PROPERTY_NAME_RAW_LAST_MODIFICATION_DATE,
2593
+ PROPERTY_NAME_COMMENT,
2594
+ PROPERTY_NAME_RAW_COMMENT,
2595
+ PROPERTY_NAME_LAST_ACCESS_DATE,
2596
+ PROPERTY_NAME_RAW_LAST_ACCESS_DATE,
2597
+ PROPERTY_NAME_CREATION_DATE,
2598
+ PROPERTY_NAME_RAW_CREATION_DATE,
2599
+ PROPERTY_NAME_OFFSET,
2600
+ PROPERTY_NAME_DISK_NUMBER_START,
2601
+ PROPERTY_NAME_INTERNAL_FILE_ATTRIBUTES,
2602
+ PROPERTY_NAME_EXTERNAL_FILE_ATTRIBUTES,
2603
+ PROPERTY_NAME_MSDOS_ATTRIBUTES_RAW,
2604
+ PROPERTY_NAME_MSDOS_ATTRIBUTES,
2605
+ PROPERTY_NAME_MS_DOS_COMPATIBLE,
2606
+ PROPERTY_NAME_ZIP64,
2607
+ PROPERTY_NAME_ENCRYPTED,
2608
+ PROPERTY_NAME_VERSION,
2609
+ PROPERTY_NAME_VERSION_MADE_BY,
2610
+ PROPERTY_NAME_ZIPCRYPTO,
2611
+ PROPERTY_NAME_DIRECTORY,
2612
+ PROPERTY_NAME_EXECUTABLE,
2613
+ PROPERTY_NAME_SYMLINK,
2614
+ PROPERTY_NAME_COMPRESSION_METHOD,
2615
+ PROPERTY_NAME_SIGNATURE,
2616
+ PROPERTY_NAME_CRC32,
2617
+ PROPERTY_NAME_EXTRA_FIELD,
2618
+ PROPERTY_NAME_EXTRA_FIELD_UNIX,
2619
+ PROPERTY_NAME_EXTRA_FIELD_INFOZIP,
2620
+ PROPERTY_NAME_EXTRA_FIELD_UNIX_TYPE1,
2621
+ PROPERTY_NAME_EXTRA_FIELD_PKWARE_UNIX,
2622
+ PROPERTY_NAME_UID,
2623
+ PROPERTY_NAME_GID,
2624
+ PROPERTY_NAME_UNIX_MODE,
2625
+ PROPERTY_NAME_UNIX_EXTERNAL_UPPER,
2626
+ PROPERTY_NAME_SETUID,
2627
+ PROPERTY_NAME_SETGID,
2628
+ PROPERTY_NAME_STICKY,
2629
+ PROPERTY_NAME_BITFLAG,
2630
+ PROPERTY_NAME_RAW_BITFLAG,
2631
+ PROPERTY_NAME_FILENAME_LENGTH,
2632
+ PROPERTY_NAME_EXTRA_FIELD_LENGTH,
2633
+ PROPERTY_NAME_FILENAME_UTF8,
2634
+ PROPERTY_NAME_COMMENT_UTF8,
2635
+ PROPERTY_NAME_RAW_EXTRA_FIELD,
2636
+ PROPERTY_NAME_EXTRA_FIELD_ZIP64,
2637
+ PROPERTY_NAME_EXTRA_FIELD_UNICODE_PATH,
2638
+ PROPERTY_NAME_EXTRA_FIELD_UNICODE_COMMENT,
2639
+ PROPERTY_NAME_EXTRA_FIELD_AES,
2640
+ PROPERTY_NAME_EXTRA_FIELD_NTFS,
2641
+ PROPERTY_NAME_EXTRA_FIELD_EXTENDED_TIMESTAMP,
2642
+ PROPERTY_NAME_EXTRA_FIELD_USDZ
2643
+ ];
2644
+
2645
+ class Entry {
2646
+ constructor(data) {
2647
+ PROPERTY_NAMES.forEach((name) => this[name] = data[name]);
2648
+ }
2649
+ }
2650
+ var INTERPRETED_EXTRA_FIELD_TYPES = new Set([
2651
+ EXTRAFIELD_TYPE_ZIP64,
2652
+ EXTRAFIELD_TYPE_AES,
2653
+ EXTRAFIELD_TYPE_NTFS,
2654
+ EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP,
2655
+ EXTRAFIELD_TYPE_UNICODE_PATH,
2656
+ EXTRAFIELD_TYPE_UNICODE_COMMENT,
2657
+ EXTRAFIELD_TYPE_USDZ,
2658
+ EXTRAFIELD_TYPE_INFOZIP,
2659
+ EXTRAFIELD_TYPE_UNIX,
2660
+ EXTRAFIELD_TYPE_UNIX_TYPE1,
2661
+ EXTRAFIELD_TYPE_PKWARE_UNIX
2662
+ ]);
2663
+ function getEncryptionOverhead(encrypted, zipCrypto, encryptionStrength) {
2664
+ return encrypted ? zipCrypto ? 12 : 16 + encryptionStrength * 4 : 0;
2665
+ }
2666
+
2667
+ // node_modules/@zip.js/zip.js/lib/core/zip-reader.js
2668
+ var ERR_BAD_FORMAT2 = "File format is not recognized";
2669
+ var ERR_EOCDR_NOT_FOUND2 = "End of central directory not found";
2670
+ var ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND2 = "End of Zip64 central directory locator not found";
2671
+ var ERR_CENTRAL_DIRECTORY_NOT_FOUND2 = "Central directory header not found";
2672
+ var ERR_ENCRYPTED2 = "File contains encrypted entry";
2673
+ var ERR_UNSUPPORTED_ENCRYPTION2 = "Encryption method not supported";
2674
+ var ERR_SPLIT_ZIP_FILE2 = "Split zip file";
2675
+ var ERR_ENTRY_DATA_OUT_OF_BOUNDS2 = "Entry data out of bounds";
2676
+ var ERR_AMBIGUOUS_ARCHIVE2 = "Ambiguous archive";
2677
+ var ERR_ENCRYPTED_CENTRAL_DIRECTORY2 = "Encrypted central directory is not supported";
2678
+ var ERR_UNSAFE_FILENAME2 = "Unsafe filename";
2679
+ var ERR_INVALID_STRICTNESS2 = "Invalid strictness (must be 'strict', 'balanced' or 'tolerant')";
2680
+ var ERR_INVALID_FILENAME_VALIDATION2 = "Invalid filenameValidation (must be 'strict', 'balanced' or 'tolerant')";
2681
+ var ERR_INVALID_MAX_APPENDED_DATA_SIZE2 = "Invalid maxAppendedDataSize (must be a number greater than or equal to 0)";
2682
+ var ERR_UNSUPPORTED_UINT642 = "64-bit value exceeds Number.MAX_SAFE_INTEGER";
2683
+ var WARNING_UNSORTED_CENTRAL_DIRECTORY2 = "unsorted central directory";
2684
+ var WARNING_UNKNOWN_VERSION2 = "unknown version needed to extract";
2685
+ var WARNING_COMPRESSED_PATCHED_DATA2 = "compressed patched data";
2686
+ var WARNING_MALFORMED_EXTRA_FIELD2 = "malformed extra field";
2687
+ var WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA2 = "unknown zip64 extensible data";
2688
+ var WARNING_WRAPPED_ENTRIES_COUNT2 = "wrapped entries count";
2689
+ var WARNING_APPENDED_DATA2 = "appended data";
2690
+ var WARNING_PREPENDED_DATA2 = "prepended data";
2691
+ var WARNING_PREPENDED_CENTRAL_DIRECTORY2 = "prepended central directory";
2692
+ var WARNING_TRAILING_CENTRAL_DIRECTORY_DATA2 = "trailing central directory data";
2693
+ var WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET2 = "mismatched central directory offset";
2694
+ var WARNING_MISSING_ZIP64_EXTRA_FIELD2 = "missing zip64 extra field";
2695
+ var WARNING_DUPLICATE_FILENAME2 = "duplicate filename";
2696
+ var WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY2 = "mismatched zip64 end of central directory record";
2697
+ var WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY2 = "multiple end of central directory records";
2698
+ var WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME2 = "mismatched local file header (filename)";
2699
+ var WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG2 = "mismatched local file header (general purpose bit flag)";
2700
+ var WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD2 = "mismatched local file header (compression method)";
2701
+ var WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES2 = "mismatched local file header (crc32 or sizes)";
2702
+ var MAX_KNOWN_VERSION = 63;
2703
+ var DRIVE_LETTER_REGEXP = /^[a-zA-Z]:/;
2704
+ var PARENT_DIRECTORY_REGEXP = /(^|[\\/])\.\.([\\/]|$)/;
2705
+ var CHARSET_UTF8 = "utf-8";
2706
+ var PROPERTY_NAME_UTF8_SUFFIX = "UTF8";
2707
+ var CHARSET_CP437 = "cp437";
2708
+ var BITFLAG_AMBIGUITY_MASK = BITFLAG_ENCRYPTED | BITFLAG_DATA_DESCRIPTOR | BITFLAG_STRONG_ENCRYPTION | BITFLAG_LANG_ENCODING_FLAG;
2709
+ var VENDOR_VERSION_AE_1 = 1;
2710
+ var ZIP64_PROPERTIES = [
2711
+ [PROPERTY_NAME_UNCOMPRESSED_SIZE, MAX_32_BITS],
2712
+ [PROPERTY_NAME_COMPRESSED_SIZE, MAX_32_BITS],
2713
+ [PROPERTY_NAME_OFFSET, MAX_32_BITS],
2714
+ [PROPERTY_NAME_DISK_NUMBER_START, MAX_16_BITS]
2715
+ ];
2716
+ var ZIP64_EXTRACTION = {
2717
+ [MAX_16_BITS]: {
2718
+ getValue: getUint32,
2719
+ bytes: 4
2720
+ },
2721
+ [MAX_32_BITS]: {
2722
+ getValue: getBigUint64,
2723
+ bytes: 8
2724
+ }
2725
+ };
2726
+ var MAX_SAFE_UINT64 = BigInt(Number.MAX_SAFE_INTEGER);
2727
+ var MAX_END_OF_CENTRAL_DIR_PROBES = 64;
2728
+ var MAX_DEFLATE_EXPANSION_RATIO = 1032;
2729
+ var CENTRAL_DIRECTORY_UNREACHABLE = 0;
2730
+ var CENTRAL_DIRECTORY_PLAUSIBLE = 1;
2731
+ var CENTRAL_DIRECTORY_REACHABLE = 2;
2732
+
2733
+ class ZipReader2 {
2734
+ constructor(reader, options = {}) {
2735
+ Object.assign(this, {
2736
+ reader: new GenericReader(reader),
2737
+ options: options || {},
2738
+ readRanges: { indexes: new Set, sortedRanges: [], pendingRanges: [] },
2739
+ entriesMissingZip64ExtraField: new WeakSet
2740
+ });
2741
+ }
2742
+ async* getEntriesGenerator(options = {}) {
2743
+ const zipReader = this;
2744
+ let { reader } = zipReader;
2745
+ await initStream(reader);
2746
+ if (reader.size === UNDEFINED_VALUE || !reader.readUint8Array) {
2747
+ reader = new BlobReader(await streamToBlob(reader.readable));
2748
+ await initStream(reader);
2749
+ }
2750
+ if (reader.size < END_OF_CENTRAL_DIR_LENGTH) {
2751
+ throw new Error(ERR_BAD_FORMAT2);
2752
+ }
2753
+ const warnings = zipReader.warnings = [];
2754
+ const strictness = getStrictness(options, zipReader.options);
2755
+ const checkAmbiguity = strictness == STRICTNESS_STRICT;
2756
+ const rejectAmbiguousEndOfDirectory = strictness != STRICTNESS_TOLERANT;
2757
+ const maxAppendedDataSize = getMaxAppendedDataSize(getOptionValue(zipReader, options, OPTION_MAX_APPENDED_DATA_SIZE), strictness);
2758
+ const filenameValidation = getFilenameValidation(getOptionValue(zipReader, options, OPTION_FILENAME_VALIDATION), strictness);
2759
+ const normalizeFilename = getOptionValue(zipReader, options, OPTION_NORMALIZE_FILENAME);
2760
+ const { endOfDirectoryInfo, endOfDirectoryReachingEndCount } = await findEndOfCentralDirectory(reader, rejectAmbiguousEndOfDirectory, maxAppendedDataSize);
2761
+ if (!endOfDirectoryInfo) {
2762
+ if (await startsWithSplitZipSignature(reader)) {
2763
+ throw new Error(ERR_SPLIT_ZIP_FILE2);
2764
+ } else {
2765
+ throw new Error(ERR_EOCDR_NOT_FOUND2);
2766
+ }
2767
+ }
2768
+ if (rejectAmbiguousEndOfDirectory && endOfDirectoryReachingEndCount > 1) {
2769
+ throwAmbiguousArchive(WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY2);
2770
+ }
2771
+ const endOfDirectoryView = getDataView(endOfDirectoryInfo);
2772
+ let directoryDataLength = getUint32(endOfDirectoryView, 12);
2773
+ let directoryDataOffset = getUint32(endOfDirectoryView, 16);
2774
+ const commentOffset = endOfDirectoryInfo.offset;
2775
+ const commentLength = getUint16(endOfDirectoryView, 20);
2776
+ const appendedDataOffset = commentOffset + END_OF_CENTRAL_DIR_LENGTH + commentLength;
2777
+ const appendedDataLength = reader.size - appendedDataOffset;
2778
+ if (appendedDataLength > maxAppendedDataSize) {
2779
+ throwAmbiguousArchive(WARNING_APPENDED_DATA2);
2780
+ }
2781
+ if (appendedDataLength > 0) {
2782
+ addWarning(warnings, WARNING_APPENDED_DATA2);
2783
+ }
2784
+ let lastDiskNumber = getUint16(endOfDirectoryView, 4);
2785
+ const expectedLastDiskNumber = reader.lastDiskNumber || 0;
2786
+ let diskNumber = getUint16(endOfDirectoryView, 6);
2787
+ let filesLength = getUint16(endOfDirectoryView, 10);
2788
+ let prependedDataLength = 0;
2789
+ let prependedCentralDirectory;
2790
+ let startOffset;
2791
+ let zip64EndOfDirectory;
2792
+ let zip64EndOfDirectoryVersion2;
2793
+ let zip64EndOfDirectoryLength = ZIP64_END_OF_CENTRAL_DIR_LENGTH;
2794
+ let directoryEncryptionInfo;
2795
+ const requiresZip64 = directoryDataOffset == MAX_32_BITS || directoryDataLength == MAX_32_BITS || filesLength == MAX_16_BITS || diskNumber == MAX_16_BITS;
2796
+ if (directoryDataOffset != MAX_32_BITS && diskNumber != MAX_16_BITS) {
2797
+ directoryDataOffset += getDiskOffset(reader, diskNumber);
2798
+ }
2799
+ if (requiresZip64) {
2800
+ const endOfDirectoryLocatorArray = endOfDirectoryInfo.offset >= ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH ? await readUint8Array(reader, endOfDirectoryInfo.offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH, ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH) : EMPTY_UINT8_ARRAY;
2801
+ const endOfDirectoryLocatorView = getDataView(endOfDirectoryLocatorArray);
2802
+ if (endOfDirectoryLocatorArray.length == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH && getUint32(endOfDirectoryLocatorView, 0) == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE) {
2803
+ directoryDataOffset = getDiskOffset(reader, getUint32(endOfDirectoryLocatorView, 4)) + getBigUint64(endOfDirectoryLocatorView, 8);
2804
+ let endOfDirectoryArray = await readUint8Array(reader, directoryDataOffset, ZIP64_END_OF_CENTRAL_DIR_LENGTH);
2805
+ let endOfDirectoryView = getDataView(endOfDirectoryArray);
2806
+ if (endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) {
2807
+ const locatorOffset = endOfDirectoryInfo.offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH;
2808
+ let expectedDirectoryDataOffset = locatorOffset - ZIP64_END_OF_CENTRAL_DIR_LENGTH;
2809
+ if (!await startsWithSignature(reader, expectedDirectoryDataOffset, ZIP64_END_OF_CENTRAL_DIR_SIGNATURE)) {
2810
+ expectedDirectoryDataOffset = await findZip64EndOfDirectoryOffset(reader, locatorOffset);
2811
+ }
2812
+ if (expectedDirectoryDataOffset !== UNDEFINED_VALUE && expectedDirectoryDataOffset >= 0 && directoryDataOffset != expectedDirectoryDataOffset) {
2813
+ const originalDirectoryDataOffset = directoryDataOffset;
2814
+ directoryDataOffset = expectedDirectoryDataOffset;
2815
+ if (directoryDataOffset > originalDirectoryDataOffset) {
2816
+ prependedDataLength = directoryDataOffset - originalDirectoryDataOffset;
2817
+ }
2818
+ endOfDirectoryArray = await readUint8Array(reader, directoryDataOffset, ZIP64_END_OF_CENTRAL_DIR_LENGTH);
2819
+ endOfDirectoryView = getDataView(endOfDirectoryArray);
2820
+ }
2821
+ }
2822
+ if (endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) {
2823
+ throw new Error(ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND2);
2824
+ }
2825
+ zip64EndOfDirectory = true;
2826
+ zip64EndOfDirectoryVersion2 = getBigUint64(endOfDirectoryView, 4) > ZIP64_END_OF_CENTRAL_DIR_LENGTH - 12;
2827
+ if (zip64EndOfDirectoryVersion2) {
2828
+ const extensibleDataLength = Math.min(getBigUint64(endOfDirectoryView, 4) - (ZIP64_END_OF_CENTRAL_DIR_LENGTH - 12), reader.size - directoryDataOffset - ZIP64_END_OF_CENTRAL_DIR_LENGTH);
2829
+ if (extensibleDataLength > 0) {
2830
+ zip64EndOfDirectoryLength += extensibleDataLength;
2831
+ const rawExtensibleData = await readUint8Array(reader, directoryDataOffset + ZIP64_END_OF_CENTRAL_DIR_LENGTH, extensibleDataLength);
2832
+ directoryEncryptionInfo = getDirectoryEncryptionInfo(rawExtensibleData);
2833
+ }
2834
+ }
2835
+ if (lastDiskNumber == MAX_16_BITS) {
2836
+ lastDiskNumber = getUint32(endOfDirectoryView, 16);
2837
+ } else if (lastDiskNumber != getUint32(endOfDirectoryView, 16)) {
2838
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY2);
2839
+ }
2840
+ if (diskNumber == MAX_16_BITS) {
2841
+ diskNumber = getUint32(endOfDirectoryView, 20);
2842
+ } else if (diskNumber != getUint32(endOfDirectoryView, 20)) {
2843
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY2);
2844
+ }
2845
+ if (filesLength == MAX_16_BITS) {
2846
+ filesLength = getBigUint64(endOfDirectoryView, 32);
2847
+ } else if (filesLength != getBigUint64(endOfDirectoryView, 32)) {
2848
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY2);
2849
+ }
2850
+ if (directoryDataLength == MAX_32_BITS) {
2851
+ directoryDataLength = getBigUint64(endOfDirectoryView, 40);
2852
+ } else if (directoryDataLength != getBigUint64(endOfDirectoryView, 40)) {
2853
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY2);
2854
+ }
2855
+ directoryDataOffset = getDiskOffset(reader, diskNumber) + getBigUint64(endOfDirectoryView, 48) + prependedDataLength;
2856
+ } else if (directoryDataOffset == MAX_32_BITS || directoryDataLength == MAX_32_BITS || diskNumber == MAX_16_BITS) {
2857
+ throw new Error(ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND2);
2858
+ }
2859
+ }
2860
+ let declaredDirectoryDataLength = directoryDataLength;
2861
+ const centralDirectoryEndOffset = endOfDirectoryInfo.offset - (zip64EndOfDirectory ? zip64EndOfDirectoryLength + ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH : 0);
2862
+ if (expectedLastDiskNumber != lastDiskNumber) {
2863
+ throw new Error(ERR_SPLIT_ZIP_FILE2);
2864
+ }
2865
+ if (directoryDataOffset < 0) {
2866
+ throw new Error(ERR_BAD_FORMAT2);
2867
+ }
2868
+ let offset = 0;
2869
+ let directoryArray = directoryDataOffset < reader.size ? await readUint8Array(reader, directoryDataOffset, directoryDataLength) : EMPTY_UINT8_ARRAY;
2870
+ let directoryView = getDataView(directoryArray);
2871
+ if (directoryDataLength) {
2872
+ let expectedDirectoryDataOffset = centralDirectoryEndOffset - directoryDataLength;
2873
+ if (directoryDataOffset != expectedDirectoryDataOffset && diskNumber == lastDiskNumber) {
2874
+ const storedPointsAtDirectory = directoryArray.length >= 4 && (getUint32(directoryView, offset) == CENTRAL_FILE_HEADER_SIGNATURE || Boolean(directoryEncryptionInfo && directoryEncryptionInfo.compressedSize) || detectEncryptedCentralDirectory(directoryView));
2875
+ if (!storedPointsAtDirectory && expectedDirectoryDataOffset < 0) {
2876
+ throw new Error(ERR_BAD_FORMAT2);
2877
+ }
2878
+ let reconcile = !storedPointsAtDirectory;
2879
+ if (expectedDirectoryDataOffset >= 0 && expectedDirectoryDataOffset + 4 <= reader.size) {
2880
+ let expectedPointsAtDirectory = await pointsAtDirectory(reader, expectedDirectoryDataOffset);
2881
+ if (!expectedPointsAtDirectory) {
2882
+ const signatureRecordOffset = await findDigitalSignatureRecordOffset(reader, centralDirectoryEndOffset);
2883
+ const signedDirectoryDataOffset = signatureRecordOffset - directoryDataLength;
2884
+ if (signatureRecordOffset !== UNDEFINED_VALUE && signedDirectoryDataOffset >= 0 && await pointsAtDirectory(reader, signedDirectoryDataOffset)) {
2885
+ expectedDirectoryDataOffset = signedDirectoryDataOffset;
2886
+ expectedPointsAtDirectory = true;
2887
+ }
2888
+ }
2889
+ if (storedPointsAtDirectory) {
2890
+ reconcile = expectedPointsAtDirectory;
2891
+ }
2892
+ }
2893
+ if (reconcile && expectedDirectoryDataOffset != directoryDataOffset) {
2894
+ const originalDirectoryDataOffset = directoryDataOffset;
2895
+ directoryDataOffset = expectedDirectoryDataOffset;
2896
+ directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength);
2897
+ directoryView = getDataView(directoryArray);
2898
+ const offsetDelta = directoryDataOffset - originalDirectoryDataOffset;
2899
+ const { localHeaderFound, shiftedLocalHeaderFound } = await probeLocalHeaders(reader, directoryArray, directoryView, offsetDelta);
2900
+ if (offsetDelta > 0 && !(localHeaderFound && !shiftedLocalHeaderFound)) {
2901
+ prependedDataLength += offsetDelta;
2902
+ prependedCentralDirectory = storedPointsAtDirectory;
2903
+ } else {
2904
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET2);
2905
+ if (offsetDelta < 0 && !localHeaderFound && shiftedLocalHeaderFound) {
2906
+ prependedDataLength += offsetDelta;
2907
+ }
2908
+ }
2909
+ }
2910
+ }
2911
+ if (directoryArray.length < 4) {
2912
+ throw new Error(ERR_BAD_FORMAT2);
2913
+ }
2914
+ } else if (!filesLength && directoryDataOffset < centralDirectoryEndOffset && diskNumber == lastDiskNumber) {
2915
+ prependedDataLength += centralDirectoryEndOffset - directoryDataOffset;
2916
+ directoryDataOffset = centralDirectoryEndOffset;
2917
+ }
2918
+ const expectedDirectoryDataLength = centralDirectoryEndOffset - directoryDataOffset;
2919
+ if (directoryDataLength != expectedDirectoryDataLength && expectedDirectoryDataLength >= 0 && diskNumber == lastDiskNumber) {
2920
+ directoryDataLength = expectedDirectoryDataLength;
2921
+ directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength);
2922
+ directoryView = getDataView(directoryArray);
2923
+ }
2924
+ if (directoryDataOffset < 0 || directoryDataOffset >= reader.size) {
2925
+ throw new Error(ERR_BAD_FORMAT2);
2926
+ }
2927
+ zipReader.directoryOffset = directoryDataOffset;
2928
+ zipReader.directoryLength = declaredDirectoryDataLength;
2929
+ const decryptCentralDirectory = getFunctionOptionValue(zipReader, options, OPTION_DECRYPT_CENTRAL_DIRECTORY);
2930
+ let decryptedDirectory, dataAfterEncryptedDirectory;
2931
+ if (decryptCentralDirectory && filesLength && directoryArray.length >= 4 && getUint32(directoryView, 0) != CENTRAL_FILE_HEADER_SIGNATURE && (zip64EndOfDirectoryVersion2 || detectEncryptedCentralDirectory(directoryView))) {
2932
+ const encryptedDirectoryDataLength = getEncryptedDirectoryDataLength(directoryEncryptionInfo, declaredDirectoryDataLength, directoryArray.length);
2933
+ dataAfterEncryptedDirectory = directoryArray.subarray(encryptedDirectoryDataLength);
2934
+ directoryArray = await decryptCentralDirectory(directoryArray.subarray(0, encryptedDirectoryDataLength), directoryEncryptionInfo);
2935
+ directoryView = getDataView(directoryArray);
2936
+ declaredDirectoryDataLength = directoryArray.length;
2937
+ decryptedDirectory = true;
2938
+ }
2939
+ if (directoryEncryptionInfo && !decryptedDirectory && (directoryArray.length < 4 || getUint32(directoryView, 0) == CENTRAL_FILE_HEADER_SIGNATURE)) {
2940
+ addWarning(warnings, WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA2);
2941
+ }
2942
+ startOffset = directoryDataOffset;
2943
+ const filenameEncoding = getOptionValue(zipReader, options, OPTION_FILENAME_ENCODING);
2944
+ const commentEncoding = getOptionValue(zipReader, options, OPTION_COMMENT_ENCODING);
2945
+ const filenames = new Set;
2946
+ let duplicateFilename;
2947
+ let previousEntryPosition = -Infinity;
2948
+ const recoverWrappedFilesLength = !checkAmbiguity && !zip64EndOfDirectory;
2949
+ if (!filesLength && recoverWrappedFilesLength) {
2950
+ filesLength = getWrappedFilesLength(directoryView, directoryArray, offset);
2951
+ if (filesLength) {
2952
+ addWarning(warnings, WARNING_WRAPPED_ENTRIES_COUNT2);
2953
+ }
2954
+ }
2955
+ const entryOptions = Object.assign({}, zipReader.options, options, { [OPTION_STRICTNESS]: strictness });
2956
+ delete entryOptions[OPTION_CHECK_AMBIGUITY];
2957
+ for (let indexFile = 0;indexFile < filesLength; indexFile++) {
2958
+ const fileEntry = new ZipEntry(reader, entryOptions);
2959
+ if (offset + CENTRAL_FILE_HEADER_LENGTH > directoryArray.length || getUint32(directoryView, offset) != CENTRAL_FILE_HEADER_SIGNATURE) {
2960
+ if (indexFile == 0 && !decryptedDirectory && (zip64EndOfDirectoryVersion2 || detectEncryptedCentralDirectory(directoryView))) {
2961
+ throw new Error(ERR_ENCRYPTED_CENTRAL_DIRECTORY2);
2962
+ }
2963
+ throw new Error(ERR_CENTRAL_DIRECTORY_NOT_FOUND2);
2964
+ }
2965
+ readCommonHeader(fileEntry, directoryView, offset + 6);
2966
+ const languageEncodingFlag = Boolean(fileEntry.bitFlag.languageEncodingFlag);
2967
+ const filenameOffset = offset + CENTRAL_FILE_HEADER_LENGTH;
2968
+ const extraFieldOffset = filenameOffset + fileEntry.filenameLength;
2969
+ const commentOffset = extraFieldOffset + fileEntry.extraFieldLength;
2970
+ const versionMadeBy = getUint16(directoryView, offset + 4);
2971
+ const msDosCompatible = versionMadeBy >> 8 == 0;
2972
+ const unixCompatible = versionMadeBy >> 8 == 3;
2973
+ const commentLength = getUint16(directoryView, offset + 32);
2974
+ const endOffset = commentOffset + commentLength;
2975
+ const rawEntryData = new Uint8Array(directoryArray.subarray(filenameOffset, endOffset));
2976
+ const rawFilename = rawEntryData.subarray(0, fileEntry.filenameLength);
2977
+ const rawComment = rawEntryData.subarray(fileEntry.filenameLength + fileEntry.extraFieldLength);
2978
+ const filenameUTF8 = languageEncodingFlag || !filenameEncoding && isUTF8Text(rawFilename);
2979
+ const commentUTF8 = languageEncodingFlag || !commentEncoding && isUTF8Text(rawComment);
2980
+ const externalFileAttributes = getUint32(directoryView, offset + 38);
2981
+ const msdosAttributesRaw = externalFileAttributes & MAX_8_BITS;
2982
+ const msdosAttributes = {
2983
+ readOnly: Boolean(msdosAttributesRaw & FILE_ATTR_MSDOS_READONLY_MASK),
2984
+ hidden: Boolean(msdosAttributesRaw & FILE_ATTR_MSDOS_HIDDEN_MASK),
2985
+ system: Boolean(msdosAttributesRaw & FILE_ATTR_MSDOS_SYSTEM_MASK),
2986
+ directory: Boolean(msdosAttributesRaw & FILE_ATTR_MSDOS_DIR_MASK),
2987
+ archive: Boolean(msdosAttributesRaw & FILE_ATTR_MSDOS_ARCHIVE_MASK)
2988
+ };
2989
+ const offsetFileEntry = getUint32(directoryView, offset + 42);
2990
+ const decode = getFunctionOptionValue(zipReader, options, OPTION_DECODE_TEXT) || decodeText;
2991
+ const rawFilenameEncoding = filenameUTF8 ? CHARSET_UTF8 : filenameEncoding || CHARSET_CP437;
2992
+ const rawCommentEncoding = commentUTF8 ? CHARSET_UTF8 : commentEncoding || CHARSET_CP437;
2993
+ let filename = decode(rawFilename, rawFilenameEncoding, TEXT_TYPE_FILENAME);
2994
+ if (filename === UNDEFINED_VALUE) {
2995
+ filename = decodeText(rawFilename, rawFilenameEncoding);
2996
+ }
2997
+ let comment = decode(rawComment, rawCommentEncoding, TEXT_TYPE_COMMENT);
2998
+ if (comment === UNDEFINED_VALUE) {
2999
+ comment = decodeText(rawComment, rawCommentEncoding);
3000
+ }
3001
+ Object.assign(fileEntry, {
3002
+ index: indexFile,
3003
+ decryptedDirectory,
3004
+ versionMadeBy,
3005
+ msDosCompatible,
3006
+ zip64: false,
3007
+ compressedSize: 0,
3008
+ uncompressedSize: 0,
3009
+ commentLength,
3010
+ offset: offsetFileEntry,
3011
+ diskNumberStart: getUint16(directoryView, offset + 34),
3012
+ internalFileAttributes: getUint16(directoryView, offset + 36),
3013
+ externalFileAttributes,
3014
+ msdosAttributesRaw,
3015
+ msdosAttributes,
3016
+ rawFilename,
3017
+ filenameUTF8,
3018
+ commentUTF8,
3019
+ rawExtraField: rawEntryData.subarray(fileEntry.filenameLength, fileEntry.filenameLength + fileEntry.extraFieldLength),
3020
+ rawComment,
3021
+ filename,
3022
+ comment
3023
+ });
3024
+ let malformedExtraField;
3025
+ try {
3026
+ malformedExtraField = readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6);
3027
+ } catch (error) {
3028
+ if (checkAmbiguity || error.message != ERR_EXTRAFIELD_ZIP64_NOT_FOUND2) {
3029
+ throw error;
3030
+ }
3031
+ fileEntry.zip64ExtraFieldMissing = true;
3032
+ addWarning(warnings, WARNING_MISSING_ZIP64_EXTRA_FIELD2, fileEntry.filename);
3033
+ }
3034
+ filename = fileEntry.filename;
3035
+ if (normalizeFilename) {
3036
+ const normalizedFilename = normalizeFilename(filename);
3037
+ if (normalizedFilename !== UNDEFINED_VALUE) {
3038
+ filename = fileEntry.filename = normalizedFilename;
3039
+ }
3040
+ }
3041
+ if (isUnsafeFilename(filename, filenameValidation)) {
3042
+ const error = new Error(ERR_UNSAFE_FILENAME2);
3043
+ error.filename = filename;
3044
+ throw error;
3045
+ }
3046
+ if (malformedExtraField) {
3047
+ addWarning(warnings, WARNING_MALFORMED_EXTRA_FIELD2, filename);
3048
+ }
3049
+ if (fileEntry.zip64ExtraFieldMissing && fileEntry.offset == MAX_32_BITS) {
3050
+ startOffset = 0;
3051
+ } else {
3052
+ fileEntry.offset += prependedDataLength;
3053
+ const entryPosition = getDiskOffset(reader, fileEntry.diskNumberStart) + fileEntry.offset;
3054
+ startOffset = Math.min(entryPosition, startOffset);
3055
+ if (entryPosition < previousEntryPosition) {
3056
+ addWarning(warnings, WARNING_UNSORTED_CENTRAL_DIRECTORY2, filename);
3057
+ }
3058
+ previousEntryPosition = entryPosition;
3059
+ }
3060
+ if ((fileEntry.version & MAX_8_BITS) > MAX_KNOWN_VERSION) {
3061
+ addWarning(warnings, WARNING_UNKNOWN_VERSION2, filename);
3062
+ }
3063
+ if ((fileEntry.rawBitFlag & BITFLAG_COMPRESSED_PATCHED_DATA) == BITFLAG_COMPRESSED_PATCHED_DATA) {
3064
+ addWarning(warnings, WARNING_COMPRESSED_PATCHED_DATA2, filename);
3065
+ }
3066
+ if (filenames.has(fileEntry.filename)) {
3067
+ duplicateFilename = true;
3068
+ }
3069
+ filenames.add(fileEntry.filename);
3070
+ const unixExternalUpper = fileEntry.externalFileAttributes >> 16 & MAX_16_BITS;
3071
+ if (fileEntry.unixMode === UNDEFINED_VALUE && (unixExternalUpper & (FILE_ATTR_UNIX_DEFAULT_MASK | FILE_ATTR_UNIX_EXECUTABLE_MASK | FILE_ATTR_UNIX_TYPE_DIR)) != 0) {
3072
+ fileEntry.unixMode = unixExternalUpper;
3073
+ }
3074
+ const setuid = Boolean(fileEntry.unixMode & FILE_ATTR_UNIX_SETUID_MASK);
3075
+ const setgid = Boolean(fileEntry.unixMode & FILE_ATTR_UNIX_SETGID_MASK);
3076
+ const sticky = Boolean(fileEntry.unixMode & FILE_ATTR_UNIX_STICKY_MASK);
3077
+ const unixType = fileEntry.unixMode === UNDEFINED_VALUE ? unixExternalUpper : fileEntry.unixMode;
3078
+ const symlink = (unixType & FILE_ATTR_UNIX_TYPE_MASK) == FILE_ATTR_UNIX_TYPE_SYMLINK;
3079
+ const modeIsDir = fileEntry.unixMode !== UNDEFINED_VALUE && (fileEntry.unixMode & FILE_ATTR_UNIX_TYPE_MASK) == FILE_ATTR_UNIX_TYPE_DIR;
3080
+ const upperIsDir = (unixExternalUpper & FILE_ATTR_UNIX_TYPE_MASK) == FILE_ATTR_UNIX_TYPE_DIR;
3081
+ const directory = modeIsDir || upperIsDir || msDosCompatible && msdosAttributes.directory || fileEntry.filename.endsWith(DIRECTORY_SIGNATURE);
3082
+ const executable = !symlink && !directory && (fileEntry.unixMode !== UNDEFINED_VALUE ? (fileEntry.unixMode & FILE_ATTR_UNIX_EXECUTABLE_MASK) != 0 : unixCompatible && (unixExternalUpper & FILE_ATTR_UNIX_EXECUTABLE_MASK) != 0);
3083
+ Object.assign(fileEntry, {
3084
+ setuid,
3085
+ setgid,
3086
+ sticky,
3087
+ symlink,
3088
+ unixExternalUpper,
3089
+ executable,
3090
+ directory,
3091
+ zipCrypto: fileEntry.encrypted && !fileEntry.extraFieldAES
3092
+ });
3093
+ const entry = new Entry(fileEntry);
3094
+ if (fileEntry.zip64ExtraFieldMissing) {
3095
+ zipReader.entriesMissingZip64ExtraField.add(entry);
3096
+ }
3097
+ entry.getData = (writer, options) => fileEntry.getData(writer, entry, zipReader, options);
3098
+ entry.arrayBuffer = async (options) => {
3099
+ const writer = new TransformStream;
3100
+ const arrayBufferPromise = streamToBlob(writer.readable).then((blob) => blob.arrayBuffer());
3101
+ arrayBufferPromise.catch(() => {});
3102
+ await fileEntry.getData(writer, entry, zipReader, Object.assign({}, options, { preventClose: false }));
3103
+ return arrayBufferPromise;
3104
+ };
3105
+ offset = endOffset;
3106
+ if (indexFile == filesLength - 1 && recoverWrappedFilesLength) {
3107
+ const wrappedFilesLength = getWrappedFilesLength(directoryView, directoryArray, offset);
3108
+ if (wrappedFilesLength) {
3109
+ filesLength += wrappedFilesLength;
3110
+ addWarning(warnings, WARNING_WRAPPED_ENTRIES_COUNT2);
3111
+ }
3112
+ }
3113
+ const { onprogress } = options;
3114
+ if (onprogress) {
3115
+ try {
3116
+ await onprogress(indexFile + 1, filesLength, new Entry(fileEntry));
3117
+ } catch {}
3118
+ }
3119
+ yield entry;
3120
+ }
3121
+ let offsetAfterSignature = offset;
3122
+ let digitalSignature = readDigitalSignature(directoryArray.subarray(offset)) || (decryptedDirectory ? readDigitalSignature(dataAfterEncryptedDirectory) : UNDEFINED_VALUE);
3123
+ if (!digitalSignature && !decryptedDirectory) {
3124
+ const signatureRecordOffset = directoryDataOffset + offset;
3125
+ const signatureRecordLength = Math.min(centralDirectoryEndOffset - signatureRecordOffset, 6 + MAX_16_BITS);
3126
+ if (signatureRecordLength >= 6) {
3127
+ digitalSignature = readDigitalSignature(await readUint8Array(reader, signatureRecordOffset, signatureRecordLength));
3128
+ }
3129
+ }
3130
+ if (digitalSignature) {
3131
+ zipReader.digitalSignature = digitalSignature;
3132
+ offsetAfterSignature = offset + 6 + digitalSignature.length;
3133
+ }
3134
+ if (offset != declaredDirectoryDataLength && offsetAfterSignature != declaredDirectoryDataLength || !decryptedDirectory && offset != directoryDataLength && offsetAfterSignature != directoryDataLength) {
3135
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_TRAILING_CENTRAL_DIRECTORY_DATA2);
3136
+ }
3137
+ if (duplicateFilename) {
3138
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_DUPLICATE_FILENAME2);
3139
+ }
3140
+ const extractPrependedData = getOptionValue(zipReader, options, OPTION_EXTRACT_PREPENDED_DATA);
3141
+ const extractAppendedData = getOptionValue(zipReader, options, OPTION_EXTRACT_APPENDED_DATA);
3142
+ const splitZipSignatureLength = (checkAmbiguity || extractPrependedData) && filesLength && startOffset == SPLIT_ZIP_FILE_SIGNATURE_LENGTH && await startsWithSplitZipMarker(reader) ? SPLIT_ZIP_FILE_SIGNATURE_LENGTH : 0;
3143
+ if (checkAmbiguity && (prependedDataLength > 0 || filesLength && startOffset > splitZipSignatureLength)) {
3144
+ throwAmbiguousArchive(WARNING_PREPENDED_DATA2);
3145
+ }
3146
+ if (prependedDataLength > 0 || filesLength && startOffset > SPLIT_ZIP_FILE_SIGNATURE_LENGTH) {
3147
+ addWarning(warnings, WARNING_PREPENDED_DATA2);
3148
+ }
3149
+ if (prependedCentralDirectory) {
3150
+ addWarning(warnings, WARNING_PREPENDED_CENTRAL_DIRECTORY2);
3151
+ }
3152
+ if (extractPrependedData) {
3153
+ zipReader.prependedData = startOffset > splitZipSignatureLength ? await readUint8Array(reader, splitZipSignatureLength, startOffset - splitZipSignatureLength) : EMPTY_UINT8_ARRAY;
3154
+ }
3155
+ zipReader.comment = commentLength ? await readUint8Array(reader, commentOffset + END_OF_CENTRAL_DIR_LENGTH, commentLength) : EMPTY_UINT8_ARRAY;
3156
+ if (extractAppendedData) {
3157
+ zipReader.appendedData = appendedDataOffset < reader.size ? await readUint8Array(reader, appendedDataOffset, reader.size - appendedDataOffset) : EMPTY_UINT8_ARRAY;
3158
+ }
3159
+ return true;
3160
+ }
3161
+ async getEntries(options = {}) {
3162
+ const entries = [];
3163
+ for await (const entry of this.getEntriesGenerator(options)) {
3164
+ entries.push(entry);
3165
+ }
3166
+ return entries;
3167
+ }
3168
+ async close() {
3169
+ const { reader } = this;
3170
+ if (!reader.readUint8Array && reader.readable && !reader.readable.locked) {
3171
+ await reader.readable.cancel();
3172
+ }
3173
+ }
3174
+ [SYMBOL_ASYNC_DISPOSE]() {
3175
+ return this.close();
3176
+ }
3177
+ }
3178
+
3179
+ class ZipReaderStream2 {
3180
+ constructor(options = {}) {
3181
+ let sourceController;
3182
+ const { readable, writable } = new TransformStream({
3183
+ start(controller) {
3184
+ sourceController = controller;
3185
+ }
3186
+ });
3187
+ const zipReader = new ZipReader2(readable, options);
3188
+ const gen = zipReader.getEntriesGenerator();
3189
+ const pendingEntries = new Set;
3190
+ this.readable = new ReadableStream({
3191
+ async pull(controller) {
3192
+ const { done, value } = await gen.next();
3193
+ if (done)
3194
+ return controller.close();
3195
+ const entryStream = createEntryStream(value, pendingEntries);
3196
+ const chunk = {
3197
+ ...value,
3198
+ readable: entryStream.readable
3199
+ };
3200
+ delete chunk.getData;
3201
+ Object.defineProperties(chunk, {
3202
+ localDirectory: {
3203
+ get: () => value.localDirectory,
3204
+ enumerable: true
3205
+ },
3206
+ warnings: {
3207
+ get: () => value.warnings,
3208
+ enumerable: true
3209
+ }
3210
+ });
3211
+ controller.enqueue(chunk);
3212
+ },
3213
+ async cancel(reason) {
3214
+ const entryStreams = Array.from(pendingEntries);
3215
+ pendingEntries.clear();
3216
+ sourceController.error(reason);
3217
+ await Promise.allSettled(entryStreams.map((entryStream) => entryStream.cancel(reason)));
3218
+ await Promise.allSettled([gen.return(), zipReader.close()]);
3219
+ }
3220
+ });
3221
+ this.writable = writable;
3222
+ }
3223
+ }
3224
+ function createEntryStream(entry, pendingEntries) {
3225
+ const { readable, writable } = new TransformStream;
3226
+ let dataReader;
3227
+ const entryStream = {
3228
+ cancel: async (reason) => {
3229
+ pendingEntries.delete(entryStream);
3230
+ await (dataReader ? dataReader.cancel(reason) : readable.cancel(reason));
3231
+ }
3232
+ };
3233
+ entryStream.readable = new ReadableStream({
3234
+ async pull(controller) {
3235
+ if (!dataReader) {
3236
+ dataReader = readable.getReader();
3237
+ pendingEntries.add(entryStream);
3238
+ getData();
3239
+ }
3240
+ const { done, value } = await dataReader.read();
3241
+ if (done) {
3242
+ controller.close();
3243
+ } else {
3244
+ controller.enqueue(value);
3245
+ }
3246
+ },
3247
+ cancel: (reason) => entryStream.cancel(reason)
3248
+ }, { highWaterMark: 0 });
3249
+ return entryStream;
3250
+ async function getData() {
3251
+ try {
3252
+ await entry.getData(writable, { preventClose: false });
3253
+ } catch (error) {
3254
+ try {
3255
+ await writable.abort(error);
3256
+ } catch {}
3257
+ } finally {
3258
+ pendingEntries.delete(entryStream);
3259
+ }
3260
+ }
3261
+ }
3262
+ async function isZipFile2(reader, options = {}) {
3263
+ reader = new GenericReader(reader);
3264
+ await initStream(reader);
3265
+ if (reader.size === UNDEFINED_VALUE || !reader.readUint8Array) {
3266
+ reader = new BlobReader(await streamToBlob(reader.readable));
3267
+ await initStream(reader);
3268
+ }
3269
+ if (reader.size < END_OF_CENTRAL_DIR_LENGTH) {
3270
+ return false;
3271
+ }
3272
+ const strictness = getStrictness(options, {});
3273
+ const rejectAmbiguousEndOfDirectory = strictness != STRICTNESS_TOLERANT;
3274
+ const maxAppendedDataSize = getMaxAppendedDataSize(options[OPTION_MAX_APPENDED_DATA_SIZE], strictness);
3275
+ const { endOfDirectoryInfo, endOfDirectoryReachingEndCount } = await findEndOfCentralDirectory(reader, rejectAmbiguousEndOfDirectory, maxAppendedDataSize);
3276
+ if (!endOfDirectoryInfo || strictness == STRICTNESS_STRICT && endOfDirectoryReachingEndCount > 1) {
3277
+ return false;
3278
+ }
3279
+ const commentLength = getUint16(getDataView(endOfDirectoryInfo), 20);
3280
+ const appendedDataOffset = endOfDirectoryInfo.offset + END_OF_CENTRAL_DIR_LENGTH + commentLength;
3281
+ return reader.size - appendedDataOffset <= maxAppendedDataSize;
3282
+ }
3283
+ class ZipEntry {
3284
+ constructor(reader, options) {
3285
+ Object.assign(this, {
3286
+ reader,
3287
+ options
3288
+ });
3289
+ }
3290
+ async getData(writer, fileEntry, zipReader, options = {}) {
3291
+ const zipEntry = this;
3292
+ const { readRanges, directoryOffset } = zipReader;
3293
+ if (zipEntry.zip64ExtraFieldMissing) {
3294
+ throw new Error(ERR_EXTRAFIELD_ZIP64_NOT_FOUND2);
3295
+ }
3296
+ const config = getConfiguration();
3297
+ const {
3298
+ reader,
3299
+ index,
3300
+ offset,
3301
+ diskNumberStart,
3302
+ extraFieldAES,
3303
+ extraFieldZip64,
3304
+ compressionMethod,
3305
+ bitFlag,
3306
+ rawBitFlag,
3307
+ crc32,
3308
+ rawLastModDate,
3309
+ uncompressedSize,
3310
+ compressedSize
3311
+ } = zipEntry;
3312
+ const {
3313
+ dataDescriptor
3314
+ } = bitFlag;
3315
+ const localDirectory = fileEntry.localDirectory = {};
3316
+ const warnings = fileEntry.warnings = [];
3317
+ const localHeaderOffset = getDiskOffset(reader, diskNumberStart) + offset;
3318
+ const dataArray = await readUint8Array(reader, localHeaderOffset, HEADER_SIZE);
3319
+ const dataView = getDataView(dataArray);
3320
+ let password = getOptionValue(zipEntry, options, OPTION_PASSWORD);
3321
+ let rawPassword = getOptionValue(zipEntry, options, OPTION_RAW_PASSWORD);
3322
+ const passThrough = checkPassThroughOption(getOptionValue(zipEntry, options, OPTION_PASS_THROUGH));
3323
+ const passThroughCompression = Boolean(passThrough);
3324
+ const passThroughEncryption = passThrough === true;
3325
+ checkPasswordOption(password, rawPassword);
3326
+ password = password && password.length ? password : UNDEFINED_VALUE;
3327
+ rawPassword = rawPassword && rawPassword.length ? rawPassword : UNDEFINED_VALUE;
3328
+ if (extraFieldAES) {
3329
+ if (extraFieldAES.originalCompressionMethod != COMPRESSION_METHOD_AES) {
3330
+ throw new Error(ERR_UNSUPPORTED_COMPRESSION2);
3331
+ }
3332
+ }
3333
+ if (dataArray.length < HEADER_SIZE || getUint32(dataView, 0) != LOCAL_FILE_HEADER_SIGNATURE) {
3334
+ throw new Error(ERR_LOCAL_FILE_HEADER_NOT_FOUND2);
3335
+ }
3336
+ readCommonHeader(localDirectory, dataView, 4);
3337
+ const {
3338
+ extraFieldLength,
3339
+ filenameLength
3340
+ } = localDirectory;
3341
+ const dataOffset = localDirectory.dataOffset = localHeaderOffset + HEADER_SIZE + filenameLength + extraFieldLength;
3342
+ const checkLocalDirectoryOption = getOptionValue(zipEntry, options, OPTION_CHECK_LOCAL_DIRECTORY);
3343
+ const entryStrictness = getStrictness(options, zipEntry.options);
3344
+ const checkLocalDirectory = getCheckLocalDirectory(checkLocalDirectoryOption, entryStrictness);
3345
+ const checkLocalFilenameOption = getOptionValue(zipEntry, options, OPTION_CHECK_LOCAL_FILENAME);
3346
+ const checkLocalFilename = getCheckLocalFilename(checkLocalFilenameOption === UNDEFINED_VALUE ? checkLocalDirectoryOption : checkLocalFilenameOption, entryStrictness);
3347
+ let rawLocalFilename = EMPTY_UINT8_ARRAY;
3348
+ if (checkLocalFilename && (filenameLength || extraFieldLength)) {
3349
+ const trailingDataArray = await readUint8Array(reader, localHeaderOffset + HEADER_SIZE, filenameLength + extraFieldLength);
3350
+ rawLocalFilename = trailingDataArray.subarray(0, filenameLength);
3351
+ localDirectory.rawExtraField = trailingDataArray.subarray(filenameLength);
3352
+ } else {
3353
+ localDirectory.rawExtraField = extraFieldLength ? await readUint8Array(reader, localHeaderOffset + HEADER_SIZE + filenameLength, extraFieldLength) : EMPTY_UINT8_ARRAY;
3354
+ }
3355
+ if (checkLocalFilename) {
3356
+ localDirectory.rawFilename = rawLocalFilename;
3357
+ }
3358
+ if (readCommonFooter(zipEntry, localDirectory, dataView, 4, true)) {
3359
+ addWarning(warnings, WARNING_MALFORMED_EXTRA_FIELD2);
3360
+ }
3361
+ validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename, checkLocalDirectory ? UNDEFINED_VALUE : warnings);
3362
+ const { lastAccessDate, creationDate, uid, gid } = localDirectory;
3363
+ if (lastAccessDate && fileEntry.lastAccessDate === UNDEFINED_VALUE) {
3364
+ fileEntry.lastAccessDate = lastAccessDate;
3365
+ }
3366
+ if (creationDate && fileEntry.creationDate === UNDEFINED_VALUE) {
3367
+ fileEntry.creationDate = creationDate;
3368
+ }
3369
+ if (uid !== UNDEFINED_VALUE && fileEntry.uid === UNDEFINED_VALUE) {
3370
+ fileEntry.uid = uid;
3371
+ }
3372
+ if (gid !== UNDEFINED_VALUE && fileEntry.gid === UNDEFINED_VALUE) {
3373
+ fileEntry.gid = gid;
3374
+ }
3375
+ const checkPasswordOnly = getOptionValue(zipEntry, options, OPTION_CHECK_PASSWORD_ONLY);
3376
+ const encrypted = zipEntry.encrypted && (!passThroughEncryption || checkPasswordOnly);
3377
+ const zipCrypto = encrypted && !extraFieldAES;
3378
+ if (!passThroughEncryption) {
3379
+ fileEntry.zipCrypto = zipCrypto;
3380
+ }
3381
+ if (encrypted && (zipEntry.rawBitFlag & BITFLAG_STRONG_ENCRYPTION) == BITFLAG_STRONG_ENCRYPTION) {
3382
+ throw new Error(ERR_UNSUPPORTED_ENCRYPTION2);
3383
+ }
3384
+ const registeredCodec = passThroughCompression ? UNDEFINED_VALUE : getRegisteredCodec(compressionMethod);
3385
+ if (compressionMethod != COMPRESSION_METHOD_STORE && compressionMethod != COMPRESSION_METHOD_DEFLATE && compressionMethod != COMPRESSION_METHOD_DEFLATE_64 && !registeredCodec && !passThroughCompression) {
3386
+ throw new Error(ERR_UNSUPPORTED_COMPRESSION2);
3387
+ }
3388
+ if (encrypted) {
3389
+ if (!zipCrypto && (extraFieldAES.strength < 1 || extraFieldAES.strength > 3)) {
3390
+ throw new Error(ERR_UNSUPPORTED_ENCRYPTION2);
3391
+ } else if (!password && !rawPassword) {
3392
+ throw new Error(ERR_ENCRYPTED2);
3393
+ }
3394
+ }
3395
+ if (dataOffset + compressedSize > Math.min(reader.size, directoryOffset)) {
3396
+ throw new Error(ERR_ENTRY_DATA_OUT_OF_BOUNDS2);
3397
+ }
3398
+ const size = compressedSize;
3399
+ const signal = checkSignalOption(getOptionValue(zipEntry, options, OPTION_SIGNAL));
3400
+ throwIfAborted(signal);
3401
+ let checkOverlappingEntry = getOptionValue(zipEntry, options, OPTION_CHECK_OVERLAPPING_ENTRY);
3402
+ const checkOverlappingEntryOnly = getOptionValue(zipEntry, options, OPTION_CHECK_OVERLAPPING_ENTRY_ONLY);
3403
+ if (checkOverlappingEntryOnly) {
3404
+ checkOverlappingEntry = true;
3405
+ }
3406
+ const { onstart, onprogress, onend } = options;
3407
+ const compressed = compressionMethod != COMPRESSION_METHOD_STORE && !passThroughCompression;
3408
+ const outputSize = passThroughCompression ? compressedSize - getEncryptionOverhead(encrypted, zipCrypto, extraFieldAES && extraFieldAES.strength) : uncompressedSize;
3409
+ const deflate64 = compressionMethod == COMPRESSION_METHOD_DEFLATE_64;
3410
+ let useCompressionStream = getOptionValue(zipEntry, options, OPTION_USE_COMPRESSION_STREAM);
3411
+ if (deflate64) {
3412
+ useCompressionStream = false;
3413
+ }
3414
+ const checkCrc32Option = getOptionValue(zipEntry, options, OPTION_CHECK_CRC32);
3415
+ const checkCrc32 = (checkCrc32Option === UNDEFINED_VALUE ? getOptionValue(zipEntry, options, OPTION_CHECK_SIGNATURE) : checkCrc32Option) && !passThroughCompression && (!encrypted || zipCrypto || extraFieldAES && extraFieldAES.vendorVersion == VENDOR_VERSION_AE_1);
3416
+ const workerOptions = {
3417
+ options: {
3418
+ codecType: CODEC_INFLATE,
3419
+ password,
3420
+ rawPassword,
3421
+ zipCrypto,
3422
+ encryptionStrength: extraFieldAES && extraFieldAES.strength,
3423
+ checkCrc32,
3424
+ checkAuthenticationCode: getOptionValue(zipEntry, options, OPTION_CHECK_AUTHENTICATION_CODE),
3425
+ passwordVerification: zipCrypto && (dataDescriptor ? rawLastModDate >>> 8 & MAX_8_BITS : crc32 >>> 24 & MAX_8_BITS),
3426
+ outputSize,
3427
+ crc32,
3428
+ compressed,
3429
+ encrypted,
3430
+ useWebWorkers: getOptionValue(zipEntry, options, OPTION_USE_WEB_WORKERS),
3431
+ useCompressionStream,
3432
+ deflate64,
3433
+ format: registeredCodec ? registeredCodec.format : UNDEFINED_VALUE,
3434
+ codecURI: registeredCodec ? registeredCodec.codecURI : UNDEFINED_VALUE,
3435
+ compressionMethod,
3436
+ rawBitFlag,
3437
+ checkPasswordOnly
3438
+ },
3439
+ config,
3440
+ streamOptions: { signal, size, onstart, onprogress, onend }
3441
+ };
3442
+ if (checkOverlappingEntry) {
3443
+ await detectOverlappingEntry({
3444
+ reader,
3445
+ fileEntry,
3446
+ index,
3447
+ offset: localHeaderOffset,
3448
+ crc32,
3449
+ compressedSize,
3450
+ uncompressedSize,
3451
+ dataOffset,
3452
+ dataDescriptor: dataDescriptor || localDirectory.bitFlag.dataDescriptor,
3453
+ extraFieldZip64: extraFieldZip64 || localDirectory.extraFieldZip64,
3454
+ readRanges
3455
+ });
3456
+ validateDataDescriptor(zipEntry, localDirectory, checkLocalDirectory ? UNDEFINED_VALUE : warnings);
3457
+ }
3458
+ let writable, abortError, aborted;
3459
+ try {
3460
+ if (!checkOverlappingEntryOnly) {
3461
+ if (checkPasswordOnly) {
3462
+ writer = new WritableStream;
3463
+ }
3464
+ writer = new GenericWriter(writer);
3465
+ await initStream(writer, getDecodableOutputSize(outputSize, compressedSize, compressed));
3466
+ ({ writable } = writer);
3467
+ const readable = toCompatibleReadable(reader.createReadable({ offset: dataOffset, size }));
3468
+ const { outputSize: writtenSize } = await runWorker2({ readable, writable }, workerOptions);
3469
+ throwIfAborted(signal);
3470
+ if (writtenSize != outputSize) {
3471
+ throw Object.assign(new Error(ERR_INVALID_UNCOMPRESSED_SIZE2), { outputSize: writtenSize });
3472
+ }
3473
+ writer.size += writtenSize;
3474
+ }
3475
+ } catch (error) {
3476
+ if (isErrorObject(error) && error.outputSize !== UNDEFINED_VALUE) {
3477
+ writer.size += error.outputSize;
3478
+ }
3479
+ if (!checkPasswordOnly || !isErrorObject(error) || error.message != ERR_ABORT_CHECK_PASSWORD) {
3480
+ abortError = error;
3481
+ aborted = true;
3482
+ throw error;
3483
+ }
3484
+ } finally {
3485
+ const preventClose = !ownsWritable(writer) && getOptionValue(zipEntry, options, OPTION_PREVENT_CLOSE);
3486
+ if (!preventClose && writable && !writable.locked) {
3487
+ const writableWriter = writable.getWriter();
3488
+ if (aborted) {
3489
+ try {
3490
+ await writableWriter.abort(abortError);
3491
+ } catch {}
3492
+ } else {
3493
+ await writableWriter.close();
3494
+ }
3495
+ }
3496
+ }
3497
+ return checkPasswordOnly || checkOverlappingEntryOnly ? UNDEFINED_VALUE : writer.getData ? writer.getData() : writable;
3498
+ }
3499
+ }
3500
+ function detectEncryptedCentralDirectory(directoryView) {
3501
+ return directoryView.byteLength >= 4 && getUint32(directoryView, 0) == ARCHIVE_EXTRA_DATA_SIGNATURE;
3502
+ }
3503
+ function getWrappedFilesLength(directoryView, directoryArray, offset) {
3504
+ let wrappedFilesLength = 0;
3505
+ while (offset + CENTRAL_FILE_HEADER_LENGTH <= directoryArray.length && getUint32(directoryView, offset) == CENTRAL_FILE_HEADER_SIGNATURE) {
3506
+ offset += CENTRAL_FILE_HEADER_LENGTH + getUint16(directoryView, offset + 28) + getUint16(directoryView, offset + 30) + getUint16(directoryView, offset + 32);
3507
+ wrappedFilesLength++;
3508
+ }
3509
+ return wrappedFilesLength % (MAX_16_BITS + 1) ? 0 : wrappedFilesLength;
3510
+ }
3511
+ function pointsAtDirectory(reader, offset) {
3512
+ return startsWithSignature(reader, offset, CENTRAL_FILE_HEADER_SIGNATURE);
3513
+ }
3514
+ async function startsWithSignature(reader, offset, signature) {
3515
+ if (offset < 0 || offset + 4 > reader.size) {
3516
+ return false;
3517
+ }
3518
+ const signatureArray = await readUint8Array(reader, offset, 4);
3519
+ return getUint32(getDataView(signatureArray), 0) == signature;
3520
+ }
3521
+ async function findDigitalSignatureRecordOffset(reader, endOffset) {
3522
+ const startOffset = Math.max(0, endOffset - (6 + MAX_16_BITS));
3523
+ const tailArray = await readUint8Array(reader, startOffset, endOffset - startOffset);
3524
+ const tailView = getDataView(tailArray);
3525
+ for (let indexByte = tailArray.length - 6;indexByte >= 0; indexByte--) {
3526
+ if (getUint32(tailView, indexByte) == DIGITAL_SIGNATURE_RECORD_SIGNATURE && indexByte + 6 + getUint16(tailView, indexByte + 4) == tailArray.length) {
3527
+ return startOffset + indexByte;
3528
+ }
3529
+ }
3530
+ }
3531
+ async function findZip64EndOfDirectoryOffset(reader, endOffset) {
3532
+ const startOffset = Math.max(0, endOffset - (ZIP64_END_OF_CENTRAL_DIR_LENGTH + MAX_16_BITS));
3533
+ const tailArray = await readUint8Array(reader, startOffset, endOffset - startOffset);
3534
+ const tailView = getDataView(tailArray);
3535
+ for (let indexByte = tailArray.length - ZIP64_END_OF_CENTRAL_DIR_LENGTH;indexByte >= 0; indexByte--) {
3536
+ if (getUint32(tailView, indexByte) == ZIP64_END_OF_CENTRAL_DIR_SIGNATURE && indexByte + 12 + Number(tailView.getBigUint64(indexByte + 4, true)) == tailArray.length) {
3537
+ return startOffset + indexByte;
3538
+ }
3539
+ }
3540
+ }
3541
+ async function probeLocalHeaders(reader, directoryArray, directoryView, offsetDelta) {
3542
+ let result = { localHeaderFound: false, shiftedLocalHeaderFound: false };
3543
+ let recordOffset = 0;
3544
+ while (recordOffset + CENTRAL_FILE_HEADER_LENGTH <= directoryArray.length && getUint32(directoryView, recordOffset) == CENTRAL_FILE_HEADER_SIGNATURE) {
3545
+ const localHeaderOffset = getLocalHeaderOffset(directoryArray, directoryView, recordOffset);
3546
+ if (localHeaderOffset !== UNDEFINED_VALUE) {
3547
+ const localHeaderFound = await startsWithSignature(reader, localHeaderOffset, LOCAL_FILE_HEADER_SIGNATURE);
3548
+ const shiftedLocalHeaderFound = await startsWithSignature(reader, localHeaderOffset + offsetDelta, LOCAL_FILE_HEADER_SIGNATURE);
3549
+ if (!recordOffset) {
3550
+ result = { localHeaderFound, shiftedLocalHeaderFound };
3551
+ }
3552
+ if (localHeaderFound != shiftedLocalHeaderFound) {
3553
+ return { localHeaderFound, shiftedLocalHeaderFound };
3554
+ }
3555
+ }
3556
+ recordOffset += CENTRAL_FILE_HEADER_LENGTH + getUint16(directoryView, recordOffset + 28) + getUint16(directoryView, recordOffset + 30) + getUint16(directoryView, recordOffset + 32);
3557
+ }
3558
+ return result;
3559
+ }
3560
+ function getLocalHeaderOffset(directoryArray, directoryView, recordOffset) {
3561
+ const localHeaderOffset = getUint32(directoryView, recordOffset + 42);
3562
+ if (localHeaderOffset != MAX_32_BITS) {
3563
+ return localHeaderOffset;
3564
+ }
3565
+ let offsetExtraField = recordOffset + CENTRAL_FILE_HEADER_LENGTH + getUint16(directoryView, recordOffset + 28);
3566
+ const endExtraField = Math.min(offsetExtraField + getUint16(directoryView, recordOffset + 30), directoryArray.length);
3567
+ while (offsetExtraField + 4 <= endExtraField) {
3568
+ const type = getUint16(directoryView, offsetExtraField);
3569
+ const size = getUint16(directoryView, offsetExtraField + 2);
3570
+ if (type == EXTRAFIELD_TYPE_ZIP64) {
3571
+ let offsetValue = offsetExtraField + 4;
3572
+ if (getUint32(directoryView, recordOffset + 24) == MAX_32_BITS) {
3573
+ offsetValue += 8;
3574
+ }
3575
+ if (getUint32(directoryView, recordOffset + 20) == MAX_32_BITS) {
3576
+ offsetValue += 8;
3577
+ }
3578
+ return offsetValue + 8 <= endExtraField ? getBigUint64(directoryView, offsetValue) : UNDEFINED_VALUE;
3579
+ }
3580
+ offsetExtraField += 4 + size;
3581
+ }
3582
+ return UNDEFINED_VALUE;
3583
+ }
3584
+ function readDigitalSignature(signatureRecordArray) {
3585
+ if (signatureRecordArray.length >= 6) {
3586
+ const signatureRecordView = getDataView(signatureRecordArray);
3587
+ if (getUint32(signatureRecordView, 0) == DIGITAL_SIGNATURE_RECORD_SIGNATURE) {
3588
+ const signatureDataLength = getUint16(signatureRecordView, 4);
3589
+ if (6 + signatureDataLength <= signatureRecordArray.length) {
3590
+ return new Uint8Array(signatureRecordArray.subarray(6, 6 + signatureDataLength));
3591
+ }
3592
+ }
3593
+ }
3594
+ }
3595
+ function getEncryptedDirectoryDataLength(directoryEncryptionInfo, declaredDirectoryDataLength, directoryDataLength) {
3596
+ const encryptedDirectoryDataLength = directoryEncryptionInfo && directoryEncryptionInfo.compressedSize ? directoryEncryptionInfo.compressedSize : declaredDirectoryDataLength;
3597
+ return encryptedDirectoryDataLength > 0 && encryptedDirectoryDataLength <= directoryDataLength ? encryptedDirectoryDataLength : directoryDataLength;
3598
+ }
3599
+ function getDirectoryEncryptionInfo(rawExtensibleData) {
3600
+ const directoryEncryptionInfo = { rawExtensibleData };
3601
+ if (rawExtensibleData.length >= 28) {
3602
+ const extensibleDataView = getDataView(rawExtensibleData);
3603
+ const hashDataLength = getUint16(extensibleDataView, 26);
3604
+ Object.assign(directoryEncryptionInfo, {
3605
+ compressionMethod: getUint16(extensibleDataView, 0),
3606
+ compressedSize: getBigUint64(extensibleDataView, 2),
3607
+ uncompressedSize: getBigUint64(extensibleDataView, 10),
3608
+ encryptionAlgorithm: getUint16(extensibleDataView, 18),
3609
+ bitLength: getUint16(extensibleDataView, 20),
3610
+ flags: getUint16(extensibleDataView, 22),
3611
+ hashAlgorithm: getUint16(extensibleDataView, 24),
3612
+ hashData: rawExtensibleData.subarray(28, 28 + hashDataLength)
3613
+ });
3614
+ }
3615
+ return directoryEncryptionInfo;
3616
+ }
3617
+ function readCommonHeader(directory, dataView, offset) {
3618
+ const rawBitFlag = directory.rawBitFlag = getUint16(dataView, offset + 2);
3619
+ const encrypted = (rawBitFlag & BITFLAG_ENCRYPTED) == BITFLAG_ENCRYPTED;
3620
+ const rawLastModDate = getUint32(dataView, offset + 6);
3621
+ Object.assign(directory, {
3622
+ encrypted,
3623
+ version: getUint16(dataView, offset),
3624
+ bitFlag: {
3625
+ level: (rawBitFlag & BITFLAG_LEVEL) >> 1,
3626
+ dataDescriptor: (rawBitFlag & BITFLAG_DATA_DESCRIPTOR) == BITFLAG_DATA_DESCRIPTOR,
3627
+ languageEncodingFlag: (rawBitFlag & BITFLAG_LANG_ENCODING_FLAG) == BITFLAG_LANG_ENCODING_FLAG
3628
+ },
3629
+ rawLastModDate,
3630
+ lastModDate: getDate(rawLastModDate),
3631
+ filenameLength: getUint16(dataView, offset + 22),
3632
+ extraFieldLength: getUint16(dataView, offset + 24)
3633
+ });
3634
+ }
3635
+ function readCommonFooter(fileEntry, directory, dataView, offset, localDirectory) {
3636
+ const { rawExtraField } = directory;
3637
+ const extraField = directory.extraField = new Map;
3638
+ const rawExtraFieldView = getDataView(rawExtraField);
3639
+ let offsetExtraField = 0;
3640
+ let malformedExtraField = false;
3641
+ try {
3642
+ while (offsetExtraField < rawExtraField.length) {
3643
+ const type = getUint16(rawExtraFieldView, offsetExtraField);
3644
+ const size = getUint16(rawExtraFieldView, offsetExtraField + 2);
3645
+ extraField.set(type, {
3646
+ type,
3647
+ data: rawExtraField.slice(offsetExtraField + 4, offsetExtraField + 4 + size)
3648
+ });
3649
+ offsetExtraField += 4 + size;
3650
+ }
3651
+ } catch {
3652
+ malformedExtraField = true;
3653
+ }
3654
+ if (offsetExtraField > rawExtraField.length) {
3655
+ malformedExtraField = true;
3656
+ }
3657
+ const compressionMethod = getUint16(dataView, offset + 4);
3658
+ Object.assign(directory, {
3659
+ signature: getUint32(dataView, offset + HEADER_OFFSET_SIGNATURE),
3660
+ crc32: getUint32(dataView, offset + HEADER_OFFSET_SIGNATURE),
3661
+ compressedSize: getUint32(dataView, offset + HEADER_OFFSET_COMPRESSED_SIZE),
3662
+ uncompressedSize: getUint32(dataView, offset + HEADER_OFFSET_UNCOMPRESSED_SIZE)
3663
+ });
3664
+ const extraFieldZip64 = extraField.get(EXTRAFIELD_TYPE_ZIP64);
3665
+ let extraFieldZip64Missing;
3666
+ if (extraFieldZip64) {
3667
+ if (!readExtraFieldZip64(extraFieldZip64, directory, localDirectory)) {
3668
+ malformedExtraField = true;
3669
+ }
3670
+ directory.extraFieldZip64 = extraFieldZip64;
3671
+ } else if (ZIP64_PROPERTIES.some(([propertyName, max]) => directory[propertyName] == max)) {
3672
+ if (localDirectory) {
3673
+ malformedExtraField = true;
3674
+ } else {
3675
+ extraFieldZip64Missing = true;
3676
+ }
3677
+ }
3678
+ const extraFieldUnicodePath = extraField.get(EXTRAFIELD_TYPE_UNICODE_PATH);
3679
+ if (extraFieldUnicodePath) {
3680
+ readExtraFieldUnicode(extraFieldUnicodePath, PROPERTY_NAME_FILENAME, PROPERTY_NAME_RAW_FILENAME, directory, fileEntry);
3681
+ directory.extraFieldUnicodePath = extraFieldUnicodePath;
3682
+ }
3683
+ const extraFieldUnicodeComment = extraField.get(EXTRAFIELD_TYPE_UNICODE_COMMENT);
3684
+ if (extraFieldUnicodeComment) {
3685
+ readExtraFieldUnicode(extraFieldUnicodeComment, PROPERTY_NAME_COMMENT, PROPERTY_NAME_RAW_COMMENT, directory, fileEntry);
3686
+ directory.extraFieldUnicodeComment = extraFieldUnicodeComment;
3687
+ }
3688
+ const extraFieldAES = extraField.get(EXTRAFIELD_TYPE_AES);
3689
+ if (extraFieldAES && (compressionMethod == COMPRESSION_METHOD_AES || directory.encrypted) && extraFieldAES.data.length >= 7) {
3690
+ readExtraFieldAES(extraFieldAES, directory, compressionMethod);
3691
+ directory.extraFieldAES = extraFieldAES;
3692
+ } else {
3693
+ if (extraFieldAES) {
3694
+ malformedExtraField = true;
3695
+ }
3696
+ directory.compressionMethod = compressionMethod;
3697
+ }
3698
+ const extraFieldPkwareUnix = extraField.get(EXTRAFIELD_TYPE_PKWARE_UNIX);
3699
+ if (extraFieldPkwareUnix) {
3700
+ readExtraFieldUnixDates(extraFieldPkwareUnix, directory);
3701
+ directory.extraFieldPkwareUnix = extraFieldPkwareUnix;
3702
+ }
3703
+ const extraFieldUnixType1 = extraField.get(EXTRAFIELD_TYPE_UNIX_TYPE1);
3704
+ if (extraFieldUnixType1) {
3705
+ readExtraFieldUnixDates(extraFieldUnixType1, directory);
3706
+ directory.extraFieldUnixType1 = extraFieldUnixType1;
3707
+ }
3708
+ const extraFieldExtendedTimestamp = extraField.get(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
3709
+ if (extraFieldExtendedTimestamp) {
3710
+ readExtraFieldExtendedTimestamp(extraFieldExtendedTimestamp, directory, localDirectory);
3711
+ directory.extraFieldExtendedTimestamp = extraFieldExtendedTimestamp;
3712
+ }
3713
+ const extraFieldNTFS = extraField.get(EXTRAFIELD_TYPE_NTFS);
3714
+ if (extraFieldNTFS) {
3715
+ readExtraFieldNTFS(extraFieldNTFS, directory);
3716
+ directory.extraFieldNTFS = extraFieldNTFS;
3717
+ }
3718
+ const extraFieldInfoZip = extraField.get(EXTRAFIELD_TYPE_INFOZIP);
3719
+ let unixIdsRead;
3720
+ if (extraFieldInfoZip) {
3721
+ unixIdsRead = readExtraFieldUnix(extraFieldInfoZip, directory, true);
3722
+ directory.extraFieldInfoZip = extraFieldInfoZip;
3723
+ }
3724
+ const extraFieldUnix = extraField.get(EXTRAFIELD_TYPE_UNIX);
3725
+ if (extraFieldUnix) {
3726
+ readExtraFieldUnix(extraFieldUnix, unixIdsRead ? {} : directory, false);
3727
+ directory.extraFieldUnix = extraFieldUnix;
3728
+ }
3729
+ const extraFieldUSDZ = extraField.get(EXTRAFIELD_TYPE_USDZ);
3730
+ if (extraFieldUSDZ) {
3731
+ directory.extraFieldUSDZ = extraFieldUSDZ;
3732
+ }
3733
+ if (extraFieldZip64Missing) {
3734
+ throw new Error(ERR_EXTRAFIELD_ZIP64_NOT_FOUND2);
3735
+ }
3736
+ return malformedExtraField;
3737
+ }
3738
+ function readExtraFieldZip64(extraFieldZip64, directory, localDirectory) {
3739
+ directory.zip64 = true;
3740
+ const extraFieldView = getDataView(extraFieldZip64.data);
3741
+ const missingProperties = ZIP64_PROPERTIES.filter(([propertyName, max]) => directory[propertyName] == max);
3742
+ const requiredLength = missingProperties.reduce((length, [, max]) => length + ZIP64_EXTRACTION[max].bytes, 0);
3743
+ if (extraFieldZip64.data.length < requiredLength) {
3744
+ if (localDirectory) {
3745
+ return false;
3746
+ }
3747
+ throw new Error(ERR_EXTRAFIELD_ZIP64_NOT_FOUND2);
3748
+ }
3749
+ const values = [];
3750
+ try {
3751
+ for (let indexMissingProperty = 0, offset = 0;indexMissingProperty < missingProperties.length; indexMissingProperty++) {
3752
+ const [, max] = missingProperties[indexMissingProperty];
3753
+ const extraction = ZIP64_EXTRACTION[max];
3754
+ values.push(extraction.getValue(extraFieldView, offset));
3755
+ offset += extraction.bytes;
3756
+ }
3757
+ } catch (error) {
3758
+ if (localDirectory) {
3759
+ return false;
3760
+ }
3761
+ throw error;
3762
+ }
3763
+ missingProperties.forEach(([propertyName], indexMissingProperty) => {
3764
+ directory[propertyName] = extraFieldZip64[propertyName] = values[indexMissingProperty];
3765
+ });
3766
+ return true;
3767
+ }
3768
+ function readExtraFieldUnicode(extraFieldUnicode, propertyName, rawPropertyName, directory, fileEntry) {
3769
+ if (extraFieldUnicode.data.length < 5) {
3770
+ extraFieldUnicode.valid = false;
3771
+ return;
3772
+ }
3773
+ const extraFieldView = getDataView(extraFieldUnicode.data);
3774
+ const computedCrc32 = new Crc32;
3775
+ computedCrc32.append(fileEntry[rawPropertyName]);
3776
+ const computedCrc32View = getDataView(new Uint8Array(4));
3777
+ computedCrc32View.setUint32(0, computedCrc32.get(), true);
3778
+ const nameCrc32 = getUint32(extraFieldView, 1);
3779
+ const version = getUint8(extraFieldView, 0);
3780
+ Object.assign(extraFieldUnicode, {
3781
+ version,
3782
+ [propertyName]: decodeText(extraFieldUnicode.data.subarray(5)),
3783
+ valid: version == 1 && !fileEntry.bitFlag.languageEncodingFlag && nameCrc32 == getUint32(computedCrc32View, 0)
3784
+ });
3785
+ if (extraFieldUnicode.valid) {
3786
+ directory[propertyName] = extraFieldUnicode[propertyName];
3787
+ directory[propertyName + PROPERTY_NAME_UTF8_SUFFIX] = true;
3788
+ }
3789
+ }
3790
+ function readExtraFieldAES(extraFieldAES, directory, compressionMethod) {
3791
+ const extraFieldView = getDataView(extraFieldAES.data);
3792
+ const strength = getUint8(extraFieldView, 4);
3793
+ Object.assign(extraFieldAES, {
3794
+ vendorVersion: getUint8(extraFieldView, 0),
3795
+ vendorId: getUint8(extraFieldView, 2),
3796
+ strength,
3797
+ originalCompressionMethod: compressionMethod,
3798
+ compressionMethod: getUint16(extraFieldView, 5)
3799
+ });
3800
+ directory.compressionMethod = extraFieldAES.compressionMethod;
3801
+ if (extraFieldAES.vendorVersion != VENDOR_VERSION_AE_1) {
3802
+ directory.crc32 = UNDEFINED_VALUE;
3803
+ }
3804
+ }
3805
+ function readExtraFieldNTFS(extraFieldNTFS, directory) {
3806
+ const extraFieldView = getDataView(extraFieldNTFS.data);
3807
+ let offsetExtraField = 4;
3808
+ let tag1Data;
3809
+ try {
3810
+ while (offsetExtraField < extraFieldNTFS.data.length && !tag1Data) {
3811
+ const tagValue = getUint16(extraFieldView, offsetExtraField);
3812
+ const attributeSize = getUint16(extraFieldView, offsetExtraField + 2);
3813
+ if (tagValue == EXTRAFIELD_TYPE_NTFS_TAG1) {
3814
+ tag1Data = extraFieldNTFS.data.slice(offsetExtraField + 4, offsetExtraField + 4 + attributeSize);
3815
+ }
3816
+ offsetExtraField += 4 + attributeSize;
3817
+ }
3818
+ } catch {}
3819
+ if (tag1Data && tag1Data.length == 24) {
3820
+ const tag1View = getDataView(tag1Data);
3821
+ const rawLastModDate = tag1View.getBigUint64(0, true);
3822
+ const rawLastAccessDate = tag1View.getBigUint64(8, true);
3823
+ const rawCreationDate = tag1View.getBigUint64(16, true);
3824
+ Object.assign(extraFieldNTFS, {
3825
+ rawLastModDate,
3826
+ rawLastAccessDate,
3827
+ rawCreationDate
3828
+ });
3829
+ const lastModDate = getDateNTFS(rawLastModDate);
3830
+ const lastAccessDate = getDateNTFS(rawLastAccessDate);
3831
+ const creationDate = getDateNTFS(rawCreationDate);
3832
+ const extraFieldData = { lastModDate, lastAccessDate, creationDate };
3833
+ Object.assign(extraFieldNTFS, extraFieldData);
3834
+ Object.assign(directory, extraFieldData, { rawLastAccessDate, rawCreationDate });
3835
+ }
3836
+ }
3837
+ function readExtraFieldUnixDates(extraField, directory) {
3838
+ if (extraField.data.length < 8) {
3839
+ return;
3840
+ }
3841
+ const extraFieldView = getDataView(extraField.data);
3842
+ const lastAccessDate = new Date((getUint32(extraFieldView, 0) | 0) * 1000);
3843
+ const lastModDate = new Date((getUint32(extraFieldView, 4) | 0) * 1000);
3844
+ const extraFieldData = { lastAccessDate, lastModDate };
3845
+ if (extraField.data.length >= 12) {
3846
+ extraFieldData.uid = getUint16(extraFieldView, 8);
3847
+ extraFieldData.gid = getUint16(extraFieldView, 10);
3848
+ }
3849
+ Object.assign(extraField, extraFieldData);
3850
+ Object.assign(directory, extraFieldData);
3851
+ }
3852
+ function readExtraFieldUnix(extraField, directory, isInfoZip) {
3853
+ try {
3854
+ const view = getDataView(extraField.data);
3855
+ let uid, gid;
3856
+ if (isInfoZip) {
3857
+ let offset = 0;
3858
+ const version = getUint8(view, offset++);
3859
+ const uidSize = getUint8(view, offset++);
3860
+ uid = unpackUnixId(extraField.data.subarray(offset, offset + uidSize));
3861
+ offset += uidSize;
3862
+ const gidSize = getUint8(view, offset++);
3863
+ gid = unpackUnixId(extraField.data.subarray(offset, offset + gidSize));
3864
+ Object.assign(extraField, { version, uid, gid });
3865
+ } else if (extraField.data.length >= 4) {
3866
+ uid = getUint16(view, 0);
3867
+ gid = getUint16(view, 2);
3868
+ Object.assign(extraField, { uid, gid });
3869
+ }
3870
+ if (uid !== UNDEFINED_VALUE) {
3871
+ directory.uid = uid;
3872
+ }
3873
+ if (gid !== UNDEFINED_VALUE) {
3874
+ directory.gid = gid;
3875
+ }
3876
+ return uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE;
3877
+ } catch {}
3878
+ }
3879
+ function unpackUnixId(bytes) {
3880
+ const buffer = new Uint8Array(4);
3881
+ buffer.set(bytes, 0);
3882
+ const view = new DataView(buffer.buffer, buffer.byteOffset, 4);
3883
+ return view.getUint32(0, true);
3884
+ }
3885
+ function readExtraFieldExtendedTimestamp(extraFieldExtendedTimestamp, directory, localDirectory) {
3886
+ if (!extraFieldExtendedTimestamp.data.length) {
3887
+ return;
3888
+ }
3889
+ const extraFieldView = getDataView(extraFieldExtendedTimestamp.data);
3890
+ const flags = getUint8(extraFieldView, 0);
3891
+ const timeProperties = [];
3892
+ const timeRawProperties = [];
3893
+ if (localDirectory) {
3894
+ if ((flags & 1) == 1) {
3895
+ timeProperties.push(PROPERTY_NAME_LAST_MODIFICATION_DATE);
3896
+ timeRawProperties.push(PROPERTY_NAME_RAW_LAST_MODIFICATION_DATE);
3897
+ }
3898
+ if ((flags & 2) == 2) {
3899
+ timeProperties.push(PROPERTY_NAME_LAST_ACCESS_DATE);
3900
+ timeRawProperties.push(PROPERTY_NAME_RAW_LAST_ACCESS_DATE);
3901
+ }
3902
+ if ((flags & 4) == 4) {
3903
+ timeProperties.push(PROPERTY_NAME_CREATION_DATE);
3904
+ timeRawProperties.push(PROPERTY_NAME_RAW_CREATION_DATE);
3905
+ }
3906
+ } else if (extraFieldExtendedTimestamp.data.length >= 5) {
3907
+ timeProperties.push(PROPERTY_NAME_LAST_MODIFICATION_DATE);
3908
+ timeRawProperties.push(PROPERTY_NAME_RAW_LAST_MODIFICATION_DATE);
3909
+ }
3910
+ let offset = 1;
3911
+ timeProperties.forEach((propertyName, indexProperty) => {
3912
+ if (extraFieldExtendedTimestamp.data.length >= offset + 4) {
3913
+ const time = getUint32(extraFieldView, offset);
3914
+ directory[propertyName] = extraFieldExtendedTimestamp[propertyName] = new Date((time | 0) * 1000);
3915
+ const rawPropertyName = timeRawProperties[indexProperty];
3916
+ extraFieldExtendedTimestamp[rawPropertyName] = time;
3917
+ }
3918
+ offset += 4;
3919
+ });
3920
+ }
3921
+ async function detectOverlappingEntry({
3922
+ reader,
3923
+ fileEntry,
3924
+ index,
3925
+ offset,
3926
+ crc32,
3927
+ compressedSize,
3928
+ uncompressedSize,
3929
+ dataOffset,
3930
+ dataDescriptor,
3931
+ extraFieldZip64,
3932
+ readRanges
3933
+ }) {
3934
+ let dataDescriptorLength = 0;
3935
+ if (dataDescriptor) {
3936
+ const zip64 = Boolean(extraFieldZip64);
3937
+ const localDataDescriptor = await readLocalDataDescriptor(reader, dataOffset + compressedSize, { crc32, compressedSize, uncompressedSize, zip64 });
3938
+ if (localDataDescriptor) {
3939
+ fileEntry.localDirectory.dataDescriptor = localDataDescriptor;
3940
+ dataDescriptorLength = getDataDescriptorLength(localDataDescriptor.zip64, localDataDescriptor.signature);
3941
+ } else {
3942
+ dataDescriptorLength = getDataDescriptorLength(zip64, false);
3943
+ }
3944
+ }
3945
+ const range = {
3946
+ start: offset,
3947
+ end: dataOffset + compressedSize + dataDescriptorLength,
3948
+ fileEntry
3949
+ };
3950
+ const { indexes, sortedRanges, pendingRanges } = readRanges;
3951
+ if (!indexes.has(index)) {
3952
+ const overlappingRange = findOverlappingRange(sortedRanges, range) || pendingRanges.find((otherRange) => rangesOverlap(range, otherRange));
3953
+ if (overlappingRange) {
3954
+ const error = new Error(ERR_OVERLAPPING_ENTRY2);
3955
+ error.overlappingEntry = overlappingRange.fileEntry;
3956
+ throw error;
3957
+ }
3958
+ indexes.add(index);
3959
+ pendingRanges.push(range);
3960
+ if (pendingRanges.length * pendingRanges.length > sortedRanges.length) {
3961
+ pendingRanges.sort((range, otherRange) => range.start - otherRange.start);
3962
+ readRanges.sortedRanges = mergeRanges(sortedRanges, pendingRanges);
3963
+ pendingRanges.length = 0;
3964
+ }
3965
+ }
3966
+ }
3967
+ function findOverlappingRange(sortedRanges, range) {
3968
+ let low = 0;
3969
+ let high = sortedRanges.length;
3970
+ while (low < high) {
3971
+ const middle = low + high >>> 1;
3972
+ if (sortedRanges[middle].start < range.start) {
3973
+ low = middle + 1;
3974
+ } else {
3975
+ high = middle;
3976
+ }
3977
+ }
3978
+ const previousRange = sortedRanges[low - 1];
3979
+ const nextRange = sortedRanges[low];
3980
+ if (previousRange && rangesOverlap(range, previousRange)) {
3981
+ return previousRange;
3982
+ }
3983
+ if (nextRange && rangesOverlap(range, nextRange)) {
3984
+ return nextRange;
3985
+ }
3986
+ }
3987
+ function rangesOverlap(range, otherRange) {
3988
+ return range.start < otherRange.end && otherRange.start < range.end;
3989
+ }
3990
+ function mergeRanges(sortedRanges, pendingRanges) {
3991
+ const mergedRanges = [];
3992
+ let indexSorted = 0;
3993
+ let indexPending = 0;
3994
+ while (indexSorted < sortedRanges.length || indexPending < pendingRanges.length) {
3995
+ if (indexPending == pendingRanges.length || indexSorted < sortedRanges.length && sortedRanges[indexSorted].start < pendingRanges[indexPending].start) {
3996
+ mergedRanges.push(sortedRanges[indexSorted++]);
3997
+ } else {
3998
+ mergedRanges.push(pendingRanges[indexPending++]);
3999
+ }
4000
+ }
4001
+ return mergedRanges;
4002
+ }
4003
+ async function readLocalDataDescriptor(reader, offset, { crc32, compressedSize, uncompressedSize, zip64 }) {
4004
+ const maxLength = DATA_DESCRIPTOR_RECORD_ZIP_64_LENGTH + DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH;
4005
+ const length = Math.min(maxLength, Math.max(0, reader.size - offset));
4006
+ const dataDescriptorArray = length ? await readUint8Array(reader, offset, length) : EMPTY_UINT8_ARRAY;
4007
+ const dataDescriptorView = getDataView(dataDescriptorArray);
4008
+ const candidates = [[zip64, true], [zip64, false], [!zip64, true], [!zip64, false]].map(([zip64Layout, signature]) => readDataDescriptor(dataDescriptorView, zip64Layout, signature)).filter((candidate) => candidate && candidate.compressedSize == compressedSize && candidate.uncompressedSize == uncompressedSize);
4009
+ return candidates.find((candidate) => candidate.crc32 == crc32) || candidates[0] || readDataDescriptor(dataDescriptorView, zip64, true) || readDataDescriptor(dataDescriptorView, zip64, false);
4010
+ }
4011
+ async function getEntryDataDescriptorLength2(reader, offset, { crc32, compressedSize, uncompressedSize, extraFieldZip64 }) {
4012
+ const dataDescriptor = await readLocalDataDescriptor(reader, offset, { crc32, compressedSize, uncompressedSize, zip64: Boolean(extraFieldZip64) });
4013
+ if (dataDescriptor && dataDescriptor.compressedSize == compressedSize && dataDescriptor.uncompressedSize == uncompressedSize) {
4014
+ return getDataDescriptorLength(dataDescriptor.zip64, dataDescriptor.signature);
4015
+ }
4016
+ }
4017
+ function readDataDescriptor(dataDescriptorView, zip64, signature) {
4018
+ const offset = signature ? DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH : 0;
4019
+ if (dataDescriptorView.byteLength < getDataDescriptorLength(zip64, signature) || signature && getUint32(dataDescriptorView, 0) != DATA_DESCRIPTOR_RECORD_SIGNATURE) {
4020
+ return UNDEFINED_VALUE;
4021
+ }
4022
+ const crc32 = getUint32(dataDescriptorView, offset);
4023
+ let compressedSize;
4024
+ let uncompressedSize;
4025
+ try {
4026
+ if (zip64) {
4027
+ compressedSize = getBigUint64(dataDescriptorView, offset + 4);
4028
+ uncompressedSize = getBigUint64(dataDescriptorView, offset + 12);
4029
+ } else {
4030
+ compressedSize = getUint32(dataDescriptorView, offset + 4);
4031
+ uncompressedSize = getUint32(dataDescriptorView, offset + 8);
4032
+ }
4033
+ } catch {
4034
+ return UNDEFINED_VALUE;
4035
+ }
4036
+ return { signature, zip64, crc32, compressedSize, uncompressedSize };
4037
+ }
4038
+ function getDataDescriptorLength(zip64, signature) {
4039
+ return (zip64 ? DATA_DESCRIPTOR_RECORD_ZIP_64_LENGTH : DATA_DESCRIPTOR_RECORD_LENGTH) + (signature ? DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH : 0);
4040
+ }
4041
+ function getDiskOffset(reader, diskNumber) {
4042
+ return reader.getDiskOffset ? reader.getDiskOffset(diskNumber) : 0;
4043
+ }
4044
+ async function startsWithSplitZipSignature(reader) {
4045
+ return await getFirstSignature(reader) == SPLIT_ZIP_FILE_SIGNATURE;
4046
+ }
4047
+ async function startsWithSplitZipMarker(reader) {
4048
+ const signature = await getFirstSignature(reader);
4049
+ return signature == SPLIT_ZIP_FILE_SIGNATURE || signature == TEMPORARY_SPLIT_ZIP_FILE_SIGNATURE;
4050
+ }
4051
+ async function getFirstSignature(reader) {
4052
+ const signatureArray = await readUint8Array(reader, 0, SPLIT_ZIP_FILE_SIGNATURE_LENGTH);
4053
+ return getUint32(getDataView(signatureArray));
4054
+ }
4055
+ function isStrictnessValue(value) {
4056
+ return value === STRICTNESS_STRICT || value === STRICTNESS_BALANCED || value === STRICTNESS_TOLERANT;
4057
+ }
4058
+ function getDecodableOutputSize(outputSize, compressedSize, compressed) {
4059
+ return Math.min(outputSize, compressed ? compressedSize * MAX_DEFLATE_EXPANSION_RATIO : compressedSize);
4060
+ }
4061
+ function getStrictness(options, inheritedOptions) {
4062
+ return resolveStrictness(options, resolveStrictness(inheritedOptions, STRICTNESS_BALANCED));
4063
+ }
4064
+ function resolveStrictness(options, inheritedStrictness) {
4065
+ const strictness = options[OPTION_STRICTNESS];
4066
+ if (strictness !== UNDEFINED_VALUE) {
4067
+ if (!isStrictnessValue(strictness)) {
4068
+ throw new Error(ERR_INVALID_STRICTNESS2);
4069
+ }
4070
+ return strictness;
4071
+ }
4072
+ const checkAmbiguity = options[OPTION_CHECK_AMBIGUITY];
4073
+ if (checkAmbiguity === UNDEFINED_VALUE) {
4074
+ return inheritedStrictness;
4075
+ }
4076
+ if (checkAmbiguity) {
4077
+ return STRICTNESS_STRICT;
4078
+ }
4079
+ return inheritedStrictness == STRICTNESS_TOLERANT ? STRICTNESS_TOLERANT : STRICTNESS_BALANCED;
4080
+ }
4081
+ function getCheckLocalDirectory(checkLocalDirectory, strictness) {
4082
+ if (checkLocalDirectory === UNDEFINED_VALUE) {
4083
+ return strictness != STRICTNESS_TOLERANT;
4084
+ }
4085
+ return Boolean(checkLocalDirectory);
4086
+ }
4087
+ function getCheckLocalFilename(checkLocalFilename, strictness) {
4088
+ if (checkLocalFilename === UNDEFINED_VALUE) {
4089
+ return strictness == STRICTNESS_STRICT;
4090
+ }
4091
+ return Boolean(checkLocalFilename);
4092
+ }
4093
+ function getFilenameValidation(filenameValidation, strictness) {
4094
+ if (filenameValidation === UNDEFINED_VALUE) {
4095
+ return strictness;
4096
+ }
4097
+ if (!isStrictnessValue(filenameValidation)) {
4098
+ throw new Error(ERR_INVALID_FILENAME_VALIDATION2);
4099
+ }
4100
+ return filenameValidation;
4101
+ }
4102
+ function isUnsafeFilename(filename, filenameValidation) {
4103
+ if (filenameValidation == STRICTNESS_TOLERANT) {
4104
+ return false;
4105
+ }
4106
+ const pathParts = filename.split("/");
4107
+ if (pathParts.length > 1 && pathParts[pathParts.length - 1] === "") {
4108
+ pathParts.pop();
4109
+ }
4110
+ if (PARENT_DIRECTORY_REGEXP.test(filename) || filename.startsWith("/") || filename.startsWith("\\") || DRIVE_LETTER_REGEXP.test(filename)) {
4111
+ return true;
4112
+ }
4113
+ return filenameValidation == STRICTNESS_STRICT && (pathParts.includes(".") || pathParts.includes("") || filename.includes("\x00"));
4114
+ }
4115
+ function getMaxAppendedDataSize(maxAppendedDataSize, strictness) {
4116
+ if (maxAppendedDataSize !== UNDEFINED_VALUE) {
4117
+ const size = toNumber(maxAppendedDataSize);
4118
+ if (typeof size != NUMBER_TYPE || Number.isNaN(size) || size < 0) {
4119
+ throw new Error(ERR_INVALID_MAX_APPENDED_DATA_SIZE2);
4120
+ }
4121
+ return size;
4122
+ }
4123
+ if (strictness == STRICTNESS_STRICT) {
4124
+ return 0;
4125
+ }
4126
+ if (strictness == STRICTNESS_TOLERANT) {
4127
+ return Infinity;
4128
+ }
4129
+ return MAX_16_BITS;
4130
+ }
4131
+ async function findEndOfCentralDirectory(reader, rejectAmbiguous, maxAppendedDataSize) {
4132
+ const { size } = reader;
4133
+ const anchoredLength = Math.min(size, END_OF_CENTRAL_DIR_LENGTH + MAX_16_BITS);
4134
+ const remoteProbeBudget = { remaining: MAX_END_OF_CENTRAL_DIR_PROBES };
4135
+ let endOfDirectoryInfo;
4136
+ let plausibleEndOfDirectoryInfo;
4137
+ let endOfDirectoryReachingEndCount = 0;
4138
+ for await (const [anchoredView, anchoredOffset, anchoredArray, indexByte, offset] of scanEndOfCentralDirectory(reader, anchoredLength)) {
4139
+ const commentLength = getUint16(anchoredView, indexByte + 20);
4140
+ if (offset + END_OF_CENTRAL_DIR_LENGTH + commentLength == size) {
4141
+ const reachability = await getCentralDirectoryReachability(reader, anchoredView, anchoredOffset, indexByte, offset, size, remoteProbeBudget);
4142
+ if (reachability == CENTRAL_DIRECTORY_REACHABLE) {
4143
+ if (!endOfDirectoryInfo) {
4144
+ endOfDirectoryInfo = getEndOfCentralDirectoryInfo(anchoredArray, indexByte, offset);
4145
+ }
4146
+ endOfDirectoryReachingEndCount++;
4147
+ if (!rejectAmbiguous || endOfDirectoryReachingEndCount > 1) {
4148
+ break;
4149
+ }
4150
+ } else if (reachability == CENTRAL_DIRECTORY_PLAUSIBLE && !plausibleEndOfDirectoryInfo) {
4151
+ plausibleEndOfDirectoryInfo = getEndOfCentralDirectoryInfo(anchoredArray, indexByte, offset);
4152
+ }
4153
+ }
4154
+ }
4155
+ if (!endOfDirectoryInfo) {
4156
+ endOfDirectoryInfo = plausibleEndOfDirectoryInfo;
4157
+ }
4158
+ if (!endOfDirectoryInfo) {
4159
+ endOfDirectoryInfo = await seekEndOfCentralDirectory(reader, maxAppendedDataSize, remoteProbeBudget);
4160
+ }
4161
+ return { endOfDirectoryInfo, endOfDirectoryReachingEndCount };
4162
+ }
4163
+ async function seekEndOfCentralDirectory(reader, maxAppendedDataSize, remoteProbeBudget) {
4164
+ const { size } = reader;
4165
+ const searchLength = Math.min(size, maxAppendedDataSize == Infinity ? size : END_OF_CENTRAL_DIR_LENGTH + MAX_16_BITS + maxAppendedDataSize);
4166
+ let firstSignatureInfo, plausibleInfo;
4167
+ for await (const [searchView, searchOffset, searchArray, indexByte, offset] of scanEndOfCentralDirectory(reader, searchLength)) {
4168
+ const record = getEndOfCentralDirectoryInfo(searchArray, indexByte, offset);
4169
+ if (!firstSignatureInfo) {
4170
+ firstSignatureInfo = record;
4171
+ }
4172
+ const reachability = await getCentralDirectoryReachability(reader, searchView, searchOffset, indexByte, offset, size, remoteProbeBudget);
4173
+ if (reachability == CENTRAL_DIRECTORY_REACHABLE) {
4174
+ return record;
4175
+ }
4176
+ if (reachability == CENTRAL_DIRECTORY_PLAUSIBLE && !plausibleInfo) {
4177
+ plausibleInfo = record;
4178
+ }
4179
+ }
4180
+ return plausibleInfo || firstSignatureInfo;
4181
+ }
4182
+ async function* scanEndOfCentralDirectory(reader, scanLength) {
4183
+ const scanOffset = reader.size - scanLength;
4184
+ const scanArray = await readUint8Array(reader, scanOffset, scanLength);
4185
+ const scanView = getDataView(scanArray);
4186
+ for (let indexByte = scanArray.length - END_OF_CENTRAL_DIR_LENGTH;indexByte >= 0; indexByte--) {
4187
+ if (getUint32(scanView, indexByte) == END_OF_CENTRAL_DIR_SIGNATURE) {
4188
+ yield [scanView, scanOffset, scanArray, indexByte, scanOffset + indexByte];
4189
+ }
4190
+ }
4191
+ }
4192
+ function getEndOfCentralDirectoryInfo(scanArray, indexByte, offset) {
4193
+ return { offset, buffer: new Uint8Array(scanArray.subarray(indexByte, indexByte + END_OF_CENTRAL_DIR_LENGTH)).buffer };
4194
+ }
4195
+ async function getCentralDirectoryReachability(reader, view, anchoredOffset, indexByte, offset, size, remoteProbeBudget) {
4196
+ const filesLength = getUint16(view, indexByte + 10);
4197
+ const directoryDataLength = getUint32(view, indexByte + 12);
4198
+ const directoryDataOffset = getUint32(view, indexByte + 16);
4199
+ if (filesLength == MAX_16_BITS || directoryDataLength == MAX_32_BITS || directoryDataOffset == MAX_32_BITS) {
4200
+ const locatorSignature = await readSignature(reader, view, anchoredOffset, offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH, size, remoteProbeBudget);
4201
+ return locatorSignature == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE ? CENTRAL_DIRECTORY_REACHABLE : CENTRAL_DIRECTORY_UNREACHABLE;
4202
+ }
4203
+ if (!filesLength && !directoryDataLength) {
4204
+ return CENTRAL_DIRECTORY_PLAUSIBLE;
4205
+ }
4206
+ const directoryDiskNumber = getUint16(view, indexByte + 6);
4207
+ for (const centralDirectoryOffset of [offset - directoryDataLength, getDiskOffset(reader, directoryDiskNumber) + directoryDataOffset]) {
4208
+ if (await readSignature(reader, view, anchoredOffset, centralDirectoryOffset, size, remoteProbeBudget) == CENTRAL_FILE_HEADER_SIGNATURE) {
4209
+ return CENTRAL_DIRECTORY_REACHABLE;
4210
+ }
4211
+ }
4212
+ return CENTRAL_DIRECTORY_UNREACHABLE;
4213
+ }
4214
+ async function readSignature(reader, view, anchoredOffset, signatureOffset, size, remoteProbeBudget) {
4215
+ if (signatureOffset < 0 || signatureOffset + 4 > size) {
4216
+ return UNDEFINED_VALUE;
4217
+ }
4218
+ if (signatureOffset >= anchoredOffset) {
4219
+ return getUint32(view, signatureOffset - anchoredOffset);
4220
+ }
4221
+ if (remoteProbeBudget.remaining > 0) {
4222
+ remoteProbeBudget.remaining--;
4223
+ const signatureArray = await readUint8Array(reader, signatureOffset, 4);
4224
+ return getUint32(getDataView(signatureArray), 0);
4225
+ }
4226
+ return UNDEFINED_VALUE;
4227
+ }
4228
+ function validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename, warnings) {
4229
+ const { rawFilename } = zipEntry;
4230
+ const reject = !warnings;
4231
+ const maskedLocalDirectory = zipEntry.decryptedDirectory && (localDirectory.rawBitFlag & BITFLAG_MASKED_LOCAL_HEADERS) == BITFLAG_MASKED_LOCAL_HEADERS;
4232
+ if (checkLocalFilename && !maskedLocalDirectory && (rawLocalFilename.length != rawFilename.length || rawLocalFilename.some((byteValue, indexByte) => byteValue != rawFilename[indexByte]))) {
4233
+ reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME2);
4234
+ }
4235
+ if ((localDirectory.rawBitFlag & BITFLAG_AMBIGUITY_MASK) != (zipEntry.rawBitFlag & BITFLAG_AMBIGUITY_MASK)) {
4236
+ reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG2);
4237
+ }
4238
+ if (localDirectory.compressionMethod != zipEntry.compressionMethod) {
4239
+ reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD2);
4240
+ }
4241
+ if (!localDirectory.bitFlag.dataDescriptor && !maskedLocalDirectory && (localDirectory.crc32 || localDirectory.compressedSize || localDirectory.uncompressedSize) && (localDirectory.crc32 != zipEntry.crc32 || localDirectory.compressedSize != zipEntry.compressedSize || localDirectory.uncompressedSize != zipEntry.uncompressedSize)) {
4242
+ reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES2);
4243
+ }
4244
+ }
4245
+ function validateDataDescriptor(zipEntry, localDirectory, warnings) {
4246
+ const { dataDescriptor } = localDirectory;
4247
+ const maskedLocalDirectory = zipEntry.decryptedDirectory && (localDirectory.rawBitFlag & BITFLAG_MASKED_LOCAL_HEADERS) == BITFLAG_MASKED_LOCAL_HEADERS;
4248
+ if (dataDescriptor && !maskedLocalDirectory && (zipEntry.crc32 !== UNDEFINED_VALUE && dataDescriptor.crc32 != zipEntry.crc32 || dataDescriptor.compressedSize != zipEntry.compressedSize || dataDescriptor.uncompressedSize != zipEntry.uncompressedSize)) {
4249
+ reportAmbiguity(!warnings, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES2);
4250
+ }
4251
+ }
4252
+ function reportAmbiguity(reject, warnings, reason) {
4253
+ if (reject) {
4254
+ throwAmbiguousArchive(reason);
4255
+ } else {
4256
+ addWarning(warnings, reason);
4257
+ }
4258
+ }
4259
+ function throwAmbiguousArchive(reason) {
4260
+ const error = new Error(ERR_AMBIGUOUS_ARCHIVE2);
4261
+ error.reason = reason;
4262
+ throw error;
4263
+ }
4264
+ function getOptionValue(zipReader, options, name) {
4265
+ return options[name] === UNDEFINED_VALUE ? zipReader.options[name] : options[name];
4266
+ }
4267
+ function getFunctionOptionValue(zipReader, options, name) {
4268
+ return checkFunctionOption(getOptionValue(zipReader, options, name));
4269
+ }
4270
+ function getDate(timeRaw) {
4271
+ const date = (timeRaw & 4294901760) >> 16, time = timeRaw & MAX_16_BITS;
4272
+ const result = new Date(1980 + ((date & 65024) >> 9), ((date & 480) >> 5) - 1, date & 31, (time & 63488) >> 11, (time & 2016) >> 5, (time & 31) * 2, 0);
4273
+ return result < MIN_DATE ? MIN_DATE : result;
4274
+ }
4275
+ function getDateNTFS(timeRaw) {
4276
+ return new Date(Number(timeRaw / BigInt(1e4) - BigInt(11644473600000)));
4277
+ }
4278
+ function getUint8(view, offset) {
4279
+ return view.getUint8(offset);
4280
+ }
4281
+ function getUint16(view, offset) {
4282
+ return view.getUint16(offset, true);
4283
+ }
4284
+ function getUint32(view, offset) {
4285
+ return view.getUint32(offset, true);
4286
+ }
4287
+ function getBigUint64(view, offset) {
4288
+ const value = view.getBigUint64(offset, true);
4289
+ if (value > MAX_SAFE_UINT64) {
4290
+ throw new Error(ERR_UNSUPPORTED_UINT642);
4291
+ }
4292
+ return Number(value);
4293
+ }
4294
+
4295
+ export { UNDEFINED_VALUE, ERR_LOCAL_FILE_HEADER_NOT_FOUND2, ERR_OVERLAPPING_ENTRY2, ERR_EXTRAFIELD_ZIP64_NOT_FOUND2, FUNCTION_TYPE, setDefaultConfiguration, toExactUint8Array, isErrorObject, createEngine, ERR_INVALID_PASSWORD2, ERR_INVALID_AUTHENTICATION_CODE2, setAESEngine, ERR_UNSUPPORTED_COMPRESSION2, ERR_INVALID_UNCOMPRESSED_SIZE2, ERR_INVALID_COMPRESSED_DATA2, ERR_CODEC_OUT_OF_MEMORY2, ERR_INVALID_CRC322, MESSAGE_EVENT_TYPE, MESSAGE_START, MESSAGE_PULL, MESSAGE_DATA, MESSAGE_ACK_DATA, MESSAGE_CLOSE, ERR_WORKER_STARTUP_TIMEOUT2, configureWorker, setWebWorkerBackend, disableWebWorker, createWorkerInterface, runWorker, Uint8ArrayReader, Uint8ArrayWriter, ERR_BAD_FORMAT2, ERR_EOCDR_NOT_FOUND2, ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND2, ERR_CENTRAL_DIRECTORY_NOT_FOUND2, ERR_ENCRYPTED2, ERR_UNSUPPORTED_ENCRYPTION2, ERR_SPLIT_ZIP_FILE2, ERR_ENTRY_DATA_OUT_OF_BOUNDS2, ERR_AMBIGUOUS_ARCHIVE2, ERR_ENCRYPTED_CENTRAL_DIRECTORY2, ERR_UNSAFE_FILENAME2, ERR_INVALID_STRICTNESS2, ERR_INVALID_FILENAME_VALIDATION2, ERR_INVALID_MAX_APPENDED_DATA_SIZE2, ERR_UNSUPPORTED_UINT642, WARNING_UNSORTED_CENTRAL_DIRECTORY2, WARNING_UNKNOWN_VERSION2, WARNING_COMPRESSED_PATCHED_DATA2, WARNING_MALFORMED_EXTRA_FIELD2, WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA2, WARNING_WRAPPED_ENTRIES_COUNT2, WARNING_APPENDED_DATA2, WARNING_PREPENDED_DATA2, WARNING_PREPENDED_CENTRAL_DIRECTORY2, WARNING_TRAILING_CENTRAL_DIRECTORY_DATA2, WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET2, WARNING_MISSING_ZIP64_EXTRA_FIELD2, WARNING_DUPLICATE_FILENAME2, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY2, WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY2, WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME2, WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG2, WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD2, WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES2, ZipReader2, ZipReaderStream2, isZipFile2, getEntryDataDescriptorLength2 };