From aa3872fbb180988280611f4d42324ae45addbaac Mon Sep 17 00:00:00 2001 From: javad Date: Thu, 8 Oct 2026 20:23:15 +0330 Subject: [PATCH] fix some --- src/.ripwire_quality_acks | 4 + src/.ripwire_quality_baseline | 1197 +++++++++++++++++ src/app/(index)/components/nav-top.tsx | 14 +- src/app/(index)/components/side-right.tsx | 12 +- src/app/(index)/customers/[id]/page.tsx | 2 +- .../customers/components/customer-info.tsx | 16 +- .../components/customer-online-panel.tsx | 20 +- src/app/(index)/customers/new/page.tsx | 11 +- src/app/(index)/products/categories/page.tsx | 58 + .../products/components/product-form.tsx | 45 + src/app/(index)/products/import/page.tsx | 60 + src/app/(index)/products/layout.tsx | 18 + src/app/(index)/products/page.tsx | 71 + src/app/(login_register)/login/page.tsx | 160 +-- src/axios/axiosInstance.ts | 120 +- src/lib/auth.ts | 76 ++ src/lib/catalog.ts | 78 ++ src/middleware.ts | 31 +- tests/auth-session.test.cjs | 185 +++ tests/catalog.test.cjs | 131 ++ 20 files changed, 2079 insertions(+), 230 deletions(-) create mode 100644 src/.ripwire_quality_acks create mode 100644 src/.ripwire_quality_baseline create mode 100644 src/app/(index)/products/categories/page.tsx create mode 100644 src/app/(index)/products/components/product-form.tsx create mode 100644 src/app/(index)/products/import/page.tsx create mode 100644 src/app/(index)/products/layout.tsx create mode 100644 src/app/(index)/products/page.tsx create mode 100644 src/lib/auth.ts create mode 100644 src/lib/catalog.ts create mode 100644 tests/auth-session.test.cjs create mode 100644 tests/catalog.test.cjs diff --git a/src/.ripwire_quality_acks b/src/.ripwire_quality_acks new file mode 100644 index 0000000..d5d879a --- /dev/null +++ b/src/.ripwire_quality_acks @@ -0,0 +1,4 @@ +# ripwire quality acks v1 — written by --quality-ack; a finding stays suppressed until it worsens past its acked magnitude +# format: ack <16-hex-key> [cid=<16-hex-content-id>] [by=] — one per line, kept SORTED by (kind,key) on every write (merge-friendly) +ack dead-code:new-symbol a3b73a9575dc4b25 0 cid=9f8bd7c52d3c614b Next file-system default route and JSX submit callback are runtime entrypoints; production build, served login HTML and component behavior tests verify reachability. +ack dead-code:preexisting ebc196c3604f15d6 0 cid=969ff4264e9ceec8 Next file-system default route and JSX submit callback are runtime entrypoints; production build, served login HTML and component behavior tests verify reachability. diff --git a/src/.ripwire_quality_baseline b/src/.ripwire_quality_baseline new file mode 100644 index 0000000..f1fe58c --- /dev/null +++ b/src/.ripwire_quality_baseline @@ -0,0 +1,1197 @@ +# ripwire quality baseline v6 — regenerate with --quality-baseline; do not hand-edit +producer 6ba6bc71fb56e24b994359ee76e73cdc590f0c37779cbed0edef299c36756a40 +head be18543b04c078e6976db61edce31edef413e695 +ccx 103089ed2ae04ca 0 +ccx 2d00284b3dd6bdf 0 +ccx 38182968886385e 0 +ccx 49a1656d6a63c65 6 +ccx 612d2cd5fdf0346 1 +ccx 64299a7e9893bd2 6 +ccx 642bf64d72f8e1c 4 +ccx 65212d5a1396cc9 5 +ccx 7167d30674dbf63 3 +ccx 72af055909181f5 2 +ccx 85f5a8a60cf7c75 0 +ccx 90e652d591cf68e 6 +ccx ba3ecc46fad634c 1 +ccx d20f1dce1e1bef3 0 +ccx 10b2e1e8e86b9732 9 +ccx 11c3a3314c1e3144 0 +ccx 13f93c227689364f 0 +ccx 152c7faf3423da88 0 +ccx 19be6b42573839e7 0 +ccx 1a0172fb7270396f 0 +ccx 1ad63f23526776d5 2 +ccx 1b20d4b545bf93dc 0 +ccx 1b4c7a2aee901b3d 0 +ccx 1cc1522b2986037c 0 +ccx 1cd18be3b5e2839f 0 +ccx 1efd0ca5e8215855 0 +ccx 1f53e5b63005f896 3 +ccx 201bd9b26a8db836 0 +ccx 2181f6ceb4c7477a 0 +ccx 24b76ca4826c5638 0 +ccx 25acbaccce1b8830 17 +ccx 2696e3db7e06604c 0 +ccx 2745b426c80ee182 0 +ccx 284f03ff5842c641 0 +ccx 28db4cebaa9072ed 9 +ccx 28f4d781217b843e 0 +ccx 2ff9006086f1f843 0 +ccx 31c8aa09bedd3a7b 1 +ccx 320dcfea6ad0b28a 0 +ccx 32a60b3dc9642a96 0 +ccx 32c05141a58d2081 21 +ccx 361dde13d88ebf3e 1 +ccx 36fc8506263f1555 0 +ccx 384fb88853a746d1 0 +ccx 38808aabded99480 0 +ccx 3a0812e052544e6f 0 +ccx 3c3a9f754027034f 0 +ccx 3e5b5d27576752f3 0 +ccx 3f459e55674924cf 0 +ccx 3f637a50e6b6038f 0 +ccx 43c9d8f0d9e2a6c5 0 +ccx 451c71fe46a88a45 6 +ccx 45258d7526a3a391 3 +ccx 467e6f22aa914d02 0 +ccx 481b17d410524bc9 0 +ccx 4825d1eb83944bcc 0 +ccx 48392508fbeb2328 0 +ccx 485f599241b29cab 0 +ccx 4922d3e1219fb991 0 +ccx 4a868c06fe9b4bbb 0 +ccx 4eb5906e8d4c538f 0 +ccx 507ca3857ed19786 0 +ccx 508c5e817af8a999 0 +ccx 511a3773cc69cdce 0 +ccx 5125484542959f57 0 +ccx 51a05343d3a2d81b 1 +ccx 51c2230f60e10fa9 0 +ccx 51d240aa1f334abb 0 +ccx 52c098fb84ae64ec 0 +ccx 52f1e07f00c8ed64 0 +ccx 54a47a04fbec3be0 0 +ccx 569544d043b37e9f 0 +ccx 56bc0c10e75a873e 0 +ccx 5859a8ff4b3a10f9 5 +ccx 5a053f2482d132ec 0 +ccx 5a767ebedc6595a2 0 +ccx 5af4d7054c5559b6 0 +ccx 5d81399c369a06d9 3 +ccx 5dd9ee4e95425a38 2 +ccx 5ecab546ba33bd53 0 +ccx 5f36453a5ab0b84a 5 +ccx 6274aefc8d348aeb 0 +ccx 64f5fb2aa5e4c285 0 +ccx 65ded60bb8202752 12 +ccx 65f4ceeecbc882e5 0 +ccx 663539f2e62075a8 0 +ccx 676f9cb569c0342c 0 +ccx 6961c0578f842233 3 +ccx 6bb227768ac200a7 0 +ccx 6c92d9507e31e28e 0 +ccx 6e82e26c287fe27d 3 +ccx 6f6561043b81779d 1 +ccx 6fe3cea5e36d3bf7 3 +ccx 70b5147ec4eb035e 0 +ccx 714bbb5988c06069 0 +ccx 71f069eb50731dd6 0 +ccx 733de74921aafeaf 0 +ccx 739435e6d6db5783 0 +ccx 74a43eee461c4b92 0 +ccx 752eaa6b4ed9238e 0 +ccx 7561ea47cdacbf1c 0 +ccx 75828a21cfbe8321 1 +ccx 79f4173e0f2e51a7 11 +ccx 7a2a000a2d92cd4a 3 +ccx 7ae0bc4b28087f4f 2 +ccx 7d50f471f3056c3c 0 +ccx 7df1ee504e358a1e 0 +ccx 8135ca4730ba8ede 0 +ccx 8366b3f1e2975aa0 0 +ccx 8370dc3dadb2bcfb 0 +ccx 8446b146563844c2 0 +ccx 8616b8507e1e7b58 0 +ccx 88649649eb7e5f70 0 +ccx 8aa16a6b7669e5f1 0 +ccx 8c6bf8507b268d0e 0 +ccx 8d4d13e71cfad2ba 5 +ccx 8ed84a8af28500af 0 +ccx 926e8c7a23e0a5fa 3 +ccx 92aa9331ec50bf7d 0 +ccx 93b74c055bf5c810 0 +ccx 978259931a9261e9 0 +ccx 97924f00f50c6315 9 +ccx 97a64a1a5dc1b8ef 3 +ccx 9840a9660c6fdd94 0 +ccx 9a61ea8ada2954f7 0 +ccx 9b47e3f57556ad8d 0 +ccx 9bd5317887b26920 0 +ccx 9be1d2f6ca24c2d7 0 +ccx 9cabec78554559cf 5 +ccx 9d3a7e0cf76ccf25 17 +ccx 9eb87557a690122f 0 +ccx 9fbe41f7c2619c14 0 +ccx a00648f7c29f5d9c 0 +ccx a0df8b624fda7b0c 2 +ccx a3602e4da850e72f 0 +ccx a51e14eb9088b593 0 +ccx a64f5985092913df 0 +ccx a7adc669aa5b8778 0 +ccx a84e116847f93925 0 +ccx a8879c85ff2ed336 1 +ccx a9047b67529e29c7 3 +ccx aa886b4cd027024e 0 +ccx ada4a8f4e28ca23f 0 +ccx ae6b4e2955499fb0 0 +ccx b12da3ed3032d637 3 +ccx b169c7f55ced54a2 1 +ccx b1b9c23207367fc1 4 +ccx b2263a5dc1c9e201 0 +ccx b451a1c218a6681d 0 +ccx b6f11c20341391e5 0 +ccx b7277739378c745e 0 +ccx b7b38393aac442bf 0 +ccx b86df438c90110b2 35 +ccx b8c696edd6580151 0 +ccx b9db629e7ca06105 0 +ccx badcf9479458b20a 0 +ccx c3bbaf87da9dc0a2 0 +ccx c9353453072f9b15 0 +ccx ca2d94e59204fbf0 0 +ccx cad731c520ec519b 0 +ccx cc449db9c01710ac 2 +ccx cd533a78c8a07908 7 +ccx cd8d7681234d3263 8 +ccx ce17356483e96835 0 +ccx cf1b0ba3f6ee878b 3 +ccx cf528746cdac418b 0 +ccx d0ff92ab28f77ed1 3 +ccx d10fbc0349b609bb 1 +ccx d3694276ef344923 0 +ccx d3b2ed48be7d702c 0 +ccx d3d444d665f32ea0 1 +ccx d4be378398900d59 12 +ccx d6afa150657035d1 0 +ccx d7673550cc3ca535 3 +ccx d9d97ae11568136d 4 +ccx db087cd756e2165c 0 +ccx dc0d0f555e56f2a9 2 +ccx ded6a9eb81e0c4b3 0 +ccx e02c819d289fed29 0 +ccx e04f204b5c54120d 0 +ccx e110540af19ccc98 1 +ccx e364f64bc221872b 0 +ccx e4714062dc2222df 0 +ccx e90bea4eb4f106ab 0 +ccx eb3b6f0f11d0f4b0 0 +ccx ebc196c3604f15d6 8 +ccx ebca7b45f2f4b589 5 +ccx ef4facf8da74d002 0 +ccx efb2c550c8d34c10 6 +ccx f0782dc03ca66464 1 +ccx f1e6be599f0e9ee3 0 +ccx f34a9bdde080f704 0 +ccx f43ac65d42899c26 0 +ccx f5893455a5948758 0 +ccx f644ffcb6d8ba37b 0 +ccx f8fe19d6123150e0 3 +ccx f91c0d240bc00c1e 2 +ccx f941680e4d470f64 0 +ccx fd888b5656818668 5 +ccx fe3fe47bbe41fbc3 0 +ccx ff044218fb205320 0 +ccx ff3acb0e32205c1e 0 +loc 103089ed2ae04ca 0 +loc 2d00284b3dd6bdf 1 +loc 38182968886385e 0 +loc 49a1656d6a63c65 59 +loc 612d2cd5fdf0346 6 +loc 64299a7e9893bd2 37 +loc 642bf64d72f8e1c 46 +loc 65212d5a1396cc9 41 +loc 7167d30674dbf63 15 +loc 72af055909181f5 9 +loc 85f5a8a60cf7c75 4 +loc 90e652d591cf68e 59 +loc ba3ecc46fad634c 6 +loc d20f1dce1e1bef3 3 +loc 10b2e1e8e86b9732 56 +loc 11c3a3314c1e3144 0 +loc 13f93c227689364f 0 +loc 152c7faf3423da88 4 +loc 19be6b42573839e7 10 +loc 1a0172fb7270396f 7 +loc 1ad63f23526776d5 137 +loc 1b20d4b545bf93dc 6 +loc 1b4c7a2aee901b3d 16 +loc 1cc1522b2986037c 0 +loc 1cd18be3b5e2839f 6 +loc 1efd0ca5e8215855 0 +loc 1f53e5b63005f896 10 +loc 201bd9b26a8db836 2 +loc 2181f6ceb4c7477a 1 +loc 24b76ca4826c5638 1 +loc 25acbaccce1b8830 210 +loc 2696e3db7e06604c 29 +loc 2745b426c80ee182 11 +loc 284f03ff5842c641 24 +loc 28db4cebaa9072ed 22 +loc 28f4d781217b843e 5 +loc 2ff9006086f1f843 0 +loc 31c8aa09bedd3a7b 17 +loc 320dcfea6ad0b28a 1 +loc 32a60b3dc9642a96 24 +loc 32c05141a58d2081 291 +loc 361dde13d88ebf3e 6 +loc 36fc8506263f1555 11 +loc 384fb88853a746d1 12 +loc 38808aabded99480 6 +loc 3a0812e052544e6f 8 +loc 3c3a9f754027034f 0 +loc 3e5b5d27576752f3 3 +loc 3f459e55674924cf 0 +loc 3f637a50e6b6038f 4 +loc 43c9d8f0d9e2a6c5 15 +loc 451c71fe46a88a45 97 +loc 45258d7526a3a391 12 +loc 467e6f22aa914d02 5 +loc 481b17d410524bc9 0 +loc 4825d1eb83944bcc 7 +loc 48392508fbeb2328 3 +loc 485f599241b29cab 13 +loc 4922d3e1219fb991 21 +loc 4a868c06fe9b4bbb 10 +loc 4eb5906e8d4c538f 34 +loc 507ca3857ed19786 12 +loc 508c5e817af8a999 0 +loc 511a3773cc69cdce 1 +loc 5125484542959f57 0 +loc 51a05343d3a2d81b 10 +loc 51c2230f60e10fa9 0 +loc 51d240aa1f334abb 15 +loc 52c098fb84ae64ec 0 +loc 52f1e07f00c8ed64 12 +loc 54a47a04fbec3be0 7 +loc 569544d043b37e9f 50 +loc 56bc0c10e75a873e 0 +loc 5859a8ff4b3a10f9 50 +loc 5a053f2482d132ec 4 +loc 5a767ebedc6595a2 1 +loc 5af4d7054c5559b6 6 +loc 5d81399c369a06d9 58 +loc 5dd9ee4e95425a38 38 +loc 5ecab546ba33bd53 6 +loc 5f36453a5ab0b84a 22 +loc 6274aefc8d348aeb 0 +loc 64f5fb2aa5e4c285 38 +loc 65ded60bb8202752 152 +loc 65f4ceeecbc882e5 11 +loc 663539f2e62075a8 4 +loc 676f9cb569c0342c 30 +loc 6961c0578f842233 15 +loc 6bb227768ac200a7 14 +loc 6c92d9507e31e28e 3 +loc 6e82e26c287fe27d 105 +loc 6f6561043b81779d 7 +loc 6fe3cea5e36d3bf7 20 +loc 70b5147ec4eb035e 0 +loc 714bbb5988c06069 0 +loc 71f069eb50731dd6 14 +loc 733de74921aafeaf 1 +loc 739435e6d6db5783 6 +loc 74a43eee461c4b92 4 +loc 752eaa6b4ed9238e 0 +loc 7561ea47cdacbf1c 5 +loc 75828a21cfbe8321 18 +loc 79f4173e0f2e51a7 48 +loc 7a2a000a2d92cd4a 17 +loc 7ae0bc4b28087f4f 12 +loc 7d50f471f3056c3c 52 +loc 7df1ee504e358a1e 8 +loc 8135ca4730ba8ede 5 +loc 8366b3f1e2975aa0 0 +loc 8370dc3dadb2bcfb 0 +loc 8446b146563844c2 3 +loc 8616b8507e1e7b58 7 +loc 88649649eb7e5f70 24 +loc 8aa16a6b7669e5f1 13 +loc 8c6bf8507b268d0e 4 +loc 8d4d13e71cfad2ba 16 +loc 8ed84a8af28500af 34 +loc 926e8c7a23e0a5fa 51 +loc 92aa9331ec50bf7d 13 +loc 93b74c055bf5c810 42 +loc 978259931a9261e9 4 +loc 97924f00f50c6315 72 +loc 97a64a1a5dc1b8ef 8 +loc 9840a9660c6fdd94 1 +loc 9a61ea8ada2954f7 0 +loc 9b47e3f57556ad8d 6 +loc 9bd5317887b26920 5 +loc 9be1d2f6ca24c2d7 17 +loc 9cabec78554559cf 68 +loc 9d3a7e0cf76ccf25 102 +loc 9eb87557a690122f 12 +loc 9fbe41f7c2619c14 3 +loc a00648f7c29f5d9c 3 +loc a0df8b624fda7b0c 10 +loc a3602e4da850e72f 21 +loc a51e14eb9088b593 0 +loc a64f5985092913df 6 +loc a7adc669aa5b8778 0 +loc a84e116847f93925 16 +loc a8879c85ff2ed336 10 +loc a9047b67529e29c7 19 +loc aa886b4cd027024e 3 +loc ada4a8f4e28ca23f 3 +loc ae6b4e2955499fb0 29 +loc b12da3ed3032d637 12 +loc b169c7f55ced54a2 11 +loc b1b9c23207367fc1 86 +loc b2263a5dc1c9e201 24 +loc b451a1c218a6681d 0 +loc b6f11c20341391e5 11 +loc b7277739378c745e 39 +loc b7b38393aac442bf 0 +loc b86df438c90110b2 163 +loc b8c696edd6580151 24 +loc b9db629e7ca06105 14 +loc badcf9479458b20a 2 +loc c3bbaf87da9dc0a2 15 +loc c9353453072f9b15 44 +loc ca2d94e59204fbf0 12 +loc cad731c520ec519b 1 +loc cc449db9c01710ac 19 +loc cd533a78c8a07908 46 +loc cd8d7681234d3263 128 +loc ce17356483e96835 24 +loc cf1b0ba3f6ee878b 57 +loc cf528746cdac418b 9 +loc d0ff92ab28f77ed1 72 +loc d10fbc0349b609bb 10 +loc d3694276ef344923 3 +loc d3b2ed48be7d702c 24 +loc d3d444d665f32ea0 13 +loc d4be378398900d59 63 +loc d6afa150657035d1 4 +loc d7673550cc3ca535 48 +loc d9d97ae11568136d 10 +loc db087cd756e2165c 20 +loc dc0d0f555e56f2a9 35 +loc ded6a9eb81e0c4b3 0 +loc e02c819d289fed29 1 +loc e04f204b5c54120d 0 +loc e110540af19ccc98 25 +loc e364f64bc221872b 0 +loc e4714062dc2222df 3 +loc e90bea4eb4f106ab 0 +loc eb3b6f0f11d0f4b0 2 +loc ebc196c3604f15d6 73 +loc ebca7b45f2f4b589 19 +loc ef4facf8da74d002 13 +loc efb2c550c8d34c10 47 +loc f0782dc03ca66464 6 +loc f1e6be599f0e9ee3 40 +loc f34a9bdde080f704 0 +loc f43ac65d42899c26 5 +loc f5893455a5948758 3 +loc f644ffcb6d8ba37b 21 +loc f8fe19d6123150e0 21 +loc f91c0d240bc00c1e 22 +loc f941680e4d470f64 11 +loc fd888b5656818668 14 +loc fe3fe47bbe41fbc3 29 +loc ff044218fb205320 20 +loc ff3acb0e32205c1e 20 +nest 103089ed2ae04ca 0 +nest 2d00284b3dd6bdf 0 +nest 38182968886385e 0 +nest 49a1656d6a63c65 2 +nest 612d2cd5fdf0346 1 +nest 64299a7e9893bd2 2 +nest 642bf64d72f8e1c 1 +nest 65212d5a1396cc9 2 +nest 7167d30674dbf63 1 +nest 72af055909181f5 1 +nest 85f5a8a60cf7c75 0 +nest 90e652d591cf68e 1 +nest ba3ecc46fad634c 1 +nest d20f1dce1e1bef3 0 +nest 10b2e1e8e86b9732 2 +nest 11c3a3314c1e3144 0 +nest 13f93c227689364f 0 +nest 152c7faf3423da88 0 +nest 19be6b42573839e7 0 +nest 1a0172fb7270396f 0 +nest 1ad63f23526776d5 1 +nest 1b20d4b545bf93dc 0 +nest 1b4c7a2aee901b3d 0 +nest 1cc1522b2986037c 0 +nest 1cd18be3b5e2839f 0 +nest 1efd0ca5e8215855 0 +nest 1f53e5b63005f896 2 +nest 201bd9b26a8db836 0 +nest 2181f6ceb4c7477a 0 +nest 24b76ca4826c5638 0 +nest 25acbaccce1b8830 2 +nest 2696e3db7e06604c 0 +nest 2745b426c80ee182 0 +nest 284f03ff5842c641 0 +nest 28db4cebaa9072ed 1 +nest 28f4d781217b843e 0 +nest 2ff9006086f1f843 0 +nest 31c8aa09bedd3a7b 1 +nest 320dcfea6ad0b28a 0 +nest 32a60b3dc9642a96 0 +nest 32c05141a58d2081 2 +nest 361dde13d88ebf3e 1 +nest 36fc8506263f1555 0 +nest 384fb88853a746d1 0 +nest 38808aabded99480 0 +nest 3a0812e052544e6f 0 +nest 3c3a9f754027034f 0 +nest 3e5b5d27576752f3 0 +nest 3f459e55674924cf 0 +nest 3f637a50e6b6038f 0 +nest 43c9d8f0d9e2a6c5 0 +nest 451c71fe46a88a45 1 +nest 45258d7526a3a391 2 +nest 467e6f22aa914d02 0 +nest 481b17d410524bc9 0 +nest 4825d1eb83944bcc 0 +nest 48392508fbeb2328 0 +nest 485f599241b29cab 0 +nest 4922d3e1219fb991 0 +nest 4a868c06fe9b4bbb 0 +nest 4eb5906e8d4c538f 0 +nest 507ca3857ed19786 0 +nest 508c5e817af8a999 0 +nest 511a3773cc69cdce 0 +nest 5125484542959f57 0 +nest 51a05343d3a2d81b 1 +nest 51c2230f60e10fa9 0 +nest 51d240aa1f334abb 0 +nest 52c098fb84ae64ec 0 +nest 52f1e07f00c8ed64 0 +nest 54a47a04fbec3be0 0 +nest 569544d043b37e9f 0 +nest 56bc0c10e75a873e 0 +nest 5859a8ff4b3a10f9 1 +nest 5a053f2482d132ec 0 +nest 5a767ebedc6595a2 0 +nest 5af4d7054c5559b6 0 +nest 5d81399c369a06d9 1 +nest 5dd9ee4e95425a38 1 +nest 5ecab546ba33bd53 0 +nest 5f36453a5ab0b84a 1 +nest 6274aefc8d348aeb 0 +nest 64f5fb2aa5e4c285 0 +nest 65ded60bb8202752 2 +nest 65f4ceeecbc882e5 0 +nest 663539f2e62075a8 0 +nest 676f9cb569c0342c 0 +nest 6961c0578f842233 1 +nest 6bb227768ac200a7 0 +nest 6c92d9507e31e28e 0 +nest 6e82e26c287fe27d 1 +nest 6f6561043b81779d 1 +nest 6fe3cea5e36d3bf7 2 +nest 70b5147ec4eb035e 0 +nest 714bbb5988c06069 0 +nest 71f069eb50731dd6 0 +nest 733de74921aafeaf 0 +nest 739435e6d6db5783 0 +nest 74a43eee461c4b92 0 +nest 752eaa6b4ed9238e 0 +nest 7561ea47cdacbf1c 0 +nest 75828a21cfbe8321 1 +nest 79f4173e0f2e51a7 2 +nest 7a2a000a2d92cd4a 2 +nest 7ae0bc4b28087f4f 1 +nest 7d50f471f3056c3c 0 +nest 7df1ee504e358a1e 0 +nest 8135ca4730ba8ede 0 +nest 8366b3f1e2975aa0 0 +nest 8370dc3dadb2bcfb 0 +nest 8446b146563844c2 0 +nest 8616b8507e1e7b58 0 +nest 88649649eb7e5f70 0 +nest 8aa16a6b7669e5f1 0 +nest 8c6bf8507b268d0e 0 +nest 8d4d13e71cfad2ba 2 +nest 8ed84a8af28500af 0 +nest 926e8c7a23e0a5fa 1 +nest 92aa9331ec50bf7d 0 +nest 93b74c055bf5c810 0 +nest 978259931a9261e9 0 +nest 97924f00f50c6315 1 +nest 97a64a1a5dc1b8ef 2 +nest 9840a9660c6fdd94 0 +nest 9a61ea8ada2954f7 0 +nest 9b47e3f57556ad8d 0 +nest 9bd5317887b26920 0 +nest 9be1d2f6ca24c2d7 0 +nest 9cabec78554559cf 1 +nest 9d3a7e0cf76ccf25 2 +nest 9eb87557a690122f 0 +nest 9fbe41f7c2619c14 0 +nest a00648f7c29f5d9c 0 +nest a0df8b624fda7b0c 1 +nest a3602e4da850e72f 0 +nest a51e14eb9088b593 0 +nest a64f5985092913df 0 +nest a7adc669aa5b8778 0 +nest a84e116847f93925 0 +nest a8879c85ff2ed336 1 +nest a9047b67529e29c7 1 +nest aa886b4cd027024e 0 +nest ada4a8f4e28ca23f 0 +nest ae6b4e2955499fb0 0 +nest b12da3ed3032d637 1 +nest b169c7f55ced54a2 1 +nest b1b9c23207367fc1 1 +nest b2263a5dc1c9e201 0 +nest b451a1c218a6681d 0 +nest b6f11c20341391e5 0 +nest b7277739378c745e 0 +nest b7b38393aac442bf 0 +nest b86df438c90110b2 2 +nest b8c696edd6580151 0 +nest b9db629e7ca06105 0 +nest badcf9479458b20a 0 +nest c3bbaf87da9dc0a2 0 +nest c9353453072f9b15 0 +nest ca2d94e59204fbf0 0 +nest cad731c520ec519b 0 +nest cc449db9c01710ac 1 +nest cd533a78c8a07908 2 +nest cd8d7681234d3263 1 +nest ce17356483e96835 0 +nest cf1b0ba3f6ee878b 1 +nest cf528746cdac418b 0 +nest d0ff92ab28f77ed1 1 +nest d10fbc0349b609bb 1 +nest d3694276ef344923 0 +nest d3b2ed48be7d702c 0 +nest d3d444d665f32ea0 1 +nest d4be378398900d59 2 +nest d6afa150657035d1 0 +nest d7673550cc3ca535 1 +nest d9d97ae11568136d 2 +nest db087cd756e2165c 0 +nest dc0d0f555e56f2a9 1 +nest ded6a9eb81e0c4b3 0 +nest e02c819d289fed29 0 +nest e04f204b5c54120d 0 +nest e110540af19ccc98 1 +nest e364f64bc221872b 0 +nest e4714062dc2222df 0 +nest e90bea4eb4f106ab 0 +nest eb3b6f0f11d0f4b0 0 +nest ebc196c3604f15d6 2 +nest ebca7b45f2f4b589 2 +nest ef4facf8da74d002 0 +nest efb2c550c8d34c10 2 +nest f0782dc03ca66464 1 +nest f1e6be599f0e9ee3 0 +nest f34a9bdde080f704 0 +nest f43ac65d42899c26 0 +nest f5893455a5948758 0 +nest f644ffcb6d8ba37b 0 +nest f8fe19d6123150e0 1 +nest f91c0d240bc00c1e 0 +nest f941680e4d470f64 0 +nest fd888b5656818668 1 +nest fe3fe47bbe41fbc3 0 +nest ff044218fb205320 0 +nest ff3acb0e32205c1e 0 +params 103089ed2ae04ca 0 +params 2d00284b3dd6bdf 0 +params 38182968886385e 0 +params 49a1656d6a63c65 1 +params 612d2cd5fdf0346 1 +params 64299a7e9893bd2 0 +params 642bf64d72f8e1c 1 +params 65212d5a1396cc9 1 +params 7167d30674dbf63 0 +params 72af055909181f5 1 +params 85f5a8a60cf7c75 0 +params 90e652d591cf68e 0 +params ba3ecc46fad634c 1 +params d20f1dce1e1bef3 0 +params 10b2e1e8e86b9732 1 +params 11c3a3314c1e3144 0 +params 13f93c227689364f 0 +params 152c7faf3423da88 0 +params 19be6b42573839e7 0 +params 1a0172fb7270396f 0 +params 1ad63f23526776d5 0 +params 1b20d4b545bf93dc 0 +params 1b4c7a2aee901b3d 0 +params 1cc1522b2986037c 0 +params 1cd18be3b5e2839f 0 +params 1efd0ca5e8215855 0 +params 1f53e5b63005f896 0 +params 201bd9b26a8db836 0 +params 2181f6ceb4c7477a 0 +params 24b76ca4826c5638 0 +params 25acbaccce1b8830 0 +params 2696e3db7e06604c 1 +params 2745b426c80ee182 0 +params 284f03ff5842c641 0 +params 28db4cebaa9072ed 1 +params 28f4d781217b843e 0 +params 2ff9006086f1f843 0 +params 31c8aa09bedd3a7b 0 +params 320dcfea6ad0b28a 0 +params 32a60b3dc9642a96 0 +params 32c05141a58d2081 1 +params 361dde13d88ebf3e 1 +params 36fc8506263f1555 0 +params 384fb88853a746d1 1 +params 38808aabded99480 0 +params 3a0812e052544e6f 0 +params 3c3a9f754027034f 0 +params 3e5b5d27576752f3 0 +params 3f459e55674924cf 0 +params 3f637a50e6b6038f 0 +params 43c9d8f0d9e2a6c5 1 +params 451c71fe46a88a45 1 +params 45258d7526a3a391 0 +params 467e6f22aa914d02 3 +params 481b17d410524bc9 0 +params 4825d1eb83944bcc 0 +params 48392508fbeb2328 1 +params 485f599241b29cab 0 +params 4922d3e1219fb991 0 +params 4a868c06fe9b4bbb 0 +params 4eb5906e8d4c538f 0 +params 507ca3857ed19786 1 +params 508c5e817af8a999 0 +params 511a3773cc69cdce 0 +params 5125484542959f57 0 +params 51a05343d3a2d81b 1 +params 51c2230f60e10fa9 0 +params 51d240aa1f334abb 0 +params 52c098fb84ae64ec 0 +params 52f1e07f00c8ed64 1 +params 54a47a04fbec3be0 0 +params 569544d043b37e9f 0 +params 56bc0c10e75a873e 0 +params 5859a8ff4b3a10f9 0 +params 5a053f2482d132ec 1 +params 5a767ebedc6595a2 0 +params 5af4d7054c5559b6 0 +params 5d81399c369a06d9 1 +params 5dd9ee4e95425a38 0 +params 5ecab546ba33bd53 1 +params 5f36453a5ab0b84a 1 +params 6274aefc8d348aeb 0 +params 64f5fb2aa5e4c285 0 +params 65ded60bb8202752 1 +params 65f4ceeecbc882e5 0 +params 663539f2e62075a8 0 +params 676f9cb569c0342c 0 +params 6961c0578f842233 1 +params 6bb227768ac200a7 0 +params 6c92d9507e31e28e 0 +params 6e82e26c287fe27d 0 +params 6f6561043b81779d 0 +params 6fe3cea5e36d3bf7 0 +params 70b5147ec4eb035e 0 +params 714bbb5988c06069 0 +params 71f069eb50731dd6 1 +params 733de74921aafeaf 0 +params 739435e6d6db5783 0 +params 74a43eee461c4b92 1 +params 752eaa6b4ed9238e 0 +params 7561ea47cdacbf1c 1 +params 75828a21cfbe8321 0 +params 79f4173e0f2e51a7 2 +params 7a2a000a2d92cd4a 0 +params 7ae0bc4b28087f4f 0 +params 7d50f471f3056c3c 1 +params 7df1ee504e358a1e 0 +params 8135ca4730ba8ede 0 +params 8366b3f1e2975aa0 0 +params 8370dc3dadb2bcfb 0 +params 8446b146563844c2 0 +params 8616b8507e1e7b58 1 +params 88649649eb7e5f70 0 +params 8aa16a6b7669e5f1 1 +params 8c6bf8507b268d0e 2 +params 8d4d13e71cfad2ba 0 +params 8ed84a8af28500af 0 +params 926e8c7a23e0a5fa 1 +params 92aa9331ec50bf7d 0 +params 93b74c055bf5c810 0 +params 978259931a9261e9 0 +params 97924f00f50c6315 1 +params 97a64a1a5dc1b8ef 0 +params 9840a9660c6fdd94 0 +params 9a61ea8ada2954f7 0 +params 9b47e3f57556ad8d 0 +params 9bd5317887b26920 1 +params 9be1d2f6ca24c2d7 0 +params 9cabec78554559cf 1 +params 9d3a7e0cf76ccf25 1 +params 9eb87557a690122f 1 +params 9fbe41f7c2619c14 1 +params a00648f7c29f5d9c 1 +params a0df8b624fda7b0c 1 +params a3602e4da850e72f 0 +params a51e14eb9088b593 0 +params a64f5985092913df 1 +params a7adc669aa5b8778 0 +params a84e116847f93925 0 +params a8879c85ff2ed336 2 +params a9047b67529e29c7 1 +params aa886b4cd027024e 0 +params ada4a8f4e28ca23f 0 +params ae6b4e2955499fb0 1 +params b12da3ed3032d637 1 +params b169c7f55ced54a2 1 +params b1b9c23207367fc1 0 +params b2263a5dc1c9e201 0 +params b451a1c218a6681d 0 +params b6f11c20341391e5 1 +params b7277739378c745e 0 +params b7b38393aac442bf 0 +params b86df438c90110b2 0 +params b8c696edd6580151 0 +params b9db629e7ca06105 0 +params badcf9479458b20a 0 +params c3bbaf87da9dc0a2 0 +params c9353453072f9b15 0 +params ca2d94e59204fbf0 1 +params cad731c520ec519b 0 +params cc449db9c01710ac 0 +params cd533a78c8a07908 1 +params cd8d7681234d3263 0 +params ce17356483e96835 0 +params cf1b0ba3f6ee878b 1 +params cf528746cdac418b 0 +params d0ff92ab28f77ed1 1 +params d10fbc0349b609bb 1 +params d3694276ef344923 0 +params d3b2ed48be7d702c 1 +params d3d444d665f32ea0 1 +params d4be378398900d59 0 +params d6afa150657035d1 0 +params d7673550cc3ca535 1 +params d9d97ae11568136d 0 +params db087cd756e2165c 1 +params dc0d0f555e56f2a9 1 +params ded6a9eb81e0c4b3 0 +params e02c819d289fed29 0 +params e04f204b5c54120d 0 +params e110540af19ccc98 1 +params e364f64bc221872b 0 +params e4714062dc2222df 0 +params e90bea4eb4f106ab 0 +params eb3b6f0f11d0f4b0 0 +params ebc196c3604f15d6 0 +params ebca7b45f2f4b589 0 +params ef4facf8da74d002 1 +params efb2c550c8d34c10 1 +params f0782dc03ca66464 1 +params f1e6be599f0e9ee3 0 +params f34a9bdde080f704 0 +params f43ac65d42899c26 0 +params f5893455a5948758 0 +params f644ffcb6d8ba37b 1 +params f8fe19d6123150e0 1 +params f91c0d240bc00c1e 0 +params f941680e4d470f64 1 +params fd888b5656818668 0 +params fe3fe47bbe41fbc3 0 +params ff044218fb205320 1 +params ff3acb0e32205c1e 0 +defs 103089ed2ae04ca 1 +defs 2d00284b3dd6bdf 1 +defs 38182968886385e 1 +defs 49a1656d6a63c65 1 +defs 612d2cd5fdf0346 1 +defs 64299a7e9893bd2 1 +defs 642bf64d72f8e1c 1 +defs 65212d5a1396cc9 1 +defs 7167d30674dbf63 1 +defs 72af055909181f5 1 +defs 85f5a8a60cf7c75 1 +defs 90e652d591cf68e 1 +defs ba3ecc46fad634c 1 +defs d20f1dce1e1bef3 1 +defs 10b2e1e8e86b9732 1 +defs 11c3a3314c1e3144 1 +defs 13f93c227689364f 1 +defs 152c7faf3423da88 1 +defs 19be6b42573839e7 1 +defs 1a0172fb7270396f 1 +defs 1ad63f23526776d5 1 +defs 1b20d4b545bf93dc 1 +defs 1b4c7a2aee901b3d 1 +defs 1cc1522b2986037c 1 +defs 1cd18be3b5e2839f 1 +defs 1efd0ca5e8215855 1 +defs 1f53e5b63005f896 1 +defs 201bd9b26a8db836 1 +defs 2181f6ceb4c7477a 1 +defs 24b76ca4826c5638 1 +defs 25acbaccce1b8830 1 +defs 2696e3db7e06604c 1 +defs 2745b426c80ee182 1 +defs 284f03ff5842c641 1 +defs 28db4cebaa9072ed 1 +defs 28f4d781217b843e 1 +defs 2ff9006086f1f843 1 +defs 31c8aa09bedd3a7b 1 +defs 320dcfea6ad0b28a 1 +defs 32a60b3dc9642a96 1 +defs 32c05141a58d2081 1 +defs 361dde13d88ebf3e 1 +defs 36fc8506263f1555 1 +defs 384fb88853a746d1 1 +defs 38808aabded99480 1 +defs 3a0812e052544e6f 1 +defs 3c3a9f754027034f 1 +defs 3e5b5d27576752f3 1 +defs 3f459e55674924cf 1 +defs 3f637a50e6b6038f 1 +defs 43c9d8f0d9e2a6c5 1 +defs 451c71fe46a88a45 1 +defs 45258d7526a3a391 1 +defs 467e6f22aa914d02 1 +defs 481b17d410524bc9 1 +defs 4825d1eb83944bcc 1 +defs 48392508fbeb2328 1 +defs 485f599241b29cab 1 +defs 4922d3e1219fb991 1 +defs 4a868c06fe9b4bbb 1 +defs 4eb5906e8d4c538f 1 +defs 507ca3857ed19786 1 +defs 508c5e817af8a999 1 +defs 511a3773cc69cdce 1 +defs 5125484542959f57 1 +defs 51a05343d3a2d81b 1 +defs 51c2230f60e10fa9 1 +defs 51d240aa1f334abb 1 +defs 52c098fb84ae64ec 1 +defs 52f1e07f00c8ed64 1 +defs 54a47a04fbec3be0 1 +defs 569544d043b37e9f 1 +defs 56bc0c10e75a873e 1 +defs 5859a8ff4b3a10f9 1 +defs 5a053f2482d132ec 1 +defs 5a767ebedc6595a2 1 +defs 5af4d7054c5559b6 1 +defs 5d81399c369a06d9 1 +defs 5dd9ee4e95425a38 1 +defs 5ecab546ba33bd53 1 +defs 5f36453a5ab0b84a 1 +defs 6274aefc8d348aeb 1 +defs 64f5fb2aa5e4c285 1 +defs 65ded60bb8202752 1 +defs 65f4ceeecbc882e5 1 +defs 663539f2e62075a8 1 +defs 676f9cb569c0342c 1 +defs 6961c0578f842233 1 +defs 6bb227768ac200a7 1 +defs 6c92d9507e31e28e 1 +defs 6e82e26c287fe27d 1 +defs 6f6561043b81779d 1 +defs 6fe3cea5e36d3bf7 1 +defs 70b5147ec4eb035e 1 +defs 714bbb5988c06069 1 +defs 71f069eb50731dd6 1 +defs 733de74921aafeaf 1 +defs 739435e6d6db5783 1 +defs 74a43eee461c4b92 1 +defs 752eaa6b4ed9238e 1 +defs 7561ea47cdacbf1c 1 +defs 75828a21cfbe8321 1 +defs 79f4173e0f2e51a7 1 +defs 7a2a000a2d92cd4a 1 +defs 7ae0bc4b28087f4f 1 +defs 7d50f471f3056c3c 1 +defs 7df1ee504e358a1e 1 +defs 8135ca4730ba8ede 1 +defs 8366b3f1e2975aa0 1 +defs 8370dc3dadb2bcfb 1 +defs 8446b146563844c2 1 +defs 8616b8507e1e7b58 1 +defs 88649649eb7e5f70 1 +defs 8aa16a6b7669e5f1 1 +defs 8c6bf8507b268d0e 1 +defs 8d4d13e71cfad2ba 1 +defs 8ed84a8af28500af 1 +defs 926e8c7a23e0a5fa 1 +defs 92aa9331ec50bf7d 1 +defs 93b74c055bf5c810 1 +defs 978259931a9261e9 1 +defs 97924f00f50c6315 1 +defs 97a64a1a5dc1b8ef 1 +defs 9840a9660c6fdd94 1 +defs 9a61ea8ada2954f7 1 +defs 9b47e3f57556ad8d 1 +defs 9bd5317887b26920 1 +defs 9be1d2f6ca24c2d7 1 +defs 9cabec78554559cf 1 +defs 9d3a7e0cf76ccf25 1 +defs 9eb87557a690122f 1 +defs 9fbe41f7c2619c14 1 +defs a00648f7c29f5d9c 1 +defs a0df8b624fda7b0c 1 +defs a3602e4da850e72f 1 +defs a51e14eb9088b593 1 +defs a64f5985092913df 1 +defs a7adc669aa5b8778 1 +defs a84e116847f93925 1 +defs a8879c85ff2ed336 1 +defs a9047b67529e29c7 1 +defs aa886b4cd027024e 1 +defs ada4a8f4e28ca23f 1 +defs ae6b4e2955499fb0 1 +defs b12da3ed3032d637 1 +defs b169c7f55ced54a2 1 +defs b1b9c23207367fc1 1 +defs b2263a5dc1c9e201 1 +defs b451a1c218a6681d 1 +defs b6f11c20341391e5 1 +defs b7277739378c745e 1 +defs b7b38393aac442bf 1 +defs b86df438c90110b2 1 +defs b8c696edd6580151 1 +defs b9db629e7ca06105 1 +defs badcf9479458b20a 1 +defs c3bbaf87da9dc0a2 1 +defs c9353453072f9b15 1 +defs ca2d94e59204fbf0 1 +defs cad731c520ec519b 1 +defs cc449db9c01710ac 1 +defs cd533a78c8a07908 1 +defs cd8d7681234d3263 1 +defs ce17356483e96835 1 +defs cf1b0ba3f6ee878b 1 +defs cf528746cdac418b 1 +defs d0ff92ab28f77ed1 1 +defs d10fbc0349b609bb 1 +defs d3694276ef344923 1 +defs d3b2ed48be7d702c 1 +defs d3d444d665f32ea0 1 +defs d4be378398900d59 1 +defs d6afa150657035d1 1 +defs d7673550cc3ca535 1 +defs d9d97ae11568136d 1 +defs db087cd756e2165c 1 +defs dc0d0f555e56f2a9 1 +defs ded6a9eb81e0c4b3 1 +defs e02c819d289fed29 1 +defs e04f204b5c54120d 1 +defs e110540af19ccc98 1 +defs e364f64bc221872b 1 +defs e4714062dc2222df 1 +defs e90bea4eb4f106ab 1 +defs eb3b6f0f11d0f4b0 1 +defs ebc196c3604f15d6 1 +defs ebca7b45f2f4b589 1 +defs ef4facf8da74d002 1 +defs efb2c550c8d34c10 1 +defs f0782dc03ca66464 1 +defs f1e6be599f0e9ee3 1 +defs f34a9bdde080f704 1 +defs f43ac65d42899c26 1 +defs f5893455a5948758 1 +defs f644ffcb6d8ba37b 1 +defs f8fe19d6123150e0 1 +defs f91c0d240bc00c1e 1 +defs f941680e4d470f64 1 +defs fd888b5656818668 1 +defs fe3fe47bbe41fbc3 1 +defs ff044218fb205320 1 +defs ff3acb0e32205c1e 1 +bodyq 2d00284b3dd6bdf 175b7b99ca412545 +bodyq 49a1656d6a63c65 2af90d987a019365 +bodyq 612d2cd5fdf0346 3c3e0f8735b28d83 +bodyq 64299a7e9893bd2 32ba36c3da83d348 +bodyq 642bf64d72f8e1c 5ec37fff214e543c +bodyq 65212d5a1396cc9 d80dbc23c5615a31 +bodyq 7167d30674dbf63 2951c57b1262c81c +bodyq 72af055909181f5 76fd7f5aab40af87 +bodyq 85f5a8a60cf7c75 7f856386586ea6f2 +bodyq 90e652d591cf68e 5a0b4d85cbb0bb8c +bodyq ba3ecc46fad634c f28b173ad4bfdc07 +bodyq d20f1dce1e1bef3 a6c1c653846b4a3d +bodyq 10b2e1e8e86b9732 bcb8fcf0184b6eb6 +bodyq 11c3a3314c1e3144 cc4b354f9ec4688 +bodyq 13f93c227689364f 80c3d0beaabc5567 +bodyq 152c7faf3423da88 c9fba6e73c79d679 +bodyq 19be6b42573839e7 3942c3fa729687f8 +bodyq 1a0172fb7270396f 5412d17ff9098fbc +bodyq 1ad63f23526776d5 d26e90338203e531 +bodyq 1b20d4b545bf93dc eb9dc3b8fdfe7971 +bodyq 1b4c7a2aee901b3d 1a44d1e7fb74e81 +bodyq 1cd18be3b5e2839f eb9dc3b8fdfe7971 +bodyq 1f53e5b63005f896 4c58fa99bf5add3f +bodyq 201bd9b26a8db836 b26165d12331783a +bodyq 2181f6ceb4c7477a 46389a31982e7d15 +bodyq 24b76ca4826c5638 321c0ca65c9010fa +bodyq 25acbaccce1b8830 2d17b446d54a0347 +bodyq 2696e3db7e06604c 9367238cf0fb1f23 +bodyq 2745b426c80ee182 729b01097ff98522 +bodyq 284f03ff5842c641 d1f997d42658066e +bodyq 28db4cebaa9072ed e528d1a3e2f24f5f +bodyq 28f4d781217b843e f12381cb92fb8f25 +bodyq 31c8aa09bedd3a7b 1a054a978abe936c +bodyq 320dcfea6ad0b28a 778e65c4fbad511b +bodyq 32a60b3dc9642a96 b519dea91f3c09f4 +bodyq 32c05141a58d2081 dd14108b7081373d +bodyq 361dde13d88ebf3e 3c3e0f8735b28d83 +bodyq 36fc8506263f1555 b423887bd345dd1e +bodyq 384fb88853a746d1 e86db053b34e6c3b +bodyq 38808aabded99480 97b3f0ec2fb09e81 +bodyq 3a0812e052544e6f 4f85a4ca0ecc15d2 +bodyq 3e5b5d27576752f3 ae2c60095ab2b354 +bodyq 3f459e55674924cf 22b01a2cc496f038 +bodyq 3f637a50e6b6038f 600ae5830700697b +bodyq 43c9d8f0d9e2a6c5 b5c72e224a98c412 +bodyq 451c71fe46a88a45 c83949119a072f70 +bodyq 45258d7526a3a391 b63beabcc4fa3d53 +bodyq 467e6f22aa914d02 3939b37bd6ea6db1 +bodyq 4825d1eb83944bcc 45b297e603aae76 +bodyq 48392508fbeb2328 8f5798b33feef60e +bodyq 485f599241b29cab 4f28411b0214edea +bodyq 4922d3e1219fb991 87369a9996a942f5 +bodyq 4a868c06fe9b4bbb 978877a9e7cc1577 +bodyq 4eb5906e8d4c538f 4148747cdc483f65 +bodyq 507ca3857ed19786 842b0d8d6c7ac4e5 +bodyq 511a3773cc69cdce 9415491cad0254c3 +bodyq 51a05343d3a2d81b 393eccc9f053e447 +bodyq 51d240aa1f334abb 3939b99463cc7285 +bodyq 52f1e07f00c8ed64 af5389e1e812ed91 +bodyq 54a47a04fbec3be0 ab8c879f518d7545 +bodyq 569544d043b37e9f ce32cf1784b37a4a +bodyq 56bc0c10e75a873e 62fa6a477cdb4298 +bodyq 5859a8ff4b3a10f9 c3757b21b2b4e4c5 +bodyq 5a053f2482d132ec 608c12dc2eaece4e +bodyq 5a767ebedc6595a2 dc2de4441f8c5a52 +bodyq 5af4d7054c5559b6 6f8d8c8075859cb8 +bodyq 5d81399c369a06d9 44e8a8ce25d9c3bd +bodyq 5dd9ee4e95425a38 10458ee1455ac11e +bodyq 5ecab546ba33bd53 14246694a833bad4 +bodyq 5f36453a5ab0b84a 8aa2e588106b240d +bodyq 64f5fb2aa5e4c285 304a3e206d9c6bbb +bodyq 65ded60bb8202752 bf3d3d4661d4cc2d +bodyq 65f4ceeecbc882e5 67da10a129455ca1 +bodyq 663539f2e62075a8 8bfc78aa08f8bb58 +bodyq 676f9cb569c0342c 16044a3ba81d366 +bodyq 6961c0578f842233 64ac12597a1a408e +bodyq 6bb227768ac200a7 4f378f403e60831d +bodyq 6c92d9507e31e28e c57242bfe26b9624 +bodyq 6e82e26c287fe27d ae3039fbb6cb2da9 +bodyq 6f6561043b81779d 1fd4e2f70bd5a981 +bodyq 6fe3cea5e36d3bf7 1289dd5cb3b45d11 +bodyq 71f069eb50731dd6 13b0df54ed0caa1d +bodyq 733de74921aafeaf 767e8f1963349d4d +bodyq 739435e6d6db5783 eb9dc3b8fdfe7971 +bodyq 74a43eee461c4b92 e26887357fa09102 +bodyq 7561ea47cdacbf1c e60adbac84a25885 +bodyq 75828a21cfbe8321 bc3140576d3c1a39 +bodyq 79f4173e0f2e51a7 6ee82b7051fd6140 +bodyq 7a2a000a2d92cd4a 754da6c0315ccc1b +bodyq 7ae0bc4b28087f4f 5a2754ab4cbca881 +bodyq 7d50f471f3056c3c 788c90127f33435b +bodyq 7df1ee504e358a1e 224374c95dfa64eb +bodyq 8135ca4730ba8ede 63292a984d45a8dc +bodyq 8366b3f1e2975aa0 22b01a2cc496f038 +bodyq 8446b146563844c2 b15d8632128eca14 +bodyq 8616b8507e1e7b58 64ddfb349e07771 +bodyq 88649649eb7e5f70 b519dea91f3c09f4 +bodyq 8aa16a6b7669e5f1 c1126aa5cfb49844 +bodyq 8c6bf8507b268d0e 1a3b992094b48c0c +bodyq 8d4d13e71cfad2ba aa0bd09c3b5924c3 +bodyq 8ed84a8af28500af 98acca59f3e78e9 +bodyq 926e8c7a23e0a5fa 9ddd58dee3359988 +bodyq 92aa9331ec50bf7d cf823729bd961015 +bodyq 93b74c055bf5c810 943626ed298a2781 +bodyq 978259931a9261e9 7f856386586ea6f2 +bodyq 97924f00f50c6315 f434c3618bfd503d +bodyq 97a64a1a5dc1b8ef 6907da3325928b6d +bodyq 9840a9660c6fdd94 aa5fa526d758e274 +bodyq 9a61ea8ada2954f7 c356f648872f06 +bodyq 9b47e3f57556ad8d eb9dc3b8fdfe7971 +bodyq 9bd5317887b26920 d8778fe6f8378875 +bodyq 9be1d2f6ca24c2d7 9e22fa659ba05980 +bodyq 9cabec78554559cf cf40cc765c37d25e +bodyq 9d3a7e0cf76ccf25 4c3db35ddb35edfe +bodyq 9eb87557a690122f 5dbc1818e75ad6cf +bodyq 9fbe41f7c2619c14 664477be5cb636cb +bodyq a00648f7c29f5d9c 3a64cfd4e5087ab5 +bodyq a0df8b624fda7b0c 30ec1c126a549164 +bodyq a3602e4da850e72f 87369a9996a942f5 +bodyq a64f5985092913df 608e5affa1211ecd +bodyq a7adc669aa5b8778 c356f648872f06 +bodyq a84e116847f93925 155aa28c262b2767 +bodyq a8879c85ff2ed336 eb97391cddb2e0e2 +bodyq a9047b67529e29c7 b17bd7bf91478602 +bodyq aa886b4cd027024e 5a7e375974a59b68 +bodyq ada4a8f4e28ca23f ae2c60095ab2b354 +bodyq ae6b4e2955499fb0 83965f33a4819062 +bodyq b12da3ed3032d637 b17e9db16896f0e8 +bodyq b169c7f55ced54a2 490518ff44059d2c +bodyq b1b9c23207367fc1 fbbdc1381fa62337 +bodyq b2263a5dc1c9e201 b519dea91f3c09f4 +bodyq b6f11c20341391e5 78c6e418a44eb6d9 +bodyq b7277739378c745e 9c18830f6b24f3de +bodyq b86df438c90110b2 56973f27f5764de8 +bodyq b8c696edd6580151 b519dea91f3c09f4 +bodyq b9db629e7ca06105 18f9b108de521679 +bodyq badcf9479458b20a fec68801d037553a +bodyq c3bbaf87da9dc0a2 f32cd9abc4909f10 +bodyq c9353453072f9b15 4d8b00cdea7cd334 +bodyq ca2d94e59204fbf0 b545a5c0668905a2 +bodyq cad731c520ec519b 81d2b068737213d1 +bodyq cc449db9c01710ac e52c69955da3adfd +bodyq cd533a78c8a07908 9dd64a38e968d2ed +bodyq cd8d7681234d3263 cfcd2d57b29bd3c8 +bodyq ce17356483e96835 b519dea91f3c09f4 +bodyq cf1b0ba3f6ee878b 2ea78ce9a5c87a49 +bodyq cf528746cdac418b 684ab83dda69c1da +bodyq d0ff92ab28f77ed1 6874b7132c8808ba +bodyq d10fbc0349b609bb d7eb0a938e9ddb8 +bodyq d3694276ef344923 5d9659c99dc8cc5b +bodyq d3b2ed48be7d702c a9d0ad7c5b74a4b1 +bodyq d3d444d665f32ea0 723746b9230079fd +bodyq d4be378398900d59 ea20ec705f3ea7f1 +bodyq d6afa150657035d1 a106e7fbbdb151d0 +bodyq d7673550cc3ca535 77087555db8cdeac +bodyq d9d97ae11568136d 303e3adb1778fa38 +bodyq db087cd756e2165c 5db0150d75cf3da8 +bodyq dc0d0f555e56f2a9 a1869cd4d406fb4a +bodyq e02c819d289fed29 42a0f4bbf7a0b9ad +bodyq e110540af19ccc98 1a624f2130189aae +bodyq e4714062dc2222df fb0e7b940cc96f3b +bodyq eb3b6f0f11d0f4b0 dff15f4bb7e1e7cf +bodyq ebc196c3604f15d6 7d1eb01bcf72fa0d +bodyq ebca7b45f2f4b589 488d1bee0a1f6c73 +bodyq ef4facf8da74d002 c1126aa5cfb49844 +bodyq efb2c550c8d34c10 d050eaca2a994f3b +bodyq f0782dc03ca66464 8ff21db249a81c61 +bodyq f1e6be599f0e9ee3 42010699d909c2de +bodyq f34a9bdde080f704 62fa6a477cdb4298 +bodyq f43ac65d42899c26 61e83238d840f1a4 +bodyq f5893455a5948758 326e7353dd18069 +bodyq f644ffcb6d8ba37b be1da73b17df3867 +bodyq f8fe19d6123150e0 c53f802b11bf8ffd +bodyq f91c0d240bc00c1e 55a798c8d771b371 +bodyq f941680e4d470f64 d4b62dab5d95a378 +bodyq fd888b5656818668 bb62213929948efc +bodyq fe3fe47bbe41fbc3 2b17efd49298c19f +bodyq ff044218fb205320 9d64dd93273a8840 +bodyq ff3acb0e32205c1e c7ecfa1663ee757 +dead 642bf64d72f8e1c +dead 7d50f471f3056c3c +dead a0df8b624fda7b0c +dead b6f11c20341391e5 +dead d3b2ed48be7d702c diff --git a/src/app/(index)/components/nav-top.tsx b/src/app/(index)/components/nav-top.tsx index 74afd10..43f8ddb 100644 --- a/src/app/(index)/components/nav-top.tsx +++ b/src/app/(index)/components/nav-top.tsx @@ -1,6 +1,6 @@ 'use client' -import { useRouter } from 'next/navigation' +import { logout } from '@/lib/auth' import axiosInstance from '@/axios/axiosInstance' import { useQuery } from '@tanstack/react-query' import Link from 'next/link' @@ -8,7 +8,6 @@ import { useEffect, useState } from 'react' const NavTop = ()=>{ - const router = useRouter(); const [nameFamily, setNameFamily] = useState(null) useEffect( ()=>{ @@ -26,16 +25,7 @@ const NavTop = ()=>{ },}) - const onLogout = ()=>{ - localStorage.removeItem('0a'); - localStorage.removeItem('0r'); - localStorage.removeItem('access'); - localStorage.removeItem('refresh'); - document.cookie = "isAuth=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;"; - setTimeout(()=>{ - router.push('/login') - }, 200) - } + const onLogout = () => { void logout() } return (
diff --git a/src/app/(index)/components/side-right.tsx b/src/app/(index)/components/side-right.tsx index bcbf123..b5a0f71 100644 --- a/src/app/(index)/components/side-right.tsx +++ b/src/app/(index)/components/side-right.tsx @@ -1,3 +1,7 @@ +'use client' +import { useQuery } from '@tanstack/react-query' +import api from '@/axios/axiosInstance' +import { canManageProducts } from '@/lib/catalog' import Link from "next/link"; import { AiFillAppstore, AiFillHome } from "react-icons/ai"; import { HiShoppingCart } from "react-icons/hi"; @@ -11,6 +15,7 @@ import { IoNotifications } from "react-icons/io5"; const SideRight = ()=>{ + const info = useQuery({ queryKey: ['cuser-info'], queryFn: () => api.get('cuser/info/'), retry: false }) const menuLinks = [ {name:'خانه', link: '/', size:25, icon: }, @@ -25,7 +30,7 @@ const SideRight = ()=>{ {name:'چک ها', link: '', size:25, icon: }, {name:'واریزی ها', link: '', size:25, icon: }, {name:'پایگاه دانش', link: '', size:25, icon: }, - + ] return ( @@ -34,14 +39,15 @@ const SideRight = ()=>{
- لوله گستر گلپایگان + لوله گستر گلپایگان

پنل کارشناسان

    + {canManageProducts(info.data?.data) &&
  • مدیریت محصولات
  • } {menuLinks.map((item)=>{ - return + return
  • {item.icon} diff --git a/src/app/(index)/customers/[id]/page.tsx b/src/app/(index)/customers/[id]/page.tsx index 4f66ecd..2fc50a7 100644 --- a/src/app/(index)/customers/[id]/page.tsx +++ b/src/app/(index)/customers/[id]/page.tsx @@ -49,7 +49,7 @@ const customerPageID = ({params}:{params: {id: number} }) => { const [summary, setSummary] = useState(null) - const result = useQuery({ queryKey:['customer-summary'], queryFn: async ()=>{ + const result = useQuery({ queryKey:['customer-summary', params.id], queryFn: async ()=>{ const summary = await axiosInstance.get(`customer/${params.id}/summary/`) return { summary: summary,} diff --git a/src/app/(index)/customers/components/customer-info.tsx b/src/app/(index)/customers/components/customer-info.tsx index 793886b..cf3835e 100644 --- a/src/app/(index)/customers/components/customer-info.tsx +++ b/src/app/(index)/customers/components/customer-info.tsx @@ -1,5 +1,8 @@ 'use client' +import { apiErrorMessage } from '@/lib/auth' +import { useQueryClient } from '@tanstack/react-query' + import { Label } from "@/components/ui/label"; import { Textarea } from "@/components/ui/textarea"; import { FaRegEdit } from "react-icons/fa"; @@ -59,8 +62,8 @@ interface IProps { } interface IShahr { - id: Number, - name: String + id: number, + name: string is_ostan: boolean, "ostan": any } @@ -77,6 +80,8 @@ interface ICustomerForm { } const CustomerInfo = (props: IProps)=>{ + const queryClient = useQueryClient() + const [submitError, setSubmitError] = useState('') const [edit, setEdit] = useState(false) const [shahr, setShahr] = useState([]) @@ -121,6 +126,7 @@ const CustomerInfo = (props: IProps)=>{ }) const onSubmit: SubmitHandler = async (data) => { + setSubmitError('') try { @@ -128,6 +134,7 @@ const CustomerInfo = (props: IProps)=>{ const result = await axiosInstance.patch(`/customer/update/${props.customer.id}/`, data) if(result.status == 200){ + await queryClient.invalidateQueries({ queryKey: ['customer-summary'] }) setEdit(false) setTimeout(()=>{ alert("با موفقیت ویرایش شد") @@ -138,7 +145,7 @@ const CustomerInfo = (props: IProps)=>{ } } catch (error) { - console.log(error) + setSubmitError(apiErrorMessage(error)) } } @@ -188,6 +195,7 @@ const CustomerInfo = (props: IProps)=>{
+ {submitError &&

{submitError}

}
@@ -285,7 +293,7 @@ const CustomerInfo = (props: IProps)=>{
{edit ? : null} - {edit ? : null} + {edit ? : null}
diff --git a/src/app/(index)/customers/components/customer-online-panel.tsx b/src/app/(index)/customers/components/customer-online-panel.tsx index 71b139a..80690c2 100644 --- a/src/app/(index)/customers/components/customer-online-panel.tsx +++ b/src/app/(index)/customers/components/customer-online-panel.tsx @@ -1,5 +1,8 @@ 'use client' +import { apiErrorMessage } from '@/lib/auth' +import { useQueryClient } from '@tanstack/react-query' + import { Label } from "@/components/ui/label"; import { Textarea } from "@/components/ui/textarea"; import { FaRegEdit } from "react-icons/fa"; @@ -73,10 +76,12 @@ interface IShahr { } interface IForm { - status: boolean + status: string } const CustomerOnlinePanel = (props: IProps)=>{ + const queryClient = useQueryClient() + const [submitError, setSubmitError] = useState('') const [edit, setEdit] = useState(false) const [shahr, setShahr] = useState([]) @@ -96,6 +101,7 @@ const CustomerOnlinePanel = (props: IProps)=>{ }) const onSubmit: SubmitHandler = async (data) => { + setSubmitError('') try { @@ -103,10 +109,11 @@ const CustomerOnlinePanel = (props: IProps)=>{ const result = await axiosInstance.post(`/customer/customer-panel/`, { customer_id: props.customer.id, mobile: props.customer.mobile, - status: data.status + status: String(data.status) === 'true' }) if(result.status == 200){ + await queryClient.invalidateQueries({ queryKey: ['customer-summary'] }) setEdit(false) setTimeout(()=>{ alert("با موفقیت ثبت شد") @@ -116,7 +123,7 @@ const CustomerOnlinePanel = (props: IProps)=>{ } } catch (error) { - console.log(error) + setSubmitError(apiErrorMessage(error)) } } @@ -124,9 +131,9 @@ const CustomerOnlinePanel = (props: IProps)=>{ useEffect(()=>{ if(props.customer?.cuser_role?.customer_panel){ - setValue('status', props.customer?.cuser_role?.customer_panel) + setValue('status', String(props.customer?.cuser_role?.customer_panel)) }else{ - setValue('status', false) + setValue('status', 'false') } @@ -146,6 +153,7 @@ const CustomerOnlinePanel = (props: IProps)=>{
+ {submitError &&

{submitError}

}
@@ -175,7 +183,7 @@ const CustomerOnlinePanel = (props: IProps)=>{
{edit ? : null} - {edit ? : null} + {edit ? : null}
diff --git a/src/app/(index)/customers/new/page.tsx b/src/app/(index)/customers/new/page.tsx index 9acb9d1..9af283a 100644 --- a/src/app/(index)/customers/new/page.tsx +++ b/src/app/(index)/customers/new/page.tsx @@ -1,5 +1,7 @@ 'use client' +import { apiErrorMessage } from '@/lib/auth' + import { Input } from "@/components/ui/input" import CustomerNewHeader from "../components/customer-new-header" import { Label } from "@/components/ui/label" @@ -64,6 +66,7 @@ interface ICustomerForm { const newCustomerPage = ()=>{ + const [submitError, setSubmitError] = useState('') const [formItems, setFormItems] = useState(null) const [shahr, setShahr] = useState(null) const router = useRouter() @@ -79,6 +82,7 @@ const newCustomerPage = ()=>{ }) const onSubmit: SubmitHandler = async (data) => { + setSubmitError('') try { const result = await axiosInstance.post('/customer/v2/create/', data) @@ -90,7 +94,7 @@ const newCustomerPage = ()=>{ } } catch (error) { - console.log(error) + setSubmitError(apiErrorMessage(error)) } } @@ -101,7 +105,7 @@ const newCustomerPage = ()=>{ return item.ostan?.id == e.target.value }) - setShahr(tmp_shahr) + setShahr(tmp_shahr || null) } @@ -134,6 +138,7 @@ const newCustomerPage = ()=>{
+ {submitError &&

{submitError}

}
@@ -216,7 +221,7 @@ const newCustomerPage = ()=>{ خطا {Object.keys(errors).map((item, key)=>{ - return

{errors[item]?.message}

+ return

{errors[item as keyof ICustomerForm]?.message}

})}
diff --git a/src/app/(index)/products/categories/page.tsx b/src/app/(index)/products/categories/page.tsx new file mode 100644 index 0000000..efe43d8 --- /dev/null +++ b/src/app/(index)/products/categories/page.tsx @@ -0,0 +1,58 @@ +'use client' + +import { FormEvent, useState } from 'react' +import { useQuery, useQueryClient } from '@tanstack/react-query' +import { Category, listCategories, saveCategory, deleteCategory, integerInput, categoryLabel } from '@/lib/catalog' +import { apiErrorMessage } from '@/lib/auth' + +export default function CategoriesPage() { + const client = useQueryClient(), categories = useQuery({ queryKey: ['managed-categories'], queryFn: listCategories, retry: false }) + const [editor, setEditor] = useState(null), [search, setSearch] = useState('') + const [busy, setBusy] = useState(false), [error, setError] = useState(''), [notice, setNotice] = useState('') + const [clearImage, setClearImage] = useState(false) + const rows = categories.data || [] + function edit(category: Category | 'new') { setEditor(category); setClearImage(false); setError(''); setNotice('') } + async function refresh() { await Promise.all([client.invalidateQueries({ queryKey: ['managed-categories'] }), client.invalidateQueries({ queryKey: ['managed-products'] })]) } + async function submit(event: FormEvent) { + event.preventDefault() + setBusy(true); setError(''); setNotice('') + const data = new FormData(event.currentTarget) + try { + const order = integerInput(String(data.get('order_cat')), 'ترتیب نمایش', true) + const excel = integerInput(String(data.get('excel_order')), 'ترتیب اکسل', true) + const image = data.get('image') as File | null + await saveCategory({ name: String(data.get('name')).trim(), parent: data.get('parent') ? Number(data.get('parent')) : null, + order_cat: order === null ? null : Number(order), excel_order: excel === null ? null : Number(excel) }, + editor && editor !== 'new' ? editor.id : undefined, image?.size ? image : null, clearImage) + setEditor(null); setNotice('دسته ذخیره شد.'); await refresh() + } catch (failure) { setError(apiErrorMessage(failure)) } + finally { setBusy(false) } + } + async function remove(category: Category) { + if (!window.confirm(`دسته «${category.name}» حذف شود؟ دسته دارای محصول یا زیردسته قابل حذف نیست.`)) return + setBusy(true); setError(''); setNotice('') + try { await deleteCategory(category.id); setNotice('دسته حذف شد.'); await refresh() } + catch (failure) { setError(apiErrorMessage(failure)) } + finally { setBusy(false) } + } + const current = editor && editor !== 'new' ? editor : undefined + return
+

مدیریت دسته‌های محصولات

{rows.length} دسته؛ ترتیب نمایش و خروجی اکسل مستقل است.

+ {editor && +

{current ? `ویرایش ${current.name}` : 'دسته جدید'}

+
+ + + + + {current?.image && } +
+ } + {notice &&

{notice}

} + {(error || categories.isError) &&

{error || apiErrorMessage(categories.error)}

} + +
{['مسیر دسته', 'محصول', 'زیردسته', 'ترتیب نمایش', 'ترتیب اکسل', 'عملیات'].map(label => )} + {rows.filter(item => categoryLabel(item, rows).includes(search)).map(item => )} +
{label}
{categoryLabel(item, rows)}{item.product_count ?? 0}{item.child_count ?? 0}{item.order_cat ?? '—'}{item.excel_order ?? 'نمایش'}
{categories.isLoading ?

در حال دریافت دسته‌ها…

: !rows.length && !categories.isError ?

هنوز دسته‌ای ساخته نشده است.

: null}
+
+} diff --git a/src/app/(index)/products/components/product-form.tsx b/src/app/(index)/products/components/product-form.tsx new file mode 100644 index 0000000..ab0ca60 --- /dev/null +++ b/src/app/(index)/products/components/product-form.tsx @@ -0,0 +1,45 @@ +'use client' + +import { FormEvent, useState } from 'react' +import { Product, Category, saveProduct, integerInput, categoryLabel } from '@/lib/catalog' +import { apiErrorMessage } from '@/lib/auth' + +export default function ProductForm({ product, categories, onSaved, onCancel }: { product?: Product; categories: Category[]; onSaved: () => void; onCancel: () => void }) { + const [error, setError] = useState(''), [busy, setBusy] = useState(false) + async function submit(event: FormEvent) { + event.preventDefault() + setBusy(true); setError('') + const data = new FormData(event.currentTarget) + try { + let attr = null + const raw = String(data.get('attr') || '').trim() + if (raw) { + try { attr = JSON.parse(raw) } catch { throw new Error('ویژگی‌ها باید JSON معتبر باشد.') } + if (!attr || typeof attr !== 'object' || Array.isArray(attr)) throw new Error('ویژگی‌ها باید یک شیء JSON باشد.') + } + const order = integerInput(String(data.get('order_prd')), 'ترتیب نمایش', true) + const excelOrder = integerInput(String(data.get('excel_order')), 'ترتیب اکسل', true) + await saveProduct({ name: String(data.get('name')).trim(), price: integerInput(String(data.get('price')), 'قیمت', false, '9223372036854775807')!, + category: Number(data.get('category')), acc_code: String(data.get('acc_code') || '').trim(), attr, + view_only: data.get('view_only') === 'on', order_prd: order === null ? null : Number(order), excel_order: excelOrder === null ? null : Number(excelOrder) }, product?.id) + onSaved() + } catch (failure) { setError(apiErrorMessage(failure)) } + finally { setBusy(false) } + } + return
+

{product ? `ویرایش ${product.name}` : 'محصول جدید'}

+
+ + + + + + +