| Offset 1, 121 lines modified | Offset 0, 0 lines modified | ||
| 1 | Key·0x42726577: | ||
| 2 | 0000000000000000000000000000000000000000000000000000000000000000000000 | ||
| 3 | 0000000000000000000000000000000000000000000000000000000000000000000000 | ||
| 4 | 0000000000000000000000000000000000000000000000000000000000000000000000 | ||
| 5 | 0000000000000000000000000000000000000000000000000000000000000000000000 | ||
| 6 | 0000000000000000000000000000000000000000000000000000000000000000000000 | ||
| 7 | 0000000000000000000000000000000000000000000000000000000000000000000000 | ||
| 8 | 0000000000000000000000000000000000000000000000000000000000000000000000 | ||
| 9 | 0000000000000000000000000000000000000000000000000000000000000000000000 | ||
| 10 | 0000000000000000000000000000000000000000000000000000000000000000000000 | ||
| 11 | 0000000000000000000000000000000000000000000000000000000000000000000000 | ||
| 12 | 0000000000000000000000000000000000000000000000000000000000000000000000 | ||
| 13 | 0000000000000000000000000000000000000000000000000000000000000000000000 | ||
| 14 | 0000000000000000000000000000000000000000000000000000000000000000000000 | ||
| 15 | 0000000000000000000000000000000000000000000000000000000000000000000000 | ||
| 16 | 0000000000000000000000000000000000000000000000000000000000000000000000 | ||
| 17 | 0000000000000000000000000000000000000000000000000000000000000000000000 | ||
| 18 | 0000000000000000000000000000000000000000000000000000000000000000000000 | ||
| 19 | 0000000000000000000000000000000000000000000000000000000000000000000000 | ||
| 20 | 0000000000000000000000000000000000000000000000000000000000000000000000 | ||
| 21 | 0000000000000000000000000000000000000000000000000000000000000000000000 | ||
| 22 | 0000000000000000000000000000000000000000000000000000000000000000000000 | ||
| 23 | 0000000000000000000000000000000000000000000000000000000000000000000000 | ||
| 24 | 0000000000000000000000000000000000000000000000000000000000000000000000 | ||
| 25 | 0000000000000000000000000000000000000000000000000000000000000000000000 | ||
| 26 | 0000000000000000000000000000000000000000000000000000000000000000000000 | ||
| 27 | 0000000000000000000000000000000000000000000000000000000000000000000000 | ||
| 28 | 0000000000000000000000000000000000000000000000000000000000000000000000 | ||
| 29 | 000000000000000000000000000000000000000000 | ||
| 30 | Key·0x7109871a: | ||
| 31 | f7050000f3050000b50300002c000000280000000301000020000000907a69782f8c85 | ||
| 32 | 98cd0cc05d88089496ec079fdacd36314098d1ee8ff5160d946d030000690300003082 | ||
| 33 | 03653082024da003020102020863707fe532bb2ae7300d06092a864886f70d01010b05 | ||
| 34 | 003060310b300906035504061302554b310c300a060355040813034f5247310c300a06 | ||
| 35 | 0355040713034f524731133011060355040a130a6664726f69642e6f7267310f300d06 | ||
| 36 | 0355040b13064644726f6964310f300d060355040313064644726f69643020170d3236 | ||
| 37 | 303632373135343331325a180f32303533313131323135343331325a3060310b300906 | ||
| 38 | 035504061302554b310c300a060355040813034f5247310c300a060355040713034f52 | ||
| 39 | 4731133011060355040a130a6664726f69642e6f7267310f300d060355040b13064644 | ||
| 40 | 726f6964310f300d060355040313064644726f696430820122300d06092a864886f70d | ||
| 41 | 01010105000382010f003082010a0282010100ac74a8f4fb5ff9c1a0338278598eb9c6 | ||
| 42 | ba0fce0774e5f2dfe7d8aff70c0cb2535a834e125f1581127f7a6f5d3f86dc5195fd7a | ||
| 43 | 4b1c92b26bd6422d7d34de63f255b1782446868cb7bfdc3b992ccb233a52ef9c4d5f81 | ||
| 44 | 954926ca92954b14f8046ec50a095dd5556832565712fd9d41cd934410056864573af7 | ||
| 45 | d8187d1774c6a004b928eb712a907ec5944e75acd901cfb09a1ce230815caae69da3a0 | ||
| 46 | b6bf6fb6d63156b21b8922ed1917331c4f1421eaa8dbb232f7832dcc35e7a6e6907f62 | ||
| 47 | df44fe4a73cd3f238002dfc7a5e2e2fc64ce1596966c7c411f63ad2e19c0339354c530 | ||
| 48 | 83b31e8cfb923799d505bbaa8c2d6bf92187fe3ae13fe30eabe346242d110203010001 | ||
| 49 | a321301f301d0603551d0e04160414ecb0d0226aa2fe884f4897c348146f3ffffc96b7 | ||
| 50 | 300d06092a864886f70d01010b0500038201010048373d1fdd119f7858e6e3c2e5c181 | ||
| 51 | b3ed8072b53c4ab90889efb9b8cd0c23eab3e01752c48305ee01f073d5a108e62196d4 | ||
| 52 | ce553bb0022a0055cac40979bccc03c1a6c90ee4baaad9f217f746731470b128bfd3b2 | ||
| 53 | 4d67879509be45a91d5042396036d3b05594d1f5055dca470801751296b3c5f4d72ece | ||
| 54 | c04320cbbb69ee8a6d9d39309916850db9939afdfca7c90755c57a88fe82343d2b02cb | ||
| 55 | fa45c1467ddc6e81e59fadd39925d9b2e62e85c55625247f04ce42a115ae52a52dec25 | ||
| 56 | f249cf08a392f7efb473a319ea4e410e74bb516475b7c881610fb95a013a9209c4243c | ||
| 57 | 948166bff03e2a50f4c1e6da3bad7c6a918afeeb7472bc45ad09efe63b47200c000000 | ||
| 58 | 080000000df0efbe03000000000000000c0100000801000003010000000100009f951a | ||
| 59 | e4338d0854b7993372119609a1aad086ff8b41ba5aa787ab053dd23c66bee24796e328 | ||
| 60 | 6aa0c286c2b2e25ef4b000c754fd2a701c3e9882b5e323490662c00099829e03e10ecc | ||
| 61 | b618c0932a34e2fecc07215cf475a7818cb81ee91eb3c0a5158039d103ec2db9e69b5d | ||
| 62 | d666cb259af074ee3f051ea855af40aa0da5f2df8990ef28424c06bf663fb796f2a6d4 | ||
| 63 | 37f64249ac07fff028d7c0c84fee432096db1d17c7c31784f7b4bd50349331bc522137 | ||
| 64 | 6186c9f69c61e60ca448b90061794018c6ce579acf77aa148d6d6e91c2a33ce2d20e7a | ||
| 65 | e4d431149275493941c638bafbc90f5b7628889c2cb2d557c2e685aba2f807b32d6aaf | ||
| 66 | 92a3b7814b7340a32601000030820122300d06092a864886f70d01010105000382010f | ||
| 67 | 003082010a0282010100ac74a8f4fb5ff9c1a0338278598eb9c6ba0fce0774e5f2dfe7 | ||
| 68 | d8aff70c0cb2535a834e125f1581127f7a6f5d3f86dc5195fd7a4b1c92b26bd6422d7d | ||
| 69 | 34de63f255b1782446868cb7bfdc3b992ccb233a52ef9c4d5f81954926ca92954b14f8 | ||
| 70 | 046ec50a095dd5556832565712fd9d41cd934410056864573af7d8187d1774c6a004b9 | ||
| 71 | 28eb712a907ec5944e75acd901cfb09a1ce230815caae69da3a0b6bf6fb6d63156b21b | ||
| 72 | 8922ed1917331c4f1421eaa8dbb232f7832dcc35e7a6e6907f62df44fe4a73cd3f2380 | ||
| 73 | 02dfc7a5e2e2fc64ce1596966c7c411f63ad2e19c0339354c53083b31e8cfb923799d5 | ||
| 74 | 05bbaa8c2d6bf92187fe3ae13fe30eabe346242d110203010001 | ||
| 75 | Key·0xf05368c0: | ||
| 76 | f7050000f3050000ad0300002c000000280000000301000020000000907a69782f8c85 | ||
| 77 | 98cd0cc05d88089496ec079fdacd36314098d1ee8ff5160d946d030000690300003082 | ||
| 78 | 03653082024da003020102020863707fe532bb2ae7300d06092a864886f70d01010b05 | ||
| 79 | 003060310b300906035504061302554b310c300a060355040813034f5247310c300a06 | ||
| 80 | 0355040713034f524731133011060355040a130a6664726f69642e6f7267310f300d06 | ||
| 81 | 0355040b13064644726f6964310f300d060355040313064644726f69643020170d3236 | ||
| 82 | 303632373135343331325a180f32303533313131323135343331325a3060310b300906 | ||
| 83 | 035504061302554b310c300a060355040813034f5247310c300a060355040713034f52 | ||
| 84 | 4731133011060355040a130a6664726f69642e6f7267310f300d060355040b13064644 | ||
| 85 | 726f6964310f300d060355040313064644726f696430820122300d06092a864886f70d | ||
| 86 | 01010105000382010f003082010a0282010100ac74a8f4fb5ff9c1a0338278598eb9c6 | ||
| 87 | ba0fce0774e5f2dfe7d8aff70c0cb2535a834e125f1581127f7a6f5d3f86dc5195fd7a | ||
| 88 | 4b1c92b26bd6422d7d34de63f255b1782446868cb7bfdc3b992ccb233a52ef9c4d5f81 | ||
| 89 | 954926ca92954b14f8046ec50a095dd5556832565712fd9d41cd934410056864573af7 | ||
| 90 | d8187d1774c6a004b928eb712a907ec5944e75acd901cfb09a1ce230815caae69da3a0 | ||
| 91 | b6bf6fb6d63156b21b8922ed1917331c4f1421eaa8dbb232f7832dcc35e7a6e6907f62 | ||
| 92 | df44fe4a73cd3f238002dfc7a5e2e2fc64ce1596966c7c411f63ad2e19c0339354c530 | ||
| 93 | 83b31e8cfb923799d505bbaa8c2d6bf92187fe3ae13fe30eabe346242d110203010001 | ||
| 94 | a321301f301d0603551d0e04160414ecb0d0226aa2fe884f4897c348146f3ffffc96b7 | ||
| 95 | 300d06092a864886f70d01010b0500038201010048373d1fdd119f7858e6e3c2e5c181 | ||
| 96 | b3ed8072b53c4ab90889efb9b8cd0c23eab3e01752c48305ee01f073d5a108e62196d4 | ||
| 97 | ce553bb0022a0055cac40979bccc03c1a6c90ee4baaad9f217f746731470b128bfd3b2 | ||
| 98 | 4d67879509be45a91d5042396036d3b05594d1f5055dca470801751296b3c5f4d72ece | ||
| 99 | c04320cbbb69ee8a6d9d39309916850db9939afdfca7c90755c57a88fe82343d2b02cb | ||
| 100 | fa45c1467ddc6e81e59fadd39925d9b2e62e85c55625247f04ce42a115ae52a52dec25 | ||
| 101 | f249cf08a392f7efb473a319ea4e410e74bb516475b7c881610fb95a013a9209c4243c | ||
| 102 | 948166bff03e2a50f4c1e6da3bad7c6a918afeeb7472bc45ad09efe63b472018000000 | ||
| 103 | ffffff7f0000000018000000ffffff7f0c0100000801000003010000000100004b78be | ||
| 104 | edc6e6ad9b5d8231ab5ccb0fc4bf531bb69c374872cc7a4a7e042745420c9f0b3ebac1 | ||
| 105 | 07e5d798c48d8395ade60ea95fae3341b5c4d8c80bc1f7e0c949c038ac268987647ce9 | ||
| 106 | 227ee7d2b6b0c9cb6373b33fa1d47f43537a8c1f27d9c06efa835ce390559a1d580b04 | ||
| 107 | d95337d01d58131e6eb8ff66aa2a877d2e070bb242ff91c862a5674f6a85a7d2ea9a6c | ||
| 108 | 3b45982ab201c72bcf99db71602f372d4e64b224eba0f98aec13d7afaa8f77fbfaa950 | ||
| 109 | 0c0b55f4c3973b5fa624c6c41c69600542bf910073ed32c7eecdbdc3a197a6ddf4ed6f | ||
| 110 | a6870ac058899923d604ff5cbb792b09394e8e92b3ab94b9da572d74b9972056269d1e | ||
| 111 | 62e3ea85a1b3aafe2601000030820122300d06092a864886f70d01010105000382010f | ||
| 112 | 003082010a0282010100ac74a8f4fb5ff9c1a0338278598eb9c6ba0fce0774e5f2dfe7 | ||
| 113 | d8aff70c0cb2535a834e125f1581127f7a6f5d3f86dc5195fd7a4b1c92b26bd6422d7d | ||
| 114 | 34de63f255b1782446868cb7bfdc3b992ccb233a52ef9c4d5f81954926ca92954b14f8 | ||
| 115 | 046ec50a095dd5556832565712fd9d41cd934410056864573af7d8187d1774c6a004b9 | ||
| 116 | 28eb712a907ec5944e75acd901cfb09a1ce230815caae69da3a0b6bf6fb6d63156b21b | ||
| 117 | 8922ed1917331c4f1421eaa8dbb232f7832dcc35e7a6e6907f62df44fe4a73cd3f2380 | ||
| 118 | 02dfc7a5e2e2fc64ce1596966c7c411f63ad2e19c0339354c53083b31e8cfb923799d5 | ||
| 119 | 05bbaa8c2d6bf92187fe3ae13fe30eabe346242d110203010001 | ||
| Offset 1, 8 lines modified | Offset 1, 8 lines modified | ||
| 1 | Zip·file·size:·517 | 1 | Zip·file·size:·51719143·bytes,·number·of·entries:·192 |
| 2 | -rw-r--r--··0.0·unx·······56·b-·defN·81-Jan-01·01:01·META-INF/com/android/build/gradle/app-metadata.properties | 2 | -rw-r--r--··0.0·unx·······56·b-·defN·81-Jan-01·01:01·META-INF/com/android/build/gradle/app-metadata.properties |
| 3 | -rw-r--r--··0.0·unx······120·b-·defN·81-Jan-01·01:01·META-INF/version-control-info.textproto | 3 | -rw-r--r--··0.0·unx······120·b-·defN·81-Jan-01·01:01·META-INF/version-control-info.textproto |
| 4 | -rw-r--r--··0.0·unx·····6971·b-·stor·81-Jan-01·01:01·assets/dexopt/baseline.prof | 4 | -rw-r--r--··0.0·unx·····6971·b-·stor·81-Jan-01·01:01·assets/dexopt/baseline.prof |
| 5 | -rw-r--r--··0.0·unx······392·b-·stor·81-Jan-01·01:01·assets/dexopt/baseline.profm | 5 | -rw-r--r--··0.0·unx······392·b-·stor·81-Jan-01·01:01·assets/dexopt/baseline.profm |
| 6 | -rw-r--r--··0.0·unx·13583992·b-·defN·81-Jan-01·01:01·classes.dex | 6 | -rw-r--r--··0.0·unx·13583992·b-·defN·81-Jan-01·01:01·classes.dex |
| 7 | -rw-r--r--··0.0·unx··4065668·b-·defN·81-Jan-01·01:01·classes2.dex | 7 | -rw-r--r--··0.0·unx··4065668·b-·defN·81-Jan-01·01:01·classes2.dex |
| 8 | -rw-r--r--··0.0·unx····10096·b-·stor·81-Jan-01·01:01·lib/arm64-v8a/libandroidx.graphics.path.so | 8 | -rw-r--r--··0.0·unx····10096·b-·stor·81-Jan-01·01:01·lib/arm64-v8a/libandroidx.graphics.path.so |
| Offset 48, 15 lines modified | Offset 48, 15 lines modified | ||
| 48 | -rw-r--r--··0.0·unx····65392·b-·stor·81-Jan-01·01:01·assets/chaquopy/bootstrap-native/x86_64/math.so | 48 | -rw-r--r--··0.0·unx····65392·b-·stor·81-Jan-01·01:01·assets/chaquopy/bootstrap-native/x86_64/math.so |
| 49 | -rw-r--r--··0.0·unx····23936·b-·stor·81-Jan-01·01:01·assets/chaquopy/bootstrap-native/x86_64/mmap.so | 49 | -rw-r--r--··0.0·unx····23936·b-·stor·81-Jan-01·01:01·assets/chaquopy/bootstrap-native/x86_64/mmap.so |
| 50 | -rw-r--r--··0.0·unx····43368·b-·stor·81-Jan-01·01:01·assets/chaquopy/bootstrap-native/x86_64/zlib.so | 50 | -rw-r--r--··0.0·unx····43368·b-·stor·81-Jan-01·01:01·assets/chaquopy/bootstrap-native/x86_64/zlib.so |
| 51 | -rw-r--r--··0.0·unx···600063·b-·stor·81-Jan-01·01:01·assets/chaquopy/bootstrap.imy | 51 | -rw-r--r--··0.0·unx···600063·b-·stor·81-Jan-01·01:01·assets/chaquopy/bootstrap.imy |
| 52 | -rw-r--r--··0.0·unx·····2941·b-·defN·81-Jan-01·01:01·assets/chaquopy/build.json | 52 | -rw-r--r--··0.0·unx·····2941·b-·defN·81-Jan-01·01:01·assets/chaquopy/build.json |
| 53 | -rw-r--r--··0.0·unx···299427·b-·defN·81-Jan-01·01:01·assets/chaquopy/cacert.pem | 53 | -rw-r--r--··0.0·unx···299427·b-·defN·81-Jan-01·01:01·assets/chaquopy/cacert.pem |
| 54 | -rw-r--r--··0.0·unx··2613498·b-·stor·81-Jan-01·01:01·assets/chaquopy/requirements-arm64-v8a.imy | 54 | -rw-r--r--··0.0·unx··2613498·b-·stor·81-Jan-01·01:01·assets/chaquopy/requirements-arm64-v8a.imy |
| 55 | -rw-r--r--··0.0·unx··156 | 55 | -rw-r--r--··0.0·unx··1564835·b-·stor·81-Jan-01·01:01·assets/chaquopy/requirements-common.imy |
| 56 | -rw-r--r--··0.0·unx··2765792·b-·stor·81-Jan-01·01:01·assets/chaquopy/requirements-x86_64.imy | 56 | -rw-r--r--··0.0·unx··2765792·b-·stor·81-Jan-01·01:01·assets/chaquopy/requirements-x86_64.imy |
| 57 | -rw-r--r--··0.0·unx··1491926·b-·stor·81-Jan-01·01:01·assets/chaquopy/stdlib-arm64-v8a.imy | 57 | -rw-r--r--··0.0·unx··1491926·b-·stor·81-Jan-01·01:01·assets/chaquopy/stdlib-arm64-v8a.imy |
| 58 | -rw-r--r--··0.0·unx··4307576·b-·stor·81-Jan-01·01:01·assets/chaquopy/stdlib-common.imy | 58 | -rw-r--r--··0.0·unx··4307576·b-·stor·81-Jan-01·01:01·assets/chaquopy/stdlib-common.imy |
| 59 | -rw-r--r--··0.0·unx··1526663·b-·stor·81-Jan-01·01:01·assets/chaquopy/stdlib-x86_64.imy | 59 | -rw-r--r--··0.0·unx··1526663·b-·stor·81-Jan-01·01:01·assets/chaquopy/stdlib-x86_64.imy |
| 60 | -rw----·····2.4·fat·····1738·b-·defN·81-Jan-01·01:01·DebugProbesKt.bin | 60 | -rw----·····2.4·fat·····1738·b-·defN·81-Jan-01·01:01·DebugProbesKt.bin |
| 61 | -rw----·····2.4·fat········6·b-·stor·81-Jan-01·01:01·META-INF/androidx.activity_activity-compose.version | 61 | -rw----·····2.4·fat········6·b-·stor·81-Jan-01·01:01·META-INF/androidx.activity_activity-compose.version |
| 62 | -rw----·····2.4·fat········6·b-·stor·81-Jan-01·01:01·META-INF/androidx.activity_activity-ktx.version | 62 | -rw----·····2.4·fat········6·b-·stor·81-Jan-01·01:01·META-INF/androidx.activity_activity-ktx.version |
| Offset 187, 11 lines modified | Offset 187, 8 lines modified | ||
| 187 | -rw----·····0.0·fat······225·b-·stor·81-Jan-01·01:01·res/wN.9.png | 187 | -rw----·····0.0·fat······225·b-·stor·81-Jan-01·01:01·res/wN.9.png |
| 188 | -rw----·····0.0·fat·····2456·b-·defN·81-Jan-01·01:01·res/xN.xml | 188 | -rw----·····0.0·fat·····2456·b-·defN·81-Jan-01·01:01·res/xN.xml |
| 189 | -rw----·····0.0·fat······221·b-·stor·81-Jan-01·01:01·res/xa.9.png | 189 | -rw----·····0.0·fat······221·b-·stor·81-Jan-01·01:01·res/xa.9.png |
| 190 | -rw----·····0.0·fat······221·b-·stor·81-Jan-01·01:01·res/z-.9.png | 190 | -rw----·····0.0·fat······221·b-·stor·81-Jan-01·01:01·res/z-.9.png |
| 191 | -rw----·····0.0·fat······206·b-·stor·81-Jan-01·01:01·res/zL.png | 191 | -rw----·····0.0·fat······206·b-·stor·81-Jan-01·01:01·res/zL.png |
| 192 | -rw----·····0.0·fat······884·b-·stor·81-Jan-01·01:01·res/zz.png | 192 | -rw----·····0.0·fat······884·b-·stor·81-Jan-01·01:01·res/zz.png |
| 193 | -rw----·····0.0·fat···415976·b-·stor·81-Jan-01·01:01·resources.arsc | 193 | -rw----·····0.0·fat···415976·b-·stor·81-Jan-01·01:01·resources.arsc |
| 194 | -rw----·····2.0·fat····19926·b-·defN·81-Jan-01·01:01·META-INF/57818ACA.SF | ||
| 195 | -rw----·····2.0·fat·····1344·b-·defN·81-Jan-01·01:01·META-INF/57818ACA.RSA | ||
| 196 | -rw----·····2.0·fat····19799·b-·defN·81-Jan-01·01:01·META-INF/MANIFEST.MF | ||
| 197 | 19 | 194 | 192·files,·63243604·bytes·uncompressed,·51367666·bytes·compressed:··18.8% |
| Offset 1, 10 lines modified | Offset 1, 10 lines modified | ||
| 1 | Zip·file·size:·156 | 1 | Zip·file·size:·1564835·bytes,·number·of·entries:·486 |
| 2 | -rw----·····2.0·fat····34703·b-·defN·80-Feb-01·00:00·six.py | 2 | -rw----·····2.0·fat····34703·b-·defN·80-Feb-01·00:00·six.py |
| 3 | -rw----·····2.0·fat···160 | 3 | -rw----·····2.0·fat···165012·b-·defN·80-Feb-01·00:00·typing_extensions.py |
| 4 | -rw----·····2.0·fat········0·b-·defN·80-Feb-01·00:00·PIL/ | 4 | -rw----·····2.0·fat········0·b-·defN·80-Feb-01·00:00·PIL/ |
| 5 | -rw----·····2.0·fat·····3477·b-·defN·80-Feb-01·00:00·PIL/BdfFontFile.py | 5 | -rw----·····2.0·fat·····3477·b-·defN·80-Feb-01·00:00·PIL/BdfFontFile.py |
| 6 | -rw----·····2.0·fat····16584·b-·defN·80-Feb-01·00:00·PIL/BlpImagePlugin.py | 6 | -rw----·····2.0·fat····16584·b-·defN·80-Feb-01·00:00·PIL/BlpImagePlugin.py |
| 7 | -rw----·····2.0·fat····19758·b-·defN·80-Feb-01·00:00·PIL/BmpImagePlugin.py | 7 | -rw----·····2.0·fat····19758·b-·defN·80-Feb-01·00:00·PIL/BmpImagePlugin.py |
| 8 | -rw----·····2.0·fat·····1753·b-·defN·80-Feb-01·00:00·PIL/BufrStubImagePlugin.py | 8 | -rw----·····2.0·fat·····1753·b-·defN·80-Feb-01·00:00·PIL/BufrStubImagePlugin.py |
| 9 | -rw----·····2.0·fat·····4604·b-·defN·80-Feb-01·00:00·PIL/ContainerIO.py | 9 | -rw----·····2.0·fat·····4604·b-·defN·80-Feb-01·00:00·PIL/ContainerIO.py |
| 10 | -rw----·····2.0·fat·····1792·b-·defN·80-Feb-01·00:00·PIL/CurImagePlugin.py | 10 | -rw----·····2.0·fat·····1792·b-·defN·80-Feb-01·00:00·PIL/CurImagePlugin.py |
| Offset 245, 34 lines modified | Offset 245, 34 lines modified | ||
| 245 | -rw----·····2.0·fat········0·b-·defN·80-Feb-01·00:00·defusedxml-0.7.1.dist-info/ | 245 | -rw----·····2.0·fat········0·b-·defN·80-Feb-01·00:00·defusedxml-0.7.1.dist-info/ |
| 246 | -rw----·····2.0·fat········4·b-·defN·80-Feb-01·00:00·defusedxml-0.7.1.dist-info/INSTALLER | 246 | -rw----·····2.0·fat········4·b-·defN·80-Feb-01·00:00·defusedxml-0.7.1.dist-info/INSTALLER |
| 247 | -rw----·····2.0·fat·····2409·b-·defN·80-Feb-01·00:00·defusedxml-0.7.1.dist-info/LICENSE | 247 | -rw----·····2.0·fat·····2409·b-·defN·80-Feb-01·00:00·defusedxml-0.7.1.dist-info/LICENSE |
| 248 | -rw----·····2.0·fat····32518·b-·defN·80-Feb-01·00:00·defusedxml-0.7.1.dist-info/METADATA | 248 | -rw----·····2.0·fat····32518·b-·defN·80-Feb-01·00:00·defusedxml-0.7.1.dist-info/METADATA |
| 249 | -rw----·····2.0·fat·······11·b-·defN·80-Feb-01·00:00·defusedxml-0.7.1.dist-info/top_level.txt | 249 | -rw----·····2.0·fat·······11·b-·defN·80-Feb-01·00:00·defusedxml-0.7.1.dist-info/top_level.txt |
| 250 | -rw----·····2.0·fat········0·b-·defN·80-Feb-01·00:00·filelock/ | 250 | -rw----·····2.0·fat········0·b-·defN·80-Feb-01·00:00·filelock/ |
| 251 | -rw----·····2.0·fat·····2612·b-·defN·80-Feb-01·00:00·filelock/__init__.py | 251 | -rw----·····2.0·fat·····2612·b-·defN·80-Feb-01·00:00·filelock/__init__.py |
| 252 | -rw----·····2.0·fat····2 | 252 | -rw----·····2.0·fat····25025·b-·defN·80-Feb-01·00:00·filelock/_api.py |
| 253 | -rw----·····2.0·fat·····8 | 253 | -rw----·····2.0·fat·····8457·b-·defN·80-Feb-01·00:00·filelock/_async_read_write.py |
| 254 | -rw----·····2.0·fat······7 | 254 | -rw----·····2.0·fat······765·b-·defN·80-Feb-01·00:00·filelock/_error.py |
| 255 | -rw----·····2.0·fat····1 | 255 | -rw----·····2.0·fat····17030·b-·defN·80-Feb-01·00:00·filelock/_read_write.py |
| 256 | -rw----·····2.0·fat····10329·b-·defN·80-Feb-01·00:00·filelock/_soft.py | 256 | -rw----·····2.0·fat····10329·b-·defN·80-Feb-01·00:00·filelock/_soft.py |
| 257 | -rw----·····2.0·fat·····45 | 257 | -rw----·····2.0·fat·····4505·b-·defN·80-Feb-01·00:00·filelock/_unix.py |
| 258 | -rw----·····2.0·fat····· | 258 | -rw----·····2.0·fat·····4446·b-·defN·80-Feb-01·00:00·filelock/_util.py |
| 259 | -rw----·····2.0·fat·····3943·b-·defN·80-Feb-01·00:00·filelock/_windows.py | 259 | -rw----·····2.0·fat·····3943·b-·defN·80-Feb-01·00:00·filelock/_windows.py |
| 260 | -rw----·····2.0·fat····15 | 260 | -rw----·····2.0·fat····15795·b-·defN·80-Feb-01·00:00·filelock/asyncio.py |
| 261 | -rw----·····2.0·fat········0·b-·defN·80-Feb-01·00:00·filelock/py.typed | 261 | -rw----·····2.0·fat········0·b-·defN·80-Feb-01·00:00·filelock/py.typed |
| 262 | -rw----·····2.0·fat······522·b-·defN·80-Feb-01·00:00·filelock/version.py | 262 | -rw----·····2.0·fat······522·b-·defN·80-Feb-01·00:00·filelock/version.py |
| 263 | -rw----·····2.0·fat········0·b-·defN·80-Feb-01·00:00·filelock/_soft_rw/ | 263 | -rw----·····2.0·fat········0·b-·defN·80-Feb-01·00:00·filelock/_soft_rw/ |
| 264 | -rw----·····2.0·fat······370·b-·defN·80-Feb-01·00:00·filelock/_soft_rw/__init__.py | 264 | -rw----·····2.0·fat······370·b-·defN·80-Feb-01·00:00·filelock/_soft_rw/__init__.py |
| 265 | -rw----·····2.0·fat·····8 | 265 | -rw----·····2.0·fat·····8654·b-·defN·80-Feb-01·00:00·filelock/_soft_rw/_async.py |
| 266 | -rw----·····2.0·fat···· | 266 | -rw----·····2.0·fat····40857·b-·defN·80-Feb-01·00:00·filelock/_soft_rw/_sync.py |
| 267 | -rw----·····2.0·fat········0·b-·defN·80-Feb-01·00:00·filelock-3.29. | 267 | -rw----·····2.0·fat········0·b-·defN·80-Feb-01·00:00·filelock-3.29.7.dist-info/ |
| 268 | -rw----·····2.0·fat········4·b-·defN·80-Feb-01·00:00·filelock-3.29. | 268 | -rw----·····2.0·fat········4·b-·defN·80-Feb-01·00:00·filelock-3.29.7.dist-info/INSTALLER |
| 269 | -rw----·····2.0·fat·····1977·b-·defN·80-Feb-01·00:00·filelock-3.29. | 269 | -rw----·····2.0·fat·····1977·b-·defN·80-Feb-01·00:00·filelock-3.29.7.dist-info/METADATA |
| 270 | -rw----·····2.0·fat········0·b-·defN·80-Feb-01·00:00·filelock-3.29. | 270 | -rw----·····2.0·fat········0·b-·defN·80-Feb-01·00:00·filelock-3.29.7.dist-info/licenses/ |
| 271 | -rw----·····2.0·fat·····1088·b-·defN·80-Feb-01·00:00·filelock-3.29. | 271 | -rw----·····2.0·fat·····1088·b-·defN·80-Feb-01·00:00·filelock-3.29.7.dist-info/licenses/LICENSE |
| 272 | -rw----·····2.0·fat········0·b-·defN·80-Feb-01·00:00·html2text/ | 272 | -rw----·····2.0·fat········0·b-·defN·80-Feb-01·00:00·html2text/ |
| 273 | -rw----·····2.0·fat····37885·b-·defN·80-Feb-01·00:00·html2text/__init__.py | 273 | -rw----·····2.0·fat····37885·b-·defN·80-Feb-01·00:00·html2text/__init__.py |
| 274 | -rw----·····2.0·fat·······30·b-·defN·80-Feb-01·00:00·html2text/__main__.py | 274 | -rw----·····2.0·fat·······30·b-·defN·80-Feb-01·00:00·html2text/__main__.py |
| 275 | -rw----·····2.0·fat·······63·b-·defN·80-Feb-01·00:00·html2text/_typing.py | 275 | -rw----·····2.0·fat·······63·b-·defN·80-Feb-01·00:00·html2text/_typing.py |
| 276 | -rw----·····2.0·fat······519·b-·defN·80-Feb-01·00:00·html2text/_version.py | 276 | -rw----·····2.0·fat······519·b-·defN·80-Feb-01·00:00·html2text/_version.py |
| 277 | -rw----·····2.0·fat····10300·b-·defN·80-Feb-01·00:00·html2text/cli.py | 277 | -rw----·····2.0·fat····10300·b-·defN·80-Feb-01·00:00·html2text/cli.py |
| 278 | -rw----·····2.0·fat·····4052·b-·defN·80-Feb-01·00:00·html2text/config.py | 278 | -rw----·····2.0·fat·····4052·b-·defN·80-Feb-01·00:00·html2text/config.py |
| Offset 476, 13 lines modified | Offset 476, 13 lines modified | ||
| 476 | -rw----·····2.0·fat·····3755·b-·defN·80-Feb-01·00:00·tinycss/tests/test_page3.py | 476 | -rw----·····2.0·fat·····3755·b-·defN·80-Feb-01·00:00·tinycss/tests/test_page3.py |
| 477 | -rw----·····2.0·fat····10662·b-·defN·80-Feb-01·00:00·tinycss/tests/test_tokenizer.py | 477 | -rw----·····2.0·fat····10662·b-·defN·80-Feb-01·00:00·tinycss/tests/test_tokenizer.py |
| 478 | -rw----·····2.0·fat········0·b-·defN·80-Feb-01·00:00·tinycss-0.4.dist-info/ | 478 | -rw----·····2.0·fat········0·b-·defN·80-Feb-01·00:00·tinycss-0.4.dist-info/ |
| 479 | -rw----·····2.0·fat········4·b-·defN·80-Feb-01·00:00·tinycss-0.4.dist-info/INSTALLER | 479 | -rw----·····2.0·fat········4·b-·defN·80-Feb-01·00:00·tinycss-0.4.dist-info/INSTALLER |
| 480 | -rw----·····2.0·fat·····1521·b-·defN·80-Feb-01·00:00·tinycss-0.4.dist-info/LICENSE | 480 | -rw----·····2.0·fat·····1521·b-·defN·80-Feb-01·00:00·tinycss-0.4.dist-info/LICENSE |
| 481 | -rw----·····2.0·fat·····1860·b-·defN·80-Feb-01·00:00·tinycss-0.4.dist-info/METADATA | 481 | -rw----·····2.0·fat·····1860·b-·defN·80-Feb-01·00:00·tinycss-0.4.dist-info/METADATA |
| 482 | -rw----·····2.0·fat········8·b-·defN·80-Feb-01·00:00·tinycss-0.4.dist-info/top_level.txt | 482 | -rw----·····2.0·fat········8·b-·defN·80-Feb-01·00:00·tinycss-0.4.dist-info/top_level.txt |
| 483 | -rw----·····2.0·fat········0·b-·defN·80-Feb-01·00:00·typing_extensions-4.1 | 483 | -rw----·····2.0·fat········0·b-·defN·80-Feb-01·00:00·typing_extensions-4.16.0.dist-info/ |
| 484 | -rw----·····2.0·fat········4·b-·defN·80-Feb-01·00:00·typing_extensions-4.1 | 484 | -rw----·····2.0·fat········4·b-·defN·80-Feb-01·00:00·typing_extensions-4.16.0.dist-info/INSTALLER |
| 485 | -rw----·····2.0·fat·····3 | 485 | -rw----·····2.0·fat·····3310·b-·defN·80-Feb-01·00:00·typing_extensions-4.16.0.dist-info/METADATA |
| 486 | -rw----·····2.0·fat········0·b-·defN·80-Feb-01·00:00·typing_extensions-4.1 | 486 | -rw----·····2.0·fat········0·b-·defN·80-Feb-01·00:00·typing_extensions-4.16.0.dist-info/licenses/ |
| 487 | -rw----·····2.0·fat····13936·b-·defN·80-Feb-01·00:00·typing_extensions-4.1 | 487 | -rw----·····2.0·fat····13936·b-·defN·80-Feb-01·00:00·typing_extensions-4.16.0.dist-info/licenses/LICENSE |
| 488 | 486·files,·54 | 488 | 486·files,·5457532·bytes·uncompressed,·1494785·bytes·compressed:··72.6% |
| Offset 789, 27 lines modified | Offset 789, 27 lines modified | ||
| 789 | Filename:·filelock/_soft_rw/_async.py | 789 | Filename:·filelock/_soft_rw/_async.py |
| 790 | Comment:· | 790 | Comment:· |
| 791 | Filename:·filelock/_soft_rw/_sync.py | 791 | Filename:·filelock/_soft_rw/_sync.py |
| 792 | Comment:· | 792 | Comment:· |
| 793 | Filename:·filelock-3.29. | 793 | Filename:·filelock-3.29.7.dist-info/ |
| 794 | Comment:· | 794 | Comment:· |
| 795 | Filename:·filelock-3.29. | 795 | Filename:·filelock-3.29.7.dist-info/INSTALLER |
| 796 | Comment:· | 796 | Comment:· |
| 797 | Filename:·filelock-3.29. | 797 | Filename:·filelock-3.29.7.dist-info/METADATA |
| 798 | Comment:· | 798 | Comment:· |
| 799 | Filename:·filelock-3.29. | 799 | Filename:·filelock-3.29.7.dist-info/licenses/ |
| 800 | Comment:· | 800 | Comment:· |
| 801 | Filename:·filelock-3.29. | 801 | Filename:·filelock-3.29.7.dist-info/licenses/LICENSE |
| 802 | Comment:· | 802 | Comment:· |
| 803 | Filename:·html2text/ | 803 | Filename:·html2text/ |
| 804 | Comment:· | 804 | Comment:· |
| 805 | Filename:·html2text/__init__.py | 805 | Filename:·html2text/__init__.py |
| 806 | Comment:· | 806 | Comment:· |
| Offset 1437, 23 lines modified | Offset 1437, 23 lines modified | ||
| 1437 | Filename:·tinycss-0.4.dist-info/METADATA | 1437 | Filename:·tinycss-0.4.dist-info/METADATA |
| 1438 | Comment:· | 1438 | Comment:· |
| 1439 | Filename:·tinycss-0.4.dist-info/top_level.txt | 1439 | Filename:·tinycss-0.4.dist-info/top_level.txt |
| 1440 | Comment:· | 1440 | Comment:· |
| 1441 | Filename:·typing_extensions-4.1 | 1441 | Filename:·typing_extensions-4.16.0.dist-info/ |
| 1442 | Comment:· | 1442 | Comment:· |
| 1443 | Filename:·typing_extensions-4.1 | 1443 | Filename:·typing_extensions-4.16.0.dist-info/INSTALLER |
| 1444 | Comment:· | 1444 | Comment:· |
| 1445 | Filename:·typing_extensions-4.1 | 1445 | Filename:·typing_extensions-4.16.0.dist-info/METADATA |
| 1446 | Comment:· | 1446 | Comment:· |
| 1447 | Filename:·typing_extensions-4.1 | 1447 | Filename:·typing_extensions-4.16.0.dist-info/licenses/ |
| 1448 | Comment:· | 1448 | Comment:· |
| 1449 | Filename:·typing_extensions-4.1 | 1449 | Filename:·typing_extensions-4.16.0.dist-info/licenses/LICENSE |
| 1450 | Comment:· | 1450 | Comment:· |
| 1451 | Zip·file·comment:· | 1451 | Zip·file·comment:· |
| Offset 27, 24782 lines modified | Offset 27, 24782 lines modified | ||
| 27 | 002167·Extract·Zip·Spec······14·(20)·'2.0' | 27 | 002167·Extract·Zip·Spec······14·(20)·'2.0' |
| 28 | 002168·Extract·OS············00·(0)·'MS-DOS' | 28 | 002168·Extract·OS············00·(0)·'MS-DOS' |
| 29 | 002169·General·Purpose·Flag··0800·(2048) | 29 | 002169·General·Purpose·Flag··0800·(2048) |
| 30 | ·······[Bits·1-2]············0·'Normal·Compression' | 30 | ·······[Bits·1-2]············0·'Normal·Compression' |
| 31 | ·······[Bit·11]··············1·'Language·Encoding' | 31 | ·······[Bit·11]··············1·'Language·Encoding' |
| 32 | 00216B·Compression·Method····0008·(8)·'Deflated' | 32 | 00216B·Compression·Method····0008·(8)·'Deflated' |
| 33 | 00216D·Modification·Time·····00410000·(4259840)·'Fri·Feb··1·00:00:00·1980' | 33 | 00216D·Modification·Time·····00410000·(4259840)·'Fri·Feb··1·00:00:00·1980' |
| 34 | 002171·CRC··················· | 34 | 002171·CRC···················0320E133·(52486451) |
| 35 | 002175·Compressed·Size·······00009 | 35 | 002175·Compressed·Size·······00009750·(38736) |
| 36 | 002179·Uncompressed·Size·····0002 | 36 | 002179·Uncompressed·Size·····00028494·(165012) |
| 37 | 00217D·Filename·Length·······0014·(20) | 37 | 00217D·Filename·Length·······0014·(20) |
| 38 | 00217F·Extra·Length··········0014·(20) | 38 | 00217F·Extra·Length··········0014·(20) |
| 39 | 002181·Filename··············'XXXXXXXXXXXXXXXXXXXX' | 39 | 002181·Filename··············'XXXXXXXXXXXXXXXXXXXX' |
| 40 | # | 40 | # |
| 41 | #·WARNING:·Offset·0x2181:·Filename·'XXXXXXXXXXXXXXXXXXXX' | 41 | #·WARNING:·Offset·0x2181:·Filename·'XXXXXXXXXXXXXXXXXXXX' |
| 42 | #··········Zero·length·filename | 42 | #··········Zero·length·filename |
| 43 | # | 43 | # |
| 44 | 002195·Extra·ID·#1···········0001·(1)·'ZIP64' | 44 | 002195·Extra·ID·#1···········0001·(1)·'ZIP64' |
| 45 | 002197···Length··············0010·(16) | 45 | 002197···Length··············0010·(16) |
| 46 | 002199···Uncompressed·Size···000000000002 | 46 | 002199···Uncompressed·Size···0000000000028494·(165012) |
| 47 | 0021A1···Compressed·Size·····0000000000009 | 47 | 0021A1···Compressed·Size·····0000000000009750·(38736) |
| 48 | 0021A9·PAYLOAD | 48 | 0021A9·PAYLOAD | Diff chunk too large, falling back to line-by-line diff (1031 lines added, 1031 lines removed) |
| 49 | 00B | 49 | 00B8F9·LOCAL·HEADER·#3·······04034B50·(67324752) |
| 50 | 00B | 50 | 00B8FD·Extract·Zip·Spec······14·(20)·'2.0' |
| 51 | 00B | 51 | 00B8FE·Extract·OS············00·(0)·'MS-DOS' |
| 52 | 00B | 52 | 00B8FF·General·Purpose·Flag··0800·(2048) |
| 53 | ·······[Bits·1-2]············0·'Normal·Compression' | 53 | ·······[Bits·1-2]············0·'Normal·Compression' |
| 54 | ·······[Bit·11]··············1·'Language·Encoding' | 54 | ·······[Bit·11]··············1·'Language·Encoding' |
| 55 | 00B | 55 | 00B901·Compression·Method····0008·(8)·'Deflated' |
| 56 | 00B | 56 | 00B903·Modification·Time·····00410000·(4259840)·'Fri·Feb··1·00:00:00·1980' |
| 57 | 00B | 57 | 00B907·CRC···················00000000·(0) |
| 58 | 00B | 58 | 00B90B·Compressed·Size·······00000002·(2) |
| 59 | 00B | 59 | 00B90F·Uncompressed·Size·····00000000·(0) |
| 60 | 00B | 60 | 00B913·Filename·Length·······0004·(4) |
| 61 | 00B | 61 | 00B915·Extra·Length··········0014·(20) |
| 62 | 00B | 62 | 00B917·Filename··············'XXXX' |
| 63 | # | 63 | # |
| 64 | #·WARNING:·Offset·0xB | 64 | #·WARNING:·Offset·0xB917:·Filename·'XXXX' |
| 65 | #··········Zero·length·filename | 65 | #··········Zero·length·filename |
| 66 | # | 66 | # |
| 67 | 00B | 67 | 00B91B·Extra·ID·#1···········0001·(1)·'ZIP64' |
| 68 | 00B | 68 | 00B91D···Length··············0010·(16) |
| 69 | 00B | 69 | 00B91F···Uncompressed·Size···0000000000000000·(0) |
| 70 | 00B | 70 | 00B927···Compressed·Size·····0000000000000002·(2) |
| 71 | 00B | 71 | 00B92F·PAYLOAD···············XX |
| 72 | 00B | 72 | 00B931·LOCAL·HEADER·#4·······04034B50·(67324752) |
| 73 | 00B | 73 | 00B935·Extract·Zip·Spec······14·(20)·'2.0' |
| 74 | 00B | 74 | 00B936·Extract·OS············00·(0)·'MS-DOS' |
| 75 | 00B | 75 | 00B937·General·Purpose·Flag··0800·(2048) |
| 76 | ·······[Bits·1-2]············0·'Normal·Compression' | 76 | ·······[Bits·1-2]············0·'Normal·Compression' |
| 77 | ·······[Bit·11]··············1·'Language·Encoding' | 77 | ·······[Bit·11]··············1·'Language·Encoding' |
| 78 | 00B | 78 | 00B939·Compression·Method····0008·(8)·'Deflated' |
| 79 | 00B | 79 | 00B93B·Modification·Time·····00410000·(4259840)·'Fri·Feb··1·00:00:00·1980' |
| 80 | 00B | 80 | 00B93F·CRC···················71F6805A·(1911980122) |
| 81 | 00B | 81 | 00B943·Compressed·Size·······000005AA·(1450) |
| 82 | 00B | 82 | 00B947·Uncompressed·Size·····00000D95·(3477) |
| 83 | 00B | 83 | 00B94B·Filename·Length·······0012·(18) |
| 84 | 00B | 84 | 00B94D·Extra·Length··········0014·(20) |
| 85 | 00B | 85 | 00B94F·Filename··············'XXXXXXXXXXXXXXXXXX' |
| 86 | # | 86 | # |
| 87 | #·WARNING:·Offset·0xB | 87 | #·WARNING:·Offset·0xB94F:·Filename·'XXXXXXXXXXXXXXXXXX' |
| 88 | #··········Zero·length·filename | 88 | #··········Zero·length·filename |
| 89 | # | 89 | # |
| 90 | 00B | 90 | 00B961·Extra·ID·#1···········0001·(1)·'ZIP64' |
| 91 | 00B | 91 | 00B963···Length··············0010·(16) |
| 92 | 00B | 92 | 00B965···Uncompressed·Size···0000000000000D95·(3477) |
| 93 | 00B | 93 | 00B96D···Compressed·Size·····00000000000005AA·(1450) |
| 94 | 00B | 94 | 00B975·PAYLOAD |
| 95 | 00B | 95 | 00BF1F·LOCAL·HEADER·#5·······04034B50·(67324752) |
| 96 | 00B | 96 | 00BF23·Extract·Zip·Spec······14·(20)·'2.0' |
| 97 | 00B | 97 | 00BF24·Extract·OS············00·(0)·'MS-DOS' |
| 98 | 00B | 98 | 00BF25·General·Purpose·Flag··0800·(2048) |
| 99 | ·······[Bits·1-2]············0·'Normal·Compression' | 99 | ·······[Bits·1-2]············0·'Normal·Compression' |
| 100 | ·······[Bit·11]··············1·'Language·Encoding' | 100 | ·······[Bit·11]··············1·'Language·Encoding' |
| 101 | 00B | 101 | 00BF27·Compression·Method····0008·(8)·'Deflated' |
| 102 | 00B | 102 | 00BF29·Modification·Time·····00410000·(4259840)·'Fri·Feb··1·00:00:00·1980' |
| 103 | 00B | 103 | 00BF2D·CRC···················4A35A469·(1245029481) |
| 104 | 00B | 104 | 00BF31·Compressed·Size·······00000FC0·(4032) |
| 105 | 00B | 105 | 00BF35·Uncompressed·Size·····000040C8·(16584) |
| 106 | 00B | 106 | 00BF39·Filename·Length·······0015·(21) |
| 107 | 00B | 107 | 00BF3B·Extra·Length··········0014·(20) |
| 108 | 00B | 108 | 00BF3D·Filename··············'XXXXXXXXXXXXXXXXXXXXX' |
| 109 | # | 109 | # |
| 110 | #·WARNING:·Offset·0xB | 110 | #·WARNING:·Offset·0xBF3D:·Filename·'XXXXXXXXXXXXXXXXXXXXX' |
| 111 | #··········Zero·length·filename | 111 | #··········Zero·length·filename |
| 112 | # | 112 | # |
| 113 | 00B | 113 | 00BF52·Extra·ID·#1···········0001·(1)·'ZIP64' |
| 114 | 00B | 114 | 00BF54···Length··············0010·(16) |
| 115 | 00B | 115 | 00BF56···Uncompressed·Size···00000000000040C8·(16584) |
| 116 | 00B | 116 | 00BF5E···Compressed·Size·····0000000000000FC0·(4032) |
| 117 | 00B | 117 | 00BF66·PAYLOAD |
| 118 | 00C | 118 | 00CF26·LOCAL·HEADER·#6·······04034B50·(67324752) |
| 119 | 00C | 119 | 00CF2A·Extract·Zip·Spec······14·(20)·'2.0' |
| 120 | 00C | 120 | 00CF2B·Extract·OS············00·(0)·'MS-DOS' |
| 121 | 00C | 121 | 00CF2C·General·Purpose·Flag··0800·(2048) |
| 122 | ·······[Bits·1-2]············0·'Normal·Compression' | 122 | ·······[Bits·1-2]············0·'Normal·Compression' |
| 123 | ·······[Bit·11]··············1·'Language·Encoding' | 123 | ·······[Bit·11]··············1·'Language·Encoding' |
| 124 | 00C | 124 | 00CF2E·Compression·Method····0008·(8)·'Deflated' |
| 125 | 00C | 125 | 00CF30·Modification·Time·····00410000·(4259840)·'Fri·Feb··1·00:00:00·1980' |
| 126 | 00C | 126 | 00CF34·CRC···················CAF2DA2B·(3404913195) |
| 127 | 00C | 127 | 00CF38·Compressed·Size·······00001435·(5173) |
| 128 | 00C | 128 | 00CF3C·Uncompressed·Size·····00004D2E·(19758) |
| 129 | 00C | 129 | 00CF40·Filename·Length·······0015·(21) |
| 130 | 00C | 130 | 00CF42·Extra·Length··········0014·(20) |
| 131 | 00C | 131 | 00CF44·Filename··············'XXXXXXXXXXXXXXXXXXXXX' |
| 132 | # | 132 | # |
| 133 | #·WARNING:·Offset·0xC | 133 | #·WARNING:·Offset·0xCF44:·Filename·'XXXXXXXXXXXXXXXXXXXXX' |
| 134 | #··········Zero·length·filename | 134 | #··········Zero·length·filename |
| 135 | # | 135 | # |
| 136 | 00C | 136 | 00CF59·Extra·ID·#1···········0001·(1)·'ZIP64' |
| 137 | 00C | 137 | 00CF5B···Length··············0010·(16) |
| 138 | 00C | 138 | 00CF5D···Uncompressed·Size···0000000000004D2E·(19758) |
| 139 | 00C | 139 | 00CF65···Compressed·Size·····0000000000001435·(5173) |
| 140 | 00C | 140 | 00CF6D·PAYLOAD |
| 141 | 00 | 141 | 00E3A2·LOCAL·HEADER·#7·······04034B50·(67324752) |
| 142 | 00 | 142 | 00E3A6·Extract·Zip·Spec······14·(20)·'2.0' |
| 143 | 00 | 143 | 00E3A7·Extract·OS············00·(0)·'MS-DOS' |
| 144 | 00 | 144 | 00E3A8·General·Purpose·Flag··0800·(2048) |
| 145 | ·······[Bits·1-2]············0·'Normal·Compression' | 145 | ·······[Bits·1-2]············0·'Normal·Compression' |
| 146 | ·······[Bit·11]··············1·'Language·Encoding' | 146 | ·······[Bit·11]··············1·'Language·Encoding' |
| 147 | 00 | 147 | 00E3AA·Compression·Method····0008·(8)·'Deflated' |
| Max diff block lines reached; 1894875/1982511 bytes (95.58%) of diff not shown. | |||
| Offset 87, 14 lines modified | Offset 87, 15 lines modified | ||
| 87 | ····'is_protocol', | 87 | ····'is_protocol', |
| 88 | ····'is_typeddict', | 88 | ····'is_typeddict', |
| 89 | ····'Literal', | 89 | ····'Literal', |
| 90 | ····'NewType', | 90 | ····'NewType', |
| 91 | ····'overload', | 91 | ····'overload', |
| 92 | ····'override', | 92 | ····'override', |
| 93 | ····'Protocol', | 93 | ····'Protocol', |
| 94 | ····'sentinel', | ||
| 94 | ····'Sentinel', | 95 | ····'Sentinel', |
| 95 | ····'reveal_type', | 96 | ····'reveal_type', |
| 96 | ····'runtime', | 97 | ····'runtime', |
| 97 | ····'runtime_checkable', | 98 | ····'runtime_checkable', |
| 98 | ····'Text', | 99 | ····'Text', |
| 99 | ····'TypeAlias', | 100 | ····'TypeAlias', |
| 100 | ····'TypeAliasType', | 101 | ····'TypeAliasType', |
| Offset 144, 38 lines modified | Offset 145, 141 lines modified | ||
| 144 | ····'Sized', | 145 | ····'Sized', |
| 145 | ····'TextIO', | 146 | ····'TextIO', |
| 146 | ····'Tuple', | 147 | ····'Tuple', |
| 147 | ····'Union', | 148 | ····'Union', |
| 148 | ····'ValuesView', | 149 | ····'ValuesView', |
| 149 | ····'cast', | 150 | ····'cast', |
| 150 | ····'no_type_check', | 151 | ····'no_type_check', |
| 151 | ····'no_type_check_decorator', | ||
| 152 | ] | 152 | ] |
| 153 | #·for·backward·compatibility | 153 | #·for·backward·compatibility |
| 154 | PEP_560·=·True | 154 | PEP_560·=·True |
| 155 | GenericMeta·=·type | 155 | GenericMeta·=·type |
| 156 | #·Breakpoint:·https://github.com/python/cpython/pull/116129 | 156 | #·Breakpoint:·https://github.com/python/cpython/pull/116129 |
| 157 | _PEP_696_IMPLEMENTED·=·sys.version_info·>=·(3,·13,·0,·"beta") | 157 | _PEP_696_IMPLEMENTED·=·sys.version_info·>=·(3,·13,·0,·"beta") |
| 158 | #·Added·with·bpo-45166·to·3.10.1+·and·some·3.9·versions | 158 | #·Added·with·bpo-45166·to·3.10.1+·and·some·3.9·versions |
| 159 | _FORWARD_REF_HAS_CLASS·=·"__forward_is_class__"·in·typing.ForwardRef.__slots__ | 159 | _FORWARD_REF_HAS_CLASS·=·"__forward_is_class__"·in·typing.ForwardRef.__slots__ |
| 160 | #·The·functions·below·are·modified·copies·of·typing·internal·helpers. | ||
| 161 | #·They·are·needed·by·_ProtocolMeta·and·they·provide·support·for·PEP·646. | ||
| 160 | def·_caller(depth=1,·default='__main__'): | ||
| 161 | ····try: | ||
| 162 | ········return·sys._getframemodulename(depth·+·1)·or·default | ||
| 163 | ····except·AttributeError:··#·For·platforms·without·_getframemodulename() | ||
| 164 | ········pass | ||
| 165 | ····try: | ||
| 166 | ········return·sys._getframe(depth·+·1).f_globals.get('__name__',·default) | ||
| 167 | ····except·(AttributeError,·ValueError):··#·For·platforms·without·_getframe() | ||
| 168 | ········pass | ||
| 169 | ····return·None | ||
| 170 | #·Placeholder·for·sentinel·methods,·because·sentinels·can·not·have·their·own·sentinels | ||
| 171 | _sentinel_placeholder·=·object() | ||
| 172 | if·hasattr(builtins,·"sentinel"):··#·3.15+ | ||
| 173 | ····sentinel·=·builtins.sentinel | ||
| 174 | else: | ||
| 162 | class· | 175 | ····class·sentinel: |
| 176 | ········"""Create·a·unique·sentinel·object. | ||
| 177 | ········*name*·should·be·the·name·of·the·variable·to·which·the·return·value | ||
| 178 | ········shall·be·assigned. | ||
| 179 | ········""" | ||
| 180 | ········def·__init__( | ||
| 181 | ············self, | ||
| 182 | ············__name:·str·=·_sentinel_placeholder, | ||
| 183 | ············__repr:·typing.Optional[str]·=·_sentinel_placeholder, | ||
| 184 | ············/, | ||
| 185 | ············*, | ||
| 186 | ············repr:·typing.Optional[str]·=·None, | ||
| 187 | ············name:·str·=·_sentinel_placeholder, | ||
| 188 | ········)·->·None: | ||
| 189 | ············if·name·is·not·_sentinel_placeholder: | ||
| 190 | ················warnings.warn( | ||
| 191 | ····················"Passing·'name'·as·a·keyword·argument·is·deprecated;·" | ||
| 192 | ····················"pass·it·positionally·instead.", | ||
| 193 | ····················DeprecationWarning, | ||
| 194 | ····················stacklevel=2, | ||
| 195 | ················) | ||
| 196 | ················__name·=·name | ||
| 197 | ············if·__name·is·_sentinel_placeholder: | ||
| 198 | ················raise·TypeError("First·parameter·'name'·is·required") | ||
| 199 | ············if·__repr·is·not·_sentinel_placeholder: | ||
| 200 | ················warnings.warn( | ||
| 201 | ····················"Passing·'repr'·as·a·positional·argument·is·deprecated;·" | ||
| 202 | ····················"pass·it·by·keyword·instead.", | ||
| 203 | ····················DeprecationWarning, | ||
| 204 | ····················stacklevel=2, | ||
| 205 | ················) | ||
| 206 | ················repr·=·__repr | ||
| 207 | ············self._name·=·__name | ||
| 208 | ············self._repr·=·repr·if·repr·is·not·None·else·__name | ||
| 209 | ············#·For·pickling·as·a·singleton: | ||
| 210 | ············self.__module__·=·_caller() | ||
| 211 | ········def·__init_subclass__(cls): | ||
| 212 | ············warnings.warn( | ||
| 213 | ················"Subclassing·sentinel·is·deprecated·" | ||
| 214 | ················"and·will·be·disallowed·in·Python·3.15", | ||
| 215 | ················DeprecationWarning, | ||
| 216 | ················stacklevel=2, | ||
| 217 | ············) | ||
| 218 | ············super().__init_subclass__() | ||
| 219 | ········def·__setattr__(self,·attr:·str,·value:·object)·->·None: | ||
| 220 | ············if·attr·not·in·{"_name",·"_repr",·"__module__"}: | ||
| 221 | ················warnings.warn( | ||
| 222 | ····················f"Setting·attribute·{attr!r}·on·sentinel·objects·is·deprecated·" | ||
| 223 | ····················"and·will·be·disallowed·in·Python·3.15.", | ||
| 224 | ····················DeprecationWarning, | ||
| 225 | ····················stacklevel=2, | ||
| 226 | ················) | ||
| 227 | ············super().__setattr__(attr,·value) | ||
| 228 | ········@property | ||
| 229 | ········def·__name__(self)·->·str: | ||
| 230 | ············return·self._name | ||
| 231 | ········@__name__.setter | ||
| 232 | ········def·__name__(self,·value:·str)·->·None: | ||
| 233 | ············self._name·=·value | ||
| 163 | ····def·__repr__(self): | 234 | ········def·__repr__(self)·->·str: |
| 164 | ········return· | 235 | ············return·self._repr |
| 236 | ········if·sys.version_info·<·(3,·11): | ||
| Max diff block lines reached; 26678/31298 bytes (85.24%) of diff not shown. | |||
| Offset 5, 15 lines modified | Offset 5, 15 lines modified | ||
| 5 | import·logging | 5 | import·logging |
| 6 | import·os | 6 | import·os |
| 7 | import·sys | 7 | import·sys |
| 8 | import·time | 8 | import·time |
| 9 | import·warnings | 9 | import·warnings |
| 10 | from·abc·import·ABCMeta,·abstractmethod | 10 | from·abc·import·ABCMeta,·abstractmethod |
| 11 | from·dataclasses·import·dataclass | 11 | from·dataclasses·import·dataclass |
| 12 | from·threading·import·local | 12 | from·threading·import·Lock,·local |
| 13 | from·typing·import·TYPE_CHECKING,·Any,·TypeVar | 13 | from·typing·import·TYPE_CHECKING,·Any,·TypeVar |
| 14 | from·weakref·import·WeakValueDictionary | 14 | from·weakref·import·WeakValueDictionary |
| 15 | from·._error·import·Timeout | 15 | from·._error·import·Timeout |
| 16 | from·._util·import·break_lock_file | 16 | from·._util·import·break_lock_file |
| 17 | #:·Sentinel·indicating·that·no·explicit·file·permission·mode·was·passed. | 17 | #:·Sentinel·indicating·that·no·explicit·file·permission·mode·was·passed. |
| Offset 108, 97 lines modified | Offset 108, 106 lines modified | ||
| 108 | _T·=·TypeVar("_T",·bound="BaseFileLock") | 108 | _T·=·TypeVar("_T",·bound="BaseFileLock") |
| 109 | class·FileLockMeta(ABCMeta): | 109 | class·FileLockMeta(ABCMeta): |
| 110 | ····_instances:·WeakValueDictionary[str,·BaseFileLock] | 110 | ····_instances:·WeakValueDictionary[str,·BaseFileLock] |
| 111 | ····_instances_lock:·Lock | ||
| 111 | ····def·__call__(··#·noqa:·PLR0913 | 112 | ····def·__call__(··#·noqa:·PLR0913 |
| 112 | ········cls:·type[_T], | 113 | ········cls:·type[_T], |
| 113 | ········lock_file:·str·|·os.PathLike[str], | 114 | ········lock_file:·str·|·os.PathLike[str], |
| 114 | ········timeout:·float·=·-1, | 115 | ········timeout:·float·=·-1, |
| 115 | ········mode:·int·=·_UNSET_FILE_MODE, | 116 | ········mode:·int·=·_UNSET_FILE_MODE, |
| 116 | ········thread_local:·bool·=·True,··#·noqa:·FBT001,·FBT002 | 117 | ········thread_local:·bool·=·True,··#·noqa:·FBT001,·FBT002 |
| 117 | ········*, | 118 | ········*, |
| 118 | ········blocking:·bool·=·True, | 119 | ········blocking:·bool·=·True, |
| 119 | ········is_singleton:·bool·=·False, | 120 | ········is_singleton:·bool·=·False, |
| 120 | ········poll_interval:·float·=·0.05, | 121 | ········poll_interval:·float·=·0.05, |
| 121 | ········lifetime:·float·|·None·=·None, | 122 | ········lifetime:·float·|·None·=·None, |
| 122 | ········**kwargs:·Any,··#·capture·remaining·kwargs·for·subclasses··#·noqa:·ANN401 | 123 | ········**kwargs:·Any,··#·capture·remaining·kwargs·for·subclasses··#·noqa:·ANN401 |
| 123 | ····)·->·_T: | 124 | ····)·->·_T: |
| 124 | ········if·is_singleton: | ||
| 125 | ············instance·=·cls._instances.get(str(lock_file)) | ||
| 126 | ············if·instance: | ||
| 127 | ················params_to_check·=·{ | ||
| 128 | ····················"thread_local":·(thread_local,·instance.is_thread_local()), | ||
| 129 | ····················"timeout":·(timeout,·instance.timeout), | ||
| 130 | ····················"mode":·(mode,·instance._context.mode),··#·noqa:·SLF001 | ||
| 131 | ····················"blocking":·(blocking,·instance.blocking), | ||
| 132 | ····················"poll_interval":·(poll_interval,·instance.poll_interval), | ||
| 133 | ····················"lifetime":·(lifetime,·instance.lifetime), | ||
| 134 | ················} | ||
| 135 | ················non_matching_params·=·{ | ||
| 136 | ····················name:·(passed_param,·set_param) | ||
| 137 | ····················for·name,·(passed_param,·set_param)·in·params_to_check.items() | ||
| 138 | ····················if·passed_param·!=·set_param | ||
| 139 | ················} | ||
| 140 | ················if·not·non_matching_params: | ||
| 141 | ····················return·instance··#·ty:·ignore[invalid-return-type]··#·https://github.com/astral-sh/ty/issues/3231 | ||
| 142 | ················#·parameters·do·not·match;·raise·error | ||
| 143 | ················msg·=·"Singleton·lock·instances·cannot·be·initialized·with·differing·arguments" | ||
| 144 | ················msg·+=·"\nNon-matching·arguments:·" | ||
| 145 | ················for·param_name,·(passed_param,·set_param)·in·non_matching_params.items(): | ||
| 146 | ····················msg·+=·f"\n\t{param_name}·(existing·lock·has·{set_param}·but·{passed_param}·was·passed)" | ||
| 147 | ················raise·ValueError(msg) | ||
| 148 | ········#·Workaround·to·make·`__init__`'s·params·optional·in·subclasses | ||
| 149 | ········#·E.g.·virtualenv·changes·the·signature·of·the·`__init__`·method·in·the·`BaseFileLock`·class·descendant | ||
| 150 | ········#·(https://github.com/tox-dev/filelock/pull/340) | ||
| 151 | ········ | 125 | ········params·=·{ |
| 152 | ············"timeout":·timeout, | 126 | ············"timeout":·timeout, |
| 153 | ············"mode":·mode, | 127 | ············"mode":·mode, |
| 154 | ············"thread_local":·thread_local, | 128 | ············"thread_local":·thread_local, |
| 155 | ············"blocking":·blocking, | 129 | ············"blocking":·blocking, |
| 156 | ············"is_singleton":·is_singleton, | 130 | ············"is_singleton":·is_singleton, |
| 157 | ············"poll_interval":·poll_interval, | 131 | ············"poll_interval":·poll_interval, |
| 158 | ············"lifetime":·lifetime, | 132 | ············"lifetime":·lifetime, |
| 159 | ············**kwargs, | 133 | ············**kwargs, |
| 160 | ········} | 134 | ········} |
| 135 | ········if·not·is_singleton: | ||
| 136 | ············return·cls._create_instance(lock_file,·params) | ||
| 161 | ········present_params·=·inspect.signature(cls.__init__).parameters | ||
| 162 | ········ | 137 | ········#·Look·up,·build·and·store·under·one·lock.·Without·it·two·threads·racing·the·first·construction·for·a |
| 138 | ········#·path·both·miss·the·cache·and·each·build·their·own·instance,·so·callers·relying·on·is_singleton·for | ||
| 139 | ········#·reentrant·locking·across·instances·end·up·with·two·"singletons"·and·acquire()'s·deadlock·check·then | ||
| 140 | ········#·rejects·a·legitimate·reentrant·acquire;·the·unguarded·writes·to·the·WeakValueDictionary·are·a·data | ||
| 141 | ········#·race·besides.·ReadWriteLock·and·SoftReadWriteLock·already·guard·their·singleton·caches·this·way. | ||
| 142 | ········with·cls._instances_lock: | ||
| 143 | ············if·(instance·:=·cls._instances.get(str(lock_file)))·is·None: | ||
| 144 | ················instance·=·cls._create_instance(lock_file,·params) | ||
| 145 | ················cls._instances[str(lock_file)]·=·instance | ||
| 146 | ················return·instance | ||
| 163 | ········ | 147 | ········params_to_check·=·{ |
| 148 | ············"thread_local":·(thread_local,·instance.is_thread_local()), | ||
| 149 | ············"timeout":·(timeout,·instance.timeout), | ||
| 150 | ············"mode":·(mode,·instance._context.mode),··#·noqa:·SLF001 | ||
| 151 | ············"blocking":·(blocking,·instance.blocking), | ||
| 152 | ············"poll_interval":·(poll_interval,·instance.poll_interval), | ||
| 153 | ············"lifetime":·(lifetime,·instance.lifetime), | ||
| 154 | ········} | ||
| 164 | ········if·is_singleton: | ||
| 165 | ········ | 155 | ········non_matching_params·=·{ |
| 156 | ············name:·(passed_param,·set_param) | ||
| 157 | ············for·name,·(passed_param,·set_param)·in·params_to_check.items() | ||
| 158 | ············if·passed_param·!=·set_param | ||
| 159 | ········} | ||
| 160 | ········if·not·non_matching_params: | ||
| 161 | ············return·instance··#·ty:·ignore[invalid-return-type]··#·https://github.com/astral-sh/ty/issues/3231 | ||
| 166 | ········ret | 162 | ········#·parameters·do·not·match;·raise·error |
| 163 | ········msg·=·"Singleton·lock·instances·cannot·be·initialized·with·differing·arguments" | ||
| 164 | ········msg·+=·"\nNon-matching·arguments:·" | ||
| 165 | ········for·param_name,·(passed_param,·set_param)·in·non_matching_params.items(): | ||
| 166 | ············msg·+=·f"\n\t{param_name}·(existing·lock·has·{set_param}·but·{passed_param}·was·passed)" | ||
| 167 | ········raise·ValueError(msg) | ||
| 168 | ····def·_create_instance(cls:·type[_T],·lock_file:·str·|·os.PathLike[str],·params:·dict[str,·Any])·->·_T: | ||
| 169 | ········#·Keep·only·the·params·this·subclass's·__init__·accepts:·virtualenv·narrows·the·signature·of·its | ||
| 170 | ········#·BaseFileLock·descendant,·so·passing·the·full·set·would·break·it·(https://github.com/tox-dev/filelock/pull/340). | ||
| 171 | ········present_params·=·inspect.signature(cls.__init__).parameters | ||
| 172 | ········init_params·=·{key:·value·for·key,·value·in·params.items()·if·key·in·present_params} | ||
| 173 | ········return·super().__call__(lock_file,·**init_params) | ||
| Max diff block lines reached; 10295/16536 bytes (62.26%) of diff not shown. | |||
| Offset 70, 35 lines modified | Offset 70, 35 lines modified | ||
| 70 | ········self._lock·=·ReadWriteLock(lock_file,·timeout,·blocking=blocking,·is_singleton=is_singleton) | 70 | ········self._lock·=·ReadWriteLock(lock_file,·timeout,·blocking=blocking,·is_singleton=is_singleton) |
| 71 | ········self._loop·=·loop | 71 | ········self._loop·=·loop |
| 72 | ········self._owns_executor·=·executor·is·None | 72 | ········self._owns_executor·=·executor·is·None |
| 73 | ········self._executor·=·executor·or·ThreadPoolExecutor(max_workers=1) | 73 | ········self._executor·=·executor·or·ThreadPoolExecutor(max_workers=1) |
| 74 | ····@property | 74 | ····@property |
| 75 | ····def·lock_file(self)·->·str: | 75 | ····def·lock_file(self)·->·str: |
| 76 | ········""" | 76 | ········"""The·path·to·the·lock·file.""" |
| 77 | ········return·self._lock.lock_file | 77 | ········return·self._lock.lock_file |
| 78 | ····@property | 78 | ····@property |
| 79 | ····def·timeout(self)·->·float: | 79 | ····def·timeout(self)·->·float: |
| 80 | ········""" | 80 | ········"""The·default·timeout.""" |
| 81 | ········return·self._lock.timeout | 81 | ········return·self._lock.timeout |
| 82 | ····@property | 82 | ····@property |
| 83 | ····def·blocking(self)·->·bool: | 83 | ····def·blocking(self)·->·bool: |
| 84 | ········""" | 84 | ········"""Whether·blocking·is·enabled·by·default.""" |
| 85 | ········return·self._lock.blocking | 85 | ········return·self._lock.blocking |
| 86 | ····@property | 86 | ····@property |
| 87 | ····def·loop(self)·->·asyncio.AbstractEventLoop·|·None: | 87 | ····def·loop(self)·->·asyncio.AbstractEventLoop·|·None: |
| 88 | ········""" | 88 | ········"""The·event·loop·(or·``None``·for·the·running·loop).""" |
| 89 | ········return·self._loop | 89 | ········return·self._loop |
| 90 | ····@property | 90 | ····@property |
| 91 | ····def·executor(self)·->·futures.Executor: | 91 | ····def·executor(self)·->·futures.Executor: |
| 92 | ········""" | 92 | ········"""The·executor·used·for·``run_in_executor``·(a·dedicated·single-thread·one·if·none·was·supplied).""" |
| 93 | ········return·self._executor | 93 | ········return·self._executor |
| 94 | ····async·def·_run(self,·func:·Callable[...,·object],·*args:·object,·**kwargs:·object)·->·object: | 94 | ····async·def·_run(self,·func:·Callable[...,·object],·*args:·object,·**kwargs:·object)·->·object: |
| 95 | ········loop·=·self._loop·or·asyncio.get_running_loop() | 95 | ········loop·=·self._loop·or·asyncio.get_running_loop() |
| 96 | ········return·await·loop.run_in_executor(self._executor,·functools.partial(func,·*args,·**kwargs)) | 96 | ········return·await·loop.run_in_executor(self._executor,·functools.partial(func,·*args,·**kwargs)) |
| 97 | ····async·def·acquire_read(self,·timeout:·float·=·-1,·*,·blocking:·bool·=·True)·->·AsyncAcquireReadWriteReturnProxy: | 97 | ····async·def·acquire_read(self,·timeout:·float·=·-1,·*,·blocking:·bool·=·True)·->·AsyncAcquireReadWriteReturnProxy: |
| Offset 15, 14 lines modified | Offset 15, 14 lines modified | ||
| 15 | ········return·f"The·file·lock·'{self._lock_file}'·could·not·be·acquired." | 15 | ········return·f"The·file·lock·'{self._lock_file}'·could·not·be·acquired." |
| 16 | ····def·__repr__(self)·->·str: | 16 | ····def·__repr__(self)·->·str: |
| 17 | ········return·f"{self.__class__.__name__}({self.lock_file!r})" | 17 | ········return·f"{self.__class__.__name__}({self.lock_file!r})" |
| 18 | ····@property | 18 | ····@property |
| 19 | ····def·lock_file(self)·->·str: | 19 | ····def·lock_file(self)·->·str: |
| 20 | ········""" | 20 | ········"""The·path·of·the·file·lock.""" |
| 21 | ········return·self._lock_file | 21 | ········return·self._lock_file |
| 22 | __all__·=·[ | 22 | __all__·=·[ |
| 23 | ····"Timeout", | 23 | ····"Timeout", |
| 24 | ] | 24 | ] |
| Offset 216, 18 lines modified | Offset 216, 27 lines modified | ||
| 216 | ············if·self._lock_level·>·0: | 216 | ············if·self._lock_level·>·0: |
| 217 | ················return·self._validate_reentrant(mode) | 217 | ················return·self._validate_reentrant(mode) |
| 218 | ········start_time·=·time.perf_counter() | 218 | ········start_time·=·time.perf_counter() |
| 219 | ········self._acquire_transaction_lock(blocking=blocking,·timeout=timeout) | 219 | ········self._acquire_transaction_lock(blocking=blocking,·timeout=timeout) |
| 220 | ········try: | 220 | ········try: |
| 221 | ············return·self._do_acquire_inner(mode,·timeout,·blocking=blocking,·start_time=start_time) | 221 | ············return·self._do_acquire_inner(mode,·timeout,·blocking=blocking,·start_time=start_time) |
| 222 | ········except·sqlite3. | 222 | ········except·sqlite3.Error·as·exc: |
| 223 | ············if·"database·is·locked"·not·in·str(exc): | ||
| 224 | ················raise | 223 | ············#·A·read·acquire·runs·BEGIN·(a·deferred·transaction·that·takes·no·database·lock)·and·only·then·the |
| 224 | ············#·SELECT·that·actually·takes·the·SHARED·lock.·If·a·writer·grabs·the·EXCLUSIVE·lock·between·the·two, | ||
| 225 | ············#·the·SELECT·fails·but·BEGIN's·transaction·is·left·open·on·the·shared·connection.·Roll·it·back·here, | ||
| 226 | ············#·while·we·still·hold·_transaction_lock,·otherwise·the·next·acquire's·BEGIN·dies·with·"cannot·start·a | ||
| 227 | ············#·transaction·within·a·transaction"·and·the·instance·is·wedged·for·good.·Catch·only·sqlite3.Error:·a | ||
| 228 | ············#·reentrant-validation·RuntimeError·from·_do_acquire_inner's·double-check·must·not·roll·back,·or·it | ||
| 229 | ············#·would·drop·a·transaction·another·thread·legitimately·holds·on·the·shared·connection. | ||
| 230 | ············with·suppress(sqlite3.Error): | ||
| 231 | ················self._con.rollback() | ||
| 232 | ············if·isinstance(exc,·sqlite3.OperationalError)·and·"database·is·locked"·in·str(exc): | ||
| 225 | ············raise·Timeout(self.lock_file)·from·None | 233 | ················raise·Timeout(self.lock_file)·from·None |
| 234 | ············raise | ||
| 226 | ········finally: | 235 | ········finally: |
| 227 | ············self._transaction_lock.release() | 236 | ············self._transaction_lock.release() |
| 228 | ····def·_do_acquire_inner( | 237 | ····def·_do_acquire_inner( |
| 229 | ········self, | 238 | ········self, |
| 230 | ········mode:·Literal["read",·"write"], | 239 | ········mode:·Literal["read",·"write"], |
| 231 | ········timeout:·float, | 240 | ········timeout:·float, |
| Offset 308, 15 lines modified | Offset 317, 22 lines modified | ||
| 308 | ············else: | 317 | ············else: |
| 309 | ················self._lock_level·-=·1 | 318 | ················self._lock_level·-=·1 |
| 310 | ············if·self._lock_level·==·0: | 319 | ············if·self._lock_level·==·0: |
| 311 | ················self._current_mode·=·None | 320 | ················self._current_mode·=·None |
| 312 | ················self._write_thread_id·=·None | 321 | ················self._write_thread_id·=·None |
| 313 | ················should_rollback·=·True | 322 | ················should_rollback·=·True |
| 314 | ········if·should_rollback: | 323 | ········if·should_rollback: |
| 324 | ············#·The·rollback·ends·the·transaction·on·the·shared·connection,·so·it·has·to·be·serialized·against | ||
| 325 | ············#·acquire()'s·BEGIN·the·same·way·acquire()·already·serializes·itself·with·_transaction_lock.·Without | ||
| 326 | ············#·this,·another·thread·that·sees·lock_level·back·at·0·can·start·its·BEGIN·while·this·rollback's | ||
| 327 | ············#·transaction·is·still·open·(raising·"cannot·start·a·transaction·within·a·transaction")·or,·in·the | ||
| 328 | ············#·other·ordering,·have·its·freshly·started·transaction·rolled·back·here,·dropping·the·database·lock | ||
| 329 | ············#·while·it·still·believes·it·holds·it. | ||
| 330 | ············with·self._transaction_lock: | ||
| 315 | ············self._con.rollback() | 331 | ················self._con.rollback() |
| 316 | ····@contextmanager | 332 | ····@contextmanager |
| 317 | ····def·read_lock(self,·timeout:·float·|·None·=·None,·*,·blocking:·bool·|·None·=·None)·->·Generator[None]: | 333 | ····def·read_lock(self,·timeout:·float·|·None·=·None,·*,·blocking:·bool·|·None·=·None)·->·Generator[None]: |
| 318 | ········""" | 334 | ········""" |
| 319 | ········Context·manager·that·acquires·and·releases·a·shared·read·lock. | 335 | ········Context·manager·that·acquires·and·releases·a·shared·read·lock. |
| 320 | ········Falls·back·to·instance·defaults·for·*timeout*·and·*blocking*·when·``None``. | 336 | ········Falls·back·to·instance·defaults·for·*timeout*·and·*blocking*·when·``None``. |
| Offset 34, 17 lines modified | Offset 34, 17 lines modified | ||
| 34 | ····else: | 34 | ····else: |
| 35 | ········has_fcntl·=·True | 35 | ········has_fcntl·=·True |
| 36 | ····class·UnixFileLock(BaseFileLock): | 36 | ····class·UnixFileLock(BaseFileLock): |
| 37 | ········""" | 37 | ········""" |
| 38 | ········Uses·the·:func:`fcntl.flock`·to·hard·lock·the·lock·file·on·unix·systems. | 38 | ········Uses·the·:func:`fcntl.flock`·to·hard·lock·the·lock·file·on·unix·systems. |
| 39 | ········Lock·file·cleanup:·Unix·and·macOS·delete·the·lock·file·reliably·after·release,·even·in | ||
| 40 | ········multi-threaded·scenarios.·Unlike·Windows,·Unix·allows·unlinking·files·that·other·processes | ||
| 41 | ········ha | 39 | ········The·lock·file·is·intentionally·left·in·place·after·release.·Unlinking·a·locked·file·on·Unix |
| 40 | ········can·split·waiters·across·different·inodes·and·break·mutual·exclusion·for·processes·that | ||
| 41 | ········coordinate·via·the·same·path. | ||
| 42 | ········""" | 42 | ········""" |
| 43 | ········def·_acquire(self)·->·None:··#·noqa:·C901,·PLR0912 | 43 | ········def·_acquire(self)·->·None:··#·noqa:·C901,·PLR0912 |
| 44 | ············ensure_directory_exists(self.lock_file) | 44 | ············ensure_directory_exists(self.lock_file) |
| 45 | ············open_flags·=·os.O_RDWR·|·os.O_TRUNC | 45 | ············open_flags·=·os.O_RDWR·|·os.O_TRUNC |
| 46 | ············o_nofollow·=·getattr(os,·"O_NOFOLLOW",·None) | 46 | ············o_nofollow·=·getattr(os,·"O_NOFOLLOW",·None) |
| 47 | ············if·o_nofollow·is·not·None: | 47 | ············if·o_nofollow·is·not·None: |
| Offset 99, 18 lines modified | Offset 99, 16 lines modified | ||
| 99 | ············from·.asyncio·import·AsyncSoftFileLock,·BaseAsyncFileLock··#·noqa:·PLC0415 | 99 | ············from·.asyncio·import·AsyncSoftFileLock,·BaseAsyncFileLock··#·noqa:·PLC0415 |
| 100 | ············self.__class__·=·AsyncSoftFileLock·if·isinstance(self,·BaseAsyncFileLock)·else·SoftFileLock | 100 | ············self.__class__·=·AsyncSoftFileLock·if·isinstance(self,·BaseAsyncFileLock)·else·SoftFileLock |
| 101 | ········def·_release(self)·->·None: | 101 | ········def·_release(self)·->·None: |
| 102 | ············fd·=·cast("int",·self._context.lock_file_fd) | 102 | ············fd·=·cast("int",·self._context.lock_file_fd) |
| 103 | ············self._context.lock_file_fd·=·None | 103 | ············self._context.lock_file_fd·=·None |
| 104 | ············with·suppress(OSError): | ||
| 105 | ················Path(self.lock_file).unlink() | ||
| 106 | ············fcntl.flock(fd,·fcntl.LOCK_UN) | 104 | ············fcntl.flock(fd,·fcntl.LOCK_UN) |
| 107 | ············with·suppress(OSError):··#·close·can·raise·EIO·on·FUSE/Docker·bind-mount·filesystems | 105 | ············with·suppress(OSError):··#·close·can·raise·EIO·on·FUSE/Docker·bind-mount·filesystems |
| 108 | ················os.close(fd) | 106 | ················os.close(fd) |
| 109 | __all__·=·[ | 107 | __all__·=·[ |
| 110 | ····"UnixFileLock", | 108 | ····"UnixFileLock", |
| 111 | ····"has_fcntl", | 109 | ····"has_fcntl", |
| 112 | ] | 110 | ] |
| Offset 1, 44 lines modified | Offset 1, 47 lines modified | ||
| 1 | from·__future__·import·annotations | 1 | from·__future__·import·annotations |
| 2 | import·os | 2 | import·os |
| 3 | import·secrets | ||
| 3 | import·stat | 4 | import·stat |
| 4 | import·sys | 5 | import·sys |
| 5 | from·errno·import·EACCES,·EISDIR | 6 | from·errno·import·EACCES,·EISDIR |
| 6 | from·pathlib·import·Path | 7 | from·pathlib·import·Path |
| 7 | def·raise_on_not_writable_file(filename:·str)·->·None: | 8 | def·raise_on_not_writable_file(filename:·str)·->·None: |
| 8 | ····""" | 9 | ····""" |
| 9 | ····Raise·an·exception·if·attempting·to·open·the·file·for·writing·would·fail. | 10 | ····Raise·an·exception·if·attempting·to·open·the·file·for·writing·would·fail. |
| 11 | ····Separates·files·that·can·never·be·written·from·files·that·are·writable·but·currently·locked. | ||
| 10 | ····This·is·done·so·files·that·will·never·be·writable·can·be·separated·from·files·that·are·writable·but·currently | ||
| 11 | ····locked. | ||
| 12 | ····:param·filename:·file·to·check | 12 | ····:param·filename:·file·to·check |
| 13 | ····:raises·OSError:·as·if·the·file·was·opened·for·writing. | 13 | ····:raises·OSError:·as·if·the·file·was·opened·for·writing. |
| 14 | ····""" | 14 | ····""" |
| 15 | ····try: | 15 | ····try: |
| 16 | ········#·lstat,·not·stat:·it·settles·exists-and-writable·in·one·syscall,·and·a·hostile·symlink·planted·at·the·lock | ||
| 17 | ········#·path·would·otherwise·make·this·inspect·the·link·target,·letting·an·attacker·turn·a·contended·acquire·into·a | ||
| 18 | ········#·misleading·PermissionError·/·IsADirectoryError·and·probe·that·target's·attributes.·The·real·open·passes | ||
| 19 | ········#·O_NOFOLLOW·and·refuses·the·symlink·anyway. | ||
| 16 | ········file_stat·=·os.stat(filename) | 20 | ········file_stat·=·os.lstat(filename) |
| 17 | ····except·OSError: | 21 | ····except·OSError: |
| 18 | ········return··#· | 22 | ········return··#·does·not·exist,·or·an·error·the·caller·cannot·act·on |
| 19 | ···· | 23 | ····#·No·mtime·guard:·the·old·`if·st_mtime·!=·0`·skip·existed·for·NFS/Linux·quirks·where·os.lstat·could·return·an |
| 24 | ····#·all-zero·struct,·which·it·no·longer·does.·Skipping·on·mtime·0·let·a·read-only·file·or·a·directory·at·the·lock | ||
| 25 | ····#·path·pass·as·missing,·so·acquire()·blocked·forever·on·an·open·that·cannot·succeed. | ||
| 20 | ···· | 26 | ····if·not·(file_stat.st_mode·&·stat.S_IWUSR): |
| 21 | ········ | 27 | ········raise·PermissionError(EACCES,·"Permission·denied",·filename) |
| 22 | ···· | 28 | ····if·stat.S_ISDIR(file_stat.st_mode): |
| 23 | ········ | 29 | ········if·sys.platform·==·"win32":··#·pragma:·win32·cover |
| 24 | ················#·On·Windows,·this·is·PermissionError | ||
| 25 | ············ | 30 | ············raise·PermissionError(EACCES,·"Permission·denied",·filename) |
| 26 | ············else:··#·pragma:·win32·no·cover·#·noqa:·RET506 | ||
| 27 | ················#·On·linux·/·macOS,·this·is·IsADirectoryError | ||
| 28 | ········ | 31 | ········raise·IsADirectoryError(EISDIR,·"Is·a·directory",·filename)··#·pragma:·win32·no·cover |
| 29 | def·ensure_directory_exists(filename:·Path·|·str)·->·None: | 32 | def·ensure_directory_exists(filename:·Path·|·str)·->·None: |
| 30 | ····""" | 33 | ····""" |
| 31 | ····Ensure·the·directory·containing·the·file·exists·(create·it·if·necessary). | 34 | ····Ensure·the·directory·containing·the·file·exists·(create·it·if·necessary). |
| 32 | ····:param·filename:·file. | 35 | ····:param·filename:·file. |
| Offset 57, 22 lines modified | Offset 60, 28 lines modified | ||
| 57 | ····recreated·the·lock·between·the·stale·decision·and·the·rename,·so·we·grabbed·a·live·file·and·must·abort,·leaving·the | 60 | ····recreated·the·lock·between·the·stale·decision·and·the·rename,·so·we·grabbed·a·live·file·and·must·abort,·leaving·the |
| 58 | ····renamed·file·in·place·rather·than·rolling·back·(a·rollback·rename·is·itself·racy·—·same·trade-off·as·the·soft | 61 | ····renamed·file·in·place·rather·than·rolling·back·(a·rollback·rename·is·itself·racy·—·same·trade-off·as·the·soft |
| 59 | ····read/write·marker·break).·The·inode·check·matters·because·filesystems·with·coarse·modification-time·granularity | 62 | ····read/write·marker·break).·The·inode·check·matters·because·filesystems·with·coarse·modification-time·granularity |
| 60 | ····(NFS,·FAT)·can·give·a·same-second·recreation·the·old·mtime,·so·mtime·alone·would·not·catch·it·and·a·live·lock·would | 63 | ····(NFS,·FAT)·can·give·a·same-second·recreation·the·old·mtime,·so·mtime·alone·would·not·catch·it·and·a·live·lock·would |
| 61 | ····be·unlinked;·the·inode·is·the·reliable·identity,·mirroring·the·token·re-check·in·the·soft·read/write·marker·break. | 64 | ····be·unlinked;·the·inode·is·the·reliable·identity,·mirroring·the·token·re-check·in·the·soft·read/write·marker·break. |
| 62 | ····``lstat``·is·used·so·a·hostile·symlink·swapped·in·after·the·decision·is·not·followed. | 65 | ····``lstat``·is·used·so·a·hostile·symlink·swapped·in·after·the·decision·is·not·followed. |
| 66 | ····The·break·name·carries·a·random·token·so·it·is·unguessable·and·unique·per·attempt.·Without·it·two·breakers·in·the | ||
| 67 | ····same·process·share·``<lock>.break.<pid>``,·and·a·second·break·can·rename·a·freshly·recreated·live·lock·onto·that | ||
| 68 | ····path·in·the·window·between·the·re-verify·``lstat``·above·and·the·``unlink``·below,·so·we·would·delete·a·live·lock | ||
| 69 | ····the·inode·check·just·approved.·A·private·name·means·nobody·else·can·target·our·break·path,·matching·the·soft | ||
| 70 | ····read/write·marker·break. | ||
| 63 | ····:param·lock_file:·path·to·the·lock·file·to·break. | 71 | ····:param·lock_file:·path·to·the·lock·file·to·break. |
| 64 | ····:param·mtime_before:·modification·time·observed·when·the·lock·was·judged·stale. | 72 | ····:param·mtime_before:·modification·time·observed·when·the·lock·was·judged·stale. |
| 65 | ····:param·ino_before:·inode·number·observed·when·the·lock·was·judged·stale. | 73 | ····:param·ino_before:·inode·number·observed·when·the·lock·was·judged·stale. |
| 66 | ····:raises·OSError:·if·the·rename·fails·(e.g.·the·file·vanished·or·is·not·owned·in·a·sticky·directory). | 74 | ····:raises·OSError:·if·the·rename·fails·(e.g.·the·file·vanished·or·is·not·owned·in·a·sticky·directory). |
| 67 | ····""" | 75 | ····""" |
| 68 | ····break_path·=·f"{lock_file}.break.{os.getpid()}" | 76 | ····break_path·=·f"{lock_file}.break.{os.getpid()}.{secrets.token_hex(16)}" |
| 69 | ····Path(lock_file).rename(break_path) | 77 | ····Path(lock_file).rename(break_path) |
| 70 | ····try: | 78 | ····try: |
| 71 | ········st_after·=·os.lstat(break_path) | 79 | ········st_after·=·os.lstat(break_path) |
| 72 | ····except·OSError: | 80 | ····except·OSError: |
| 73 | ········return | 81 | ········return |
| 74 | ····if·st_after.st_mtime·>·mtime_before·or·st_after.st_ino·!=·ino_before: | 82 | ····if·st_after.st_mtime·>·mtime_before·or·st_after.st_ino·!=·ino_before: |
| 75 | ········return | 83 | ········return |
| Offset 8, 15 lines modified | Offset 8, 15 lines modified | ||
| 8 | import·os | 8 | import·os |
| 9 | import·time | 9 | import·time |
| 10 | from·dataclasses·import·dataclass | 10 | from·dataclasses·import·dataclass |
| 11 | from·inspect·import·iscoroutinefunction | 11 | from·inspect·import·iscoroutinefunction |
| 12 | from·threading·import·local | 12 | from·threading·import·local |
| 13 | from·typing·import·TYPE_CHECKING,·Any,·NoReturn,·TypeVar | 13 | from·typing·import·TYPE_CHECKING,·Any,·NoReturn,·TypeVar |
| 14 | from·._api·import·_UNSET_FILE_MODE,·BaseFileLock,·FileLockContext,·FileLockMeta | 14 | from·._api·import·_UNSET_FILE_MODE,·BaseFileLock,·FileLockContext,·FileLockMeta,·_canonical |
| 15 | from·._error·import·Timeout | 15 | from·._error·import·Timeout |
| 16 | from·._soft·import·SoftFileLock | 16 | from·._soft·import·SoftFileLock |
| 17 | from·._unix·import·UnixFileLock | 17 | from·._unix·import·UnixFileLock |
| 18 | from·._windows·import·WindowsFileLock | 18 | from·._windows·import·WindowsFileLock |
| 19 | if·TYPE_CHECKING: | 19 | if·TYPE_CHECKING: |
| 20 | ····import·sys | 20 | ····import·sys |
| Offset 110, 14 lines modified | Offset 110, 16 lines modified | ||
| 110 | ····""" | 110 | ····""" |
| 111 | ····Base·class·for·asynchronous·file·locks. | 111 | ····Base·class·for·asynchronous·file·locks. |
| 112 | ····..·versionadded::·3.15.0 | 112 | ····..·versionadded::·3.15.0 |
| 113 | ····""" | 113 | ····""" |
| 114 | ····_deadlock_holder_desc:·str·=·"BaseAsyncFileLock·instance·in·this·task" | ||
| 114 | ····def·__init__(··#·noqa:·PLR0913 | 115 | ····def·__init__(··#·noqa:·PLR0913 |
| 115 | ········self, | 116 | ········self, |
| 116 | ········lock_file:·str·|·os.PathLike[str], | 117 | ········lock_file:·str·|·os.PathLike[str], |
| 117 | ········timeout:·float·=·-1, | 118 | ········timeout:·float·=·-1, |
| 118 | ········mode:·int·=·_UNSET_FILE_MODE, | 119 | ········mode:·int·=·_UNSET_FILE_MODE, |
| 119 | ········thread_local:·bool·=·False,··#·noqa:·FBT001,·FBT002 | 120 | ········thread_local:·bool·=·False,··#·noqa:·FBT001,·FBT002 |
| 120 | ········*, | 121 | ········*, |
| Offset 177, 35 lines modified | Offset 179, 35 lines modified | ||
| 177 | ········} | 179 | ········} |
| 178 | ········self._context:·AsyncFileLockContext·=·(AsyncThreadLocalFileContext·if·thread_local·else·AsyncFileLockContext)( | 180 | ········self._context:·AsyncFileLockContext·=·(AsyncThreadLocalFileContext·if·thread_local·else·AsyncFileLockContext)( |
| 179 | ············**kwargs | 181 | ············**kwargs |
| 180 | ········) | 182 | ········) |
| 181 | ····@property | 183 | ····@property |
| 182 | ····def·run_in_executor(self)·->·bool: | 184 | ····def·run_in_executor(self)·->·bool: |
| 183 | ········""" | 185 | ········"""Whether·run·in·executor.""" |
| 184 | ········return·self._context.run_in_executor | 186 | ········return·self._context.run_in_executor |
| 185 | ····@property | 187 | ····@property |
| 186 | ····def·executor(self)·->·futures.Executor·|·None: | 188 | ····def·executor(self)·->·futures.Executor·|·None: |
| 187 | ········""" | 189 | ········"""The·executor.""" |
| 188 | ········return·self._context.executor | 190 | ········return·self._context.executor |
| 189 | ····@executor.setter | 191 | ····@executor.setter |
| 190 | ····def·executor(self,·value:·futures.Executor·|·None)·->·None:··#·pragma:·no·cover | 192 | ····def·executor(self,·value:·futures.Executor·|·None)·->·None:··#·pragma:·no·cover |
| 191 | ········""" | 193 | ········""" |
| 192 | ········Change·the·executor. | 194 | ········Change·the·executor. |
| 193 | ········:param·futures.Executor·|·None·value:·the·new·executor·or·``None`` | 195 | ········:param·futures.Executor·|·None·value:·the·new·executor·or·``None`` |
| 194 | ········""" | 196 | ········""" |
| 195 | ········self._context.executor·=·value | 197 | ········self._context.executor·=·value |
| 196 | ····@property | 198 | ····@property |
| 197 | ····def·loop(self)·->·asyncio.AbstractEventLoop·|·None: | 199 | ····def·loop(self)·->·asyncio.AbstractEventLoop·|·None: |
| 198 | ········""" | 200 | ········"""The·event·loop.""" |
| 199 | ········return·self._context.loop | 201 | ········return·self._context.loop |
| 200 | ····async·def·acquire(··#·ty:·ignore[invalid-method-override] | 202 | ····async·def·acquire(··#·ty:·ignore[invalid-method-override] |
| 201 | ········self, | 203 | ········self, |
| 202 | ········timeout:·float·|·None·=·None, | 204 | ········timeout:·float·|·None·=·None, |
| 203 | ········poll_interval:·float·|·None·=·None, | 205 | ········poll_interval:·float·|·None·=·None, |
| 204 | ········*, | 206 | ········*, |
| Offset 252, 26 lines modified | Offset 254, 30 lines modified | ||
| 252 | ········if·poll_interval·is·None: | 254 | ········if·poll_interval·is·None: |
| 253 | ············poll_interval·=·self._context.poll_interval | 255 | ············poll_interval·=·self._context.poll_interval |
| 254 | ········#·Increment·the·number·right·at·the·beginning.·We·can·still·undo·it,·if·something·fails. | 256 | ········#·Increment·the·number·right·at·the·beginning.·We·can·still·undo·it,·if·something·fails. |
| 255 | ········self._context.lock_counter·+=·1 | 257 | ········self._context.lock_counter·+=·1 |
| 258 | ········canonical·=·_canonical(self.lock_file) | ||
| 259 | ········self._raise_if_would_deadlock(canonical,·timeout=timeout,·blocking=blocking) | ||
| 256 | ········start_time·=·time.perf_counter() | 260 | ········start_time·=·time.perf_counter() |
| 257 | ········try: | 261 | ········try: |
| 258 | ············await·self._async_poll_until_acquired( | 262 | ············await·self._async_poll_until_acquired( |
| 259 | ················blocking=blocking, | 263 | ················blocking=blocking, |
| 260 | ················cancel_check=cancel_check, | 264 | ················cancel_check=cancel_check, |
| 261 | ················timeout=timeout, | 265 | ················timeout=timeout, |
| 262 | ················poll_interval=poll_interval, | 266 | ················poll_interval=poll_interval, |
| 263 | ················start_time=start_time, | 267 | ················start_time=start_time, |
| 264 | ············) | 268 | ············) |
| 265 | ········except·BaseException:··#·Something·did·go·wrong,·so·decrement·the·counter. | 269 | ········except·BaseException:··#·Something·did·go·wrong,·so·decrement·the·counter. |
| 266 | ············self._ | 270 | ············self._undo_acquire(canonical) |
| 267 | ············raise | 271 | ············raise |
| 272 | ········self._commit_acquire(canonical) | ||
| 268 | ········return·AsyncAcquireReturnProxy(lock=self) | 273 | ········return·AsyncAcquireReturnProxy(lock=self) |
| 269 | ····async·def·_async_poll_until_acquired( | 274 | ····async·def·_async_poll_until_acquired( |
| 270 | ········self, | 275 | ········self, |
| 271 | ········*, | 276 | ········*, |
| 272 | ········blocking:·bool, | 277 | ········blocking:·bool, |
| 273 | ········cancel_check:·Callable[[],·bool]·|·None, | 278 | ········cancel_check:·Callable[[],·bool]·|·None, |
| Offset 315, 14 lines modified | Offset 321, 15 lines modified | ||
| 315 | ············if·self._context.lock_counter·==·0·or·force: | 321 | ············if·self._context.lock_counter·==·0·or·force: |
| 316 | ················lock_id,·lock_filename·=·id(self),·self.lock_file | 322 | ················lock_id,·lock_filename·=·id(self),·self.lock_file |
| 317 | ················_LOGGER.debug("Attempting·to·release·lock·%s·on·%s",·lock_id,·lock_filename) | 323 | ················_LOGGER.debug("Attempting·to·release·lock·%s·on·%s",·lock_id,·lock_filename) |
| 318 | ················await·self._run_internal_method(self._release) | 324 | ················await·self._run_internal_method(self._release) |
| 319 | ················self._context.lock_counter·=·0 | 325 | ················self._context.lock_counter·=·0 |
| 326 | ················self._drop_registry_entry() | ||
| 320 | ················_LOGGER.debug("Lock·%s·released·on·%s",·lock_id,·lock_filename) | 327 | ················_LOGGER.debug("Lock·%s·released·on·%s",·lock_id,·lock_filename) |
| 321 | ····async·def·_run_internal_method(self,·method:·Callable[[],·Any])·->·None: | 328 | ····async·def·_run_internal_method(self,·method:·Callable[[],·Any])·->·None: |
| 322 | ········if·iscoroutinefunction(method): | 329 | ········if·iscoroutinefunction(method): |
| 323 | ············await·method() | 330 | ············await·method() |
| 324 | ········elif·self.run_in_executor: | 331 | ········elif·self.run_in_executor: |
| 325 | ············await·asyncio.get_running_loop().run_in_executor(self.executor,·method) | 332 | ············await·asyncio.get_running_loop().run_in_executor(self.executor,·method) |
| Offset 14, 11 lines modified | Offset 14, 11 lines modified | ||
| 14 | version:·str | 14 | version:·str |
| 15 | __version__:·str | 15 | __version__:·str |
| 16 | __version_tuple__:·tuple[int·|·str,·...] | 16 | __version_tuple__:·tuple[int·|·str,·...] |
| 17 | version_tuple:·tuple[int·|·str,·...] | 17 | version_tuple:·tuple[int·|·str,·...] |
| 18 | commit_id:·str·|·None | 18 | commit_id:·str·|·None |
| 19 | __commit_id__:·str·|·None | 19 | __commit_id__:·str·|·None |
| 20 | __version__·=·version·=·'3.29. | 20 | __version__·=·version·=·'3.29.7' |
| 21 | __version_tuple__·=·version_tuple·=·(3,·29,· | 21 | __version_tuple__·=·version_tuple·=·(3,·29,·7) |
| 22 | __commit_id__·=·commit_id·=·None | 22 | __commit_id__·=·commit_id·=·None |
| Offset 79, 35 lines modified | Offset 79, 35 lines modified | ||
| 79 | ············poll_interval=poll_interval, | 79 | ············poll_interval=poll_interval, |
| 80 | ········) | 80 | ········) |
| 81 | ········self._loop·=·loop | 81 | ········self._loop·=·loop |
| 82 | ········self._executor·=·executor | 82 | ········self._executor·=·executor |
| 83 | ····@property | 83 | ····@property |
| 84 | ····def·lock_file(self)·->·str: | 84 | ····def·lock_file(self)·->·str: |
| 85 | ········""" | 85 | ········"""The·path·to·the·lock·file·passed·to·the·constructor.""" |
| 86 | ········return·self._lock.lock_file | 86 | ········return·self._lock.lock_file |
| 87 | ····@property | 87 | ····@property |
| 88 | ····def·timeout(self)·->·float: | 88 | ····def·timeout(self)·->·float: |
| 89 | ········""" | 89 | ········"""The·default·timeout·applied·when·``acquire_read``·/·``acquire_write``·is·called·without·one.""" |
| 90 | ········return·self._lock.timeout | 90 | ········return·self._lock.timeout |
| 91 | ····@property | 91 | ····@property |
| 92 | ····def·blocking(self)·->·bool: | 92 | ····def·blocking(self)·->·bool: |
| 93 | ········""" | 93 | ········"""Whether·``acquire_*``·defaults·to·blocking;·``False``·makes·contention·raise·immediately.""" |
| 94 | ········return·self._lock.blocking | 94 | ········return·self._lock.blocking |
| 95 | ····@property | 95 | ····@property |
| 96 | ····def·loop(self)·->·asyncio.AbstractEventLoop·|·None: | 96 | ····def·loop(self)·->·asyncio.AbstractEventLoop·|·None: |
| 97 | ········""" | 97 | ········"""The·event·loop·used·for·``run_in_executor``,·or·``None``·for·the·running·loop.""" |
| 98 | ········return·self._loop | 98 | ········return·self._loop |
| 99 | ····@property | 99 | ····@property |
| 100 | ····def·executor(self)·->·futures.Executor·|·None: | 100 | ····def·executor(self)·->·futures.Executor·|·None: |
| 101 | ········""" | 101 | ········"""The·executor·used·for·``run_in_executor``,·or·``None``·for·the·default·executor.""" |
| 102 | ········return·self._executor | 102 | ········return·self._executor |
| 103 | ····async·def·acquire_read( | 103 | ····async·def·acquire_read( |
| 104 | ········self,·timeout:·float·|·None·=·None,·*,·blocking:·bool·|·None·=·None | 104 | ········self,·timeout:·float·|·None·=·None,·*,·blocking:·bool·|·None·=·None |
| 105 | ····)·->·AsyncAcquireSoftReadWriteReturnProxy: | 105 | ····)·->·AsyncAcquireSoftReadWriteReturnProxy: |
| 106 | ········""" | 106 | ········""" |
| 107 | ········Acquire·a·shared·read·lock. | 107 | ········Acquire·a·shared·read·lock. |
| Offset 29, 14 lines modified | Offset 29, 19 lines modified | ||
| 29 | _Mode·=·Literal["read",·"write"] | 29 | _Mode·=·Literal["read",·"write"] |
| 30 | _BREAK_SUFFIX·=·".break" | 30 | _BREAK_SUFFIX·=·".break" |
| 31 | _MAX_MARKER_SIZE·=·1024 | 31 | _MAX_MARKER_SIZE·=·1024 |
| 32 | _O_NOFOLLOW·=·getattr(os,·"O_NOFOLLOW",·0) | 32 | _O_NOFOLLOW·=·getattr(os,·"O_NOFOLLOW",·0) |
| 33 | _O_NONBLOCK·=·getattr(os,·"O_NONBLOCK",·0) | 33 | _O_NONBLOCK·=·getattr(os,·"O_NONBLOCK",·0) |
| 34 | #·Retargeting·os.utime·to·an·open·fd·lets·the·heartbeat·refresh·the·exact·inode·it·just·verified·instead·of | ||
| 35 | #·re-resolving·the·path;·Windows·read-only·handles·cannot·set·times·that·way,·so·keep·it·Unix-only. | ||
| 36 | _SUPPORTS_UTIME_FD·=·sys.platform·!=·"win32"·and·os.utime·in·os.supports_fd | ||
| 37 | #·os.utime·follows·symlinks·unless·told·not·to;·not·every·platform·can·refuse·the·follow,·so·probe·support. | ||
| 38 | _SUPPORTS_UTIME_NOFOLLOW·=·os.utime·in·os.supports_follow_symlinks | ||
| 34 | #·dirfd-relative·I/O·is·a·Unix-only·optimization;·Windows·cannot·``os.open()``·a·directory·at·all,·and | 39 | #·dirfd-relative·I/O·is·a·Unix-only·optimization;·Windows·cannot·``os.open()``·a·directory·at·all,·and |
| 35 | #·its·``os``·module·skips·dir_fd·support·entirely.·When·disabled,·callers·fall·back·to·full-path·ops. | 40 | #·its·``os``·module·skips·dir_fd·support·entirely.·When·disabled,·callers·fall·back·to·full-path·ops. |
| 36 | _SUPPORTS_DIR_FD·=·sys.platform·!=·"win32"·and·os.open·in·os.supports_dir_fd | 41 | _SUPPORTS_DIR_FD·=·sys.platform·!=·"win32"·and·os.open·in·os.supports_dir_fd |
| 37 | _all_instances:·WeakValueDictionary[Path,·SoftReadWriteLock]·=·WeakValueDictionary() | 42 | _all_instances:·WeakValueDictionary[Path,·SoftReadWriteLock]·=·WeakValueDictionary() |
| 38 | _all_instances_lock·=·threading.Lock() | 43 | _all_instances_lock·=·threading.Lock() |
| 39 | _atexit_registered·=·False | 44 | _atexit_registered·=·False |
| Offset 370, 15 lines modified | Offset 375, 65 lines modified | ||
| 370 | ········#·token·check·in·the·heartbeat·callback·would·catch·any·re-acquisition·race,·but·joining·first | 375 | ········#·token·check·in·the·heartbeat·callback·would·catch·any·re-acquisition·race,·but·joining·first |
| 371 | ········#·removes·even·that·theoretical·race. | 376 | ········#·removes·even·that·theoretical·race. |
| 372 | ········hold.heartbeat_stop.set() | 377 | ········hold.heartbeat_stop.set() |
| 373 | ········hold.heartbeat_thread.join(timeout=self.heartbeat_interval·+·1.0) | 378 | ········hold.heartbeat_thread.join(timeout=self.heartbeat_interval·+·1.0) |
| 374 | ········if·hold.is_reader: | 379 | ········if·hold.is_reader: |
| 375 | ············_unlink(hold.marker_name,·dir_fd=self._readers_dir_fd) | 380 | ············_unlink(hold.marker_name,·dir_fd=self._readers_dir_fd) |
| 376 | ········else: | 381 | ········else: |
| 377 | ············_unlink | 382 | ············self._unlink_writer_marker_if_ours(hold.token) |
| 383 | ····def·_unlink_writer_marker_if_ours(self,·token:·str)·->·None: | ||
| 384 | ········#·Remove·the·writer·marker·only·while·it·still·carries·our·token.·If·this·holder·was·paused·long | ||
| 385 | ········#·enough·(a·stop-the-world·GC·pause,·SIGSTOP,·a·suspended·VM)·for·a·peer·to·evict·the·marker·as | ||
| 386 | ········#·stale·and·claim·the·writer·slot·itself,·the·file·now·at·<path>.write·is·the·peer's·live·marker; | ||
| 387 | ········#·unlinking·it·by·path·would·let·a·second·writer·through·and·break·mutual·exclusion.·The·state·lock | ||
| 388 | ········#·serializes·this·against·a·concurrent·break/claim,·and·the·heartbeat·is·already·stopped,·so·the | ||
| 389 | ········#·token·we·read·is·authoritative.·Mirrors·the·token·re-check·the·stale-break·path·already·does. | ||
| 390 | ········with·self._locks.state: | ||
| 391 | ············read·=·_read_marker(self._paths.write) | ||
| 392 | ············if·read·is·None: | ||
| 393 | ················return | ||
| 394 | ············info,·_·=·read | ||
| 395 | ············if·info·is·None·or·not·hmac.compare_digest(info.token,·token): | ||
| 396 | ················return | ||
| 397 | ············_unlink(self._paths.write) | ||
| 398 | ····def·_claim_writer_marker(self,·token:·str)·->·bool: | ||
| 399 | ········#·Claim·the·writer·slot·for·``token``.·Must·be·called·holding·``self._locks.state``.·Evicts·a | ||
| 400 | ········#·stale·marker·first,·then·refuses·to·claim·while·a·live·``.write``·exists·so·a·peer·holding·the | ||
| 401 | ········#·slot·is·waited·out·instead·of·overwritten. | ||
| 402 | ········_break_stale_marker(self._paths.write,·stale_threshold=self.stale_threshold,·now=time.time()) | ||
| 403 | ········if·_file_exists(self._paths.write): | ||
| 404 | ············return·False | ||
| 405 | ········try: | ||
| 406 | ············_atomic_create_marker(self._paths.write,·token) | ||
| 407 | ········except·FileExistsError: | ||
| 408 | ············return·False | ||
| 409 | ········return·True | ||
| 410 | ····def·_touch_writer_marker_if_ours(self,·token:·str)·->·bool: | ||
| 411 | ········#·Refresh·the·writer·marker·through·a·single·O_NOFOLLOW·fd,·but·only·while·it·still·carries·our | ||
| 412 | ········#·token.·Returns·False·when·the·marker·is·gone·or·now·belongs·to·a·peer·that·reclaimed·the·slot, | ||
| 413 | ········#·so·the·caller·can·re-claim·rather·than·keep·a·stranger's·marker·alive.·Mirrors·_refresh_marker. | ||
| 414 | ········fd·=·_open_marker(self._paths.write) | ||
| 415 | ········if·fd·is·None: | ||
| 416 | ············return·False | ||
| 417 | ········try: | ||
| 418 | ············try: | ||
| 419 | ················data·=·os.read(fd,·_MAX_MARKER_SIZE·+·1) | ||
| 420 | ············except·OSError:··#·pragma:·no·cover·-·e.g.·EAGAIN·from·a·hostile·FIFO·that·has·a·writer·attached | ||
| 421 | ················return·False | ||
| 422 | ············info·=·_parse_marker_bytes(data) | ||
| 423 | ············if·info·is·None·or·not·hmac.compare_digest(info.token,·token): | ||
| 424 | ················return·False | ||
| 425 | ············with·suppress(OSError): | ||
| 426 | ················_touch(self._paths.write,·fd=fd) | ||
| 427 | ············return·True | ||
| 428 | ········finally: | ||
| 429 | ············os.close(fd) | ||
| 378 | ····@classmethod | 430 | ····@classmethod |
| 379 | ····def·get_lock( | 431 | ····def·get_lock( |
| 380 | ········cls, | 432 | ········cls, |
| 381 | ········lock_file:·str·|·os.PathLike[str], | 433 | ········lock_file:·str·|·os.PathLike[str], |
| 382 | ········timeout:·float·=·-1, | 434 | ········timeout:·float·=·-1, |
| 383 | ········*, | 435 | ········*, |
| Offset 499, 38 lines modified | Offset 554, 39 lines modified | ||
| 499 | ····)·->·tuple[str,·bool]: | 554 | ····)·->·tuple[str,·bool]: |
| 500 | ········#·Phase·2·scans·readers/·via·dirfd·(where·supported),·so·we·need·it·open·even·though·writers·never | 555 | ········#·Phase·2·scans·readers/·via·dirfd·(where·supported),·so·we·need·it·open·even·though·writers·never |
| 501 | ········#·create·files·inside. | 556 | ········#·create·files·inside. |
| 502 | ········self._open_readers_dir() | 557 | ········self._open_readers_dir() |
| 503 | ········def·try_claim_writer()·->·bool: | 558 | ········def·try_claim_writer()·->·bool: |
| 504 | ············with·self._locks.state: | 559 | ············with·self._locks.state: |
| 560 | ················return·self._claim_writer_marker(token) | ||
| 505 | ················_break_stale_marker(self._paths.write,·stale_threshold=self.stale_threshold,·now=time.time()) | ||
| 506 | ················if·_file_exists(self._paths.write): | ||
| 507 | ····················return·False | ||
| 508 | ················try: | ||
| 509 | ····················_atomic_create_marker(self._paths.write,·token) | ||
| 510 | ················except·FileExistsError: | ||
| 511 | ····················return·False | ||
| 512 | ············return·True | ||
| 513 | ········def·readers_drained_touching()·->·bool: | 561 | ········def·readers_drained_touching()·->·bool: |
| 514 | ············with·self._locks.state: | 562 | ············with·self._locks.state: |
| 515 | ················#·Refresh·our·writer·marker· | 563 | ················#·Refresh·our·writer·marker·every·scan·iteration·so·phase·2·does·not·exceed |
| 516 | ················#·``stale_threshold``·under·contention·and·a·peer·would·treat·us·as·stale·and·evict·us. | ||
| 517 | ················with·suppress(OSError): | ||
| 518 | ···················· | 564 | ················#·``stale_threshold``·under·contention·and·get·evicted.·The·refresh·only·happens·while |
| 565 | ················#·the·marker·is·still·ours:·if·we·were·paused·past·``stale_threshold``·a·peer·can·evict | ||
| 566 | ················#·the·stale·marker·and·reclaim·``.write``·with·its·own·token,·and·touching·that·path | ||
| 567 | ················#·blindly·would·keep·the·peer's·live·marker·alive·and·let·this·acquire·finish·as·though | ||
| 568 | ················#·we·still·held·the·slot,·admitting·a·second·writer.·When·the·claim·is·no·longer·ours·we | ||
| 569 | ················#·re-claim·the·slot·here·(waiting·behind·the·peer·if·it·currently·holds·it)·rather·than | ||
| 570 | ················#·trusting·the·foreign·marker,·mirroring·the·token·re-check·the·stale-break·and·release | ||
| 571 | ················#·paths·already·rely·on. | ||
| 572 | ················if·not·self._touch_writer_marker_if_ours(token)·and·not·self._claim_writer_marker(token): | ||
| 573 | ····················return·False | ||
| 519 | ················self._break_stale_readers(time.time()) | 574 | ················self._break_stale_readers(time.time()) |
| 520 | ················return·not·self._any_readers() | 575 | ················return·not·self._any_readers() |
| 521 | ········self._wait_for(try_claim_writer,·deadline=deadline,·blocking=blocking) | 576 | ········self._wait_for(try_claim_writer,·deadline=deadline,·blocking=blocking) |
| 522 | ········try: | 577 | ········try: |
| 523 | ············self._wait_for(readers_drained_touching,·deadline=deadline,·blocking=blocking) | 578 | ············self._wait_for(readers_drained_touching,·deadline=deadline,·blocking=blocking) |
| 524 | ········except·Timeout: | 579 | ········except·Timeout: |
| 525 | ············#·Give·up·our·writer·claim·so·readers·can·make·progress·again | 580 | ············#·Give·up·our·writer·claim·so·readers·can·make·progress·again,·but·only·while·the·marker·is |
| 526 | ············ | 581 | ············#·still·ours:·a·peer·may·have·evicted·it·as·stale·and·claimed·the·slot·while·phase·2·waited. |
| Max diff block lines reached; 7310/14583 bytes (50.13%) of diff not shown. | |||
| Offset 1, 10 lines modified | Offset 1, 10 lines modified | ||
| 1 | Metadata-Version:·2.4 | 1 | Metadata-Version:·2.4 |
| 2 | Name:·filelock | 2 | Name:·filelock |
| 3 | Version:·3.29. | 3 | Version:·3.29.7 |
| 4 | Summary:·A·platform·independent·file·lock. | 4 | Summary:·A·platform·independent·file·lock. |
| 5 | Project-URL:·Documentation,·https://py-filelock.readthedocs.io | 5 | Project-URL:·Documentation,·https://py-filelock.readthedocs.io |
| 6 | Project-URL:·Homepage,·https://github.com/tox-dev/py-filelock | 6 | Project-URL:·Homepage,·https://github.com/tox-dev/py-filelock |
| 7 | Project-URL:·Source,·https://github.com/tox-dev/py-filelock | 7 | Project-URL:·Source,·https://github.com/tox-dev/py-filelock |
| 8 | Project-URL:·Tracker,·https://github.com/tox-dev/py-filelock/issues | 8 | Project-URL:·Tracker,·https://github.com/tox-dev/py-filelock/issues |
| 9 | Maintainer-email:·Bernát·Gábor·<gaborjbernat@gmail.com> | 9 | Maintainer-email:·Bernát·Gábor·<gaborjbernat@gmail.com> |
| 10 | License-Expression:·MIT | 10 | License-Expression:·MIT |
| Offset 1, 10 lines modified | Offset 1, 10 lines modified | ||
| 1 | Metadata-Version:·2.4 | 1 | Metadata-Version:·2.4 |
| 2 | Name:·typing_extensions | 2 | Name:·typing_extensions |
| 3 | Version:·4.1 | 3 | Version:·4.16.0 |
| 4 | Summary:·Backported·and·Experimental·Type·Hints·for·Python·3.9+ | 4 | Summary:·Backported·and·Experimental·Type·Hints·for·Python·3.9+ |
| 5 | Keywords:·annotations,backport,checker,checking,function,hinting,hints,type,typechecking,typehinting,typehints,typing | 5 | Keywords:·annotations,backport,checker,checking,function,hinting,hints,type,typechecking,typehinting,typehints,typing |
| 6 | Author-email:·"Guido·van·Rossum,·Jukka·Lehtosalo,·Łukasz·Langa,·Michael·Lee"·<levkivskyi@gmail.com> | 6 | Author-email:·"Guido·van·Rossum,·Jukka·Lehtosalo,·Łukasz·Langa,·Michael·Lee"·<levkivskyi@gmail.com> |
| 7 | Requires-Python:·>=3.9 | 7 | Requires-Python:·>=3.9 |
| 8 | Description-Content-Type:·text/markdown | 8 | Description-Content-Type:·text/markdown |
| 9 | License-Expression:·PSF-2.0 | 9 | License-Expression:·PSF-2.0 |
| 10 | Classifier:·Development·Status·::·5·-·Production/Stable | 10 | Classifier:·Development·Status·::·5·-·Production/Stable |
| Offset 15, 14 lines modified | Offset 15, 15 lines modified | ||
| 15 | Classifier:·Programming·Language·::·Python·::·3·::·Only | 15 | Classifier:·Programming·Language·::·Python·::·3·::·Only |
| 16 | Classifier:·Programming·Language·::·Python·::·3.9 | 16 | Classifier:·Programming·Language·::·Python·::·3.9 |
| 17 | Classifier:·Programming·Language·::·Python·::·3.10 | 17 | Classifier:·Programming·Language·::·Python·::·3.10 |
| 18 | Classifier:·Programming·Language·::·Python·::·3.11 | 18 | Classifier:·Programming·Language·::·Python·::·3.11 |
| 19 | Classifier:·Programming·Language·::·Python·::·3.12 | 19 | Classifier:·Programming·Language·::·Python·::·3.12 |
| 20 | Classifier:·Programming·Language·::·Python·::·3.13 | 20 | Classifier:·Programming·Language·::·Python·::·3.13 |
| 21 | Classifier:·Programming·Language·::·Python·::·3.14 | 21 | Classifier:·Programming·Language·::·Python·::·3.14 |
| 22 | Classifier:·Programming·Language·::·Python·::·3.15 | ||
| 22 | Classifier:·Topic·::·Software·Development | 23 | Classifier:·Topic·::·Software·Development |
| 23 | License-File:·LICENSE | 24 | License-File:·LICENSE |
| 24 | Project-URL:·Bug·Tracker,·https://github.com/python/typing_extensions/issues | 25 | Project-URL:·Bug·Tracker,·https://github.com/python/typing_extensions/issues |
| 25 | Project-URL:·Changes,·https://github.com/python/typing_extensions/blob/main/CHANGELOG.md | 26 | Project-URL:·Changes,·https://github.com/python/typing_extensions/blob/main/CHANGELOG.md |
| 26 | Project-URL:·Documentation,·https://typing-extensions.readthedocs.io/ | 27 | Project-URL:·Documentation,·https://typing-extensions.readthedocs.io/ |
| 27 | Project-URL:·Home,·https://github.com/python/typing_extensions | 28 | Project-URL:·Home,·https://github.com/python/typing_extensions |
| 28 | Project-URL:·Q·&·A,·https://github.com/python/typing/discussions | 29 | Project-URL:·Q·&·A,·https://github.com/python/typing/discussions |
| Offset 24, 15 lines modified | Offset 24, 15 lines modified | ||
| 24 | ········"bootstrap-native/x86_64/java/chaquopy.so":·"b0881d1c98f61e911520da1a2b0b32bb53ab67fc", | 24 | ········"bootstrap-native/x86_64/java/chaquopy.so":·"b0881d1c98f61e911520da1a2b0b32bb53ab67fc", |
| 25 | ········"bootstrap-native/x86_64/math.so":·"69a601b4a7fa608cf58ce045f448bea54535cc42", | 25 | ········"bootstrap-native/x86_64/math.so":·"69a601b4a7fa608cf58ce045f448bea54535cc42", |
| 26 | ········"bootstrap-native/x86_64/mmap.so":·"2f016d6e034494e9f5640551d95067b3c64b7a3f", | 26 | ········"bootstrap-native/x86_64/mmap.so":·"2f016d6e034494e9f5640551d95067b3c64b7a3f", |
| 27 | ········"bootstrap-native/x86_64/zlib.so":·"c048fc69bbe744b6373c1b4452033a008906c9e8", | 27 | ········"bootstrap-native/x86_64/zlib.so":·"c048fc69bbe744b6373c1b4452033a008906c9e8", |
| 28 | ········"bootstrap.imy":·"f14958d91fd38af6ab975ae9d9c8b3a360750e04", | 28 | ········"bootstrap.imy":·"f14958d91fd38af6ab975ae9d9c8b3a360750e04", |
| 29 | ········"cacert.pem":·"2c68212e96605210eddf740291862bdf59398aef", | 29 | ········"cacert.pem":·"2c68212e96605210eddf740291862bdf59398aef", |
| 30 | ········"requirements-arm64-v8a.imy":·"afeb10e3f5e16cebbf786daf85943e0890aafa51", | 30 | ········"requirements-arm64-v8a.imy":·"afeb10e3f5e16cebbf786daf85943e0890aafa51", |
| 31 | ········"requirements-common.imy":·" | 31 | ········"requirements-common.imy":·"4c74433aa491a080c63cbde07849d20fb5c81ef2", |
| 32 | ········"requirements-x86_64.imy":·"8bfb07af2fae9103b6a976ab797f21aeced8fd08", | 32 | ········"requirements-x86_64.imy":·"8bfb07af2fae9103b6a976ab797f21aeced8fd08", |
| 33 | ········"stdlib-arm64-v8a.imy":·"d60e450b23fe4cba7286096b6c9c3b26a52f0490", | 33 | ········"stdlib-arm64-v8a.imy":·"d60e450b23fe4cba7286096b6c9c3b26a52f0490", |
| 34 | ········"stdlib-common.imy":·"033a7b880b2364a5a416c169c5560745d64ede55", | 34 | ········"stdlib-common.imy":·"033a7b880b2364a5a416c169c5560745d64ede55", |
| 35 | ········"stdlib-x86_64.imy":·"ec7f1fc8b2bcd08959ddb9ca2ece8083821b9856" | 35 | ········"stdlib-x86_64.imy":·"ec7f1fc8b2bcd08959ddb9ca2ece8083821b9856" |
| 36 | ····}, | 36 | ····}, |
| 37 | ····"extract_packages":·[ | 37 | ····"extract_packages":·[ |
| 38 | ········"ebook_converter" | 38 | ········"ebook_converter" |