爬虫&逆向--Day22&Day23--核心实战案例【四川农机购置与补贴信息】【Webpack&国密SM3、SM4】

案例地址链接:http://202.61.89.161:12021/subsidyOpen

案例爬取链接:http://202.61.89.161:12021/api/api/loginSidePageEDE/getPurchaseOfAgriculturalMachinery

一、方式一:Webpack

1.1、入口定位

首先当我们开始编写爬虫操作的时候,我们先确定目标链接,然后复制url到【https://curlconverter.com/】生成基础的爬虫代码,复制链接生成基础爬虫代码  有个时间的限制,刚生成的基础爬虫代码是可以拿到数据的,但是当时间过期后,就拿不到数据了。

然后在观察目标的url那些是加密,方便我们后续进行解密操作

image

 经过观察,响应--需要解密,请求---需要加密,请求头--需要加密

所以我们习惯性的先破解----响应解密

在之前的学习中,我们定位入口有很多种方式,比如:方法关键字【decrypt   encrypt  】、key关键字、headers关键字、路径关键字、interceptors 拦截器关键字、请求堆栈、地址关键字等等。

因为习惯性的有相应解密,我们优先进行做响应解密,所以我们通过搜索decrypt(,进行搜索定位

因为是做解密所以首先想到的是decrypt(,搜索结果是6个,不管是不是先把断点打上  确定解密的入口

image

1.2、代码分析

做解密就是做解密,先不要管加密

image

 通过查看代码得知,u(e)就是解密函数,o是不是一个固定值不知道,我们可以通过多次切换页码确定每次卡在该处时,得到的o是不是一样的,如果是一样的那么o就是一个固定值,经过确定o是一个固定值

o = "30062AFC48C0E7B5B0918851C0445A37"

所以把这个u函数直接拷贝到本地去执行

1.3、扣JS

所以把这个u(e) 函数直接拷贝到本地去执行

看到这里就会联想到,可以使用webpack和sm4两种方式可以进行操作

在l= 这个地方加和上面加都一样,然后去找加载器函数n     在l= 这里加,刷新页面  让卡在此处

image

1.4、补充依赖【】

当我们把u() 函数扣走以后,在断点处,打上断点,获取测试数据

image

image

image

image

image

 __webpack_require__  其实就是模板中的n

moduleId  其实就是 r

installedModules 其实就是t

就是格式还是webpack的格式就是编写变得负责了,所以我们看到是加载器函数,直接吧整个文件拷贝走

image

 直接吧加载器函数全部拷贝走【Ctrl+A   Ctrl+C】 然后进行下面的操作

1、在本地创建一个loader.js文件,【Ctrl+v】存放刚才拷贝的代码

2、添加全局window  和打印的log日志  

  添加全局window , 使用;  或者! 进行分割   代码:window = global; 

  添加日志log

image

 代码处理如下:

执行一下是缺少一个window   写一下window放在最上面   window = global   给下面的自执行函数,做一个分割,加一个;或者加一个!

看完匿名函数,下面有属性赋值,就可以在这里添加全局写入  window.loader = __webpack_require__

image

 运行代码,只要不报错,证明加载器函数处理完成。

image

 然后在最初的JS文件中,进行引用该加载器函数,并且调用,不出意外就会报某个模块找不到

【然后运行,就会报:模块找不到,这个时候就全局搜索webpack中的模块】

image

image

从window的这个属性中去拿数据,所以我们需要全局搜索这个8060这个模块,最好是加一个:   搜索8060:

找到以后直接拷贝,放到mod01中

image

image

 以上就完成了响应解密的数据,下面我们就需要进行请求加密了

往上看,请求加密就在上面,打上断点,刷新一下页面就是这里   不会无缘无故的在一起的

做响应解密的时候,其实跟加密距离,离的很近

直接把encrypt这个d方法直接拷贝走

l 已经有了

image

image

以上是把响应解密和请求加密都处理完了,下面就需要处理请求头中的三个参数了 Sign  Source  Timestamp

当我们把加密和解密都替换完成以后,如果不处理headers中的三个参数,是依然不能直接获取到数据

或者,重新生成一个基础爬虫代码,这个时候正常是可以拿到加密的响应数据的,然后在挨个把headers中的三个字段注释掉,看看这三个字段是不是必填项,

我们也可以通过key关键字,优先搜索Source    \bsource\b  打开 正则中的边界 

可以判断source这三个字段都在一起,其他都没在一起,所以其他都不是

image

方式一:通过扣JS代码,补充环境以来进行获取请求头中的三个字段

image

所以正常既然p()是获取这三个请求头的函数,那么就把p()函数直接扣走,缺什么补什么

image

 报h找不到,我们就把上面的h扣走

image

报a找不到, 网上找发现a和webpack有关系,所以可以拿过来直接用   var a = n("53ca")

image

 又报r找不到,往上找r函数直接扣走

image

 报s找不到,往上找发现也是和webpack有关系,因为本地有了webpack环境,所以直接扣走  var s = n("8060").sm3;

image

方式二:通过上层调用的,获悉得到还是webpack,直接通过已经存在的webpack直接得到即可

image

image

image

require("./05 mod02")    // 引入模块文件   引入文件执行文件,即可完成

image

1.5、代码文件

1.5.1、Python文件:01 butie.py

import requests
import execjs
import json

js_compile = execjs.compile(open("02 butie.js", encoding="utf-8").read())

headers = {
    'Accept': 'application/json, text/plain, */*',
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'Connection': 'keep-alive',
    'Content-Type': 'application/json;charset=UTF-8',
    'Origin': 'http://202.61.89.161:12021',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36',
    'sign': 'd221aad291969e853e13fbaf26e6ba371b0707c41e2471fc62de03a90087ce550e657201a92abf9be4c3e13545c9197ac7028d07d049e38dc84c74dec54c12e5ba532c7c82c95484140e5a9ffbe7ae48',
    'source': 'ZRCSL7V0JIRK1PHY',
    'timestamp': 'b3ce7631c4857f64e7004b47932e9692',
    'urlprefix': '',
}

# 把断点定位l.encrypt(e, o);  获取e的值,作为查询参数
# 这个data是Python中的字典,可以理解为是查询参数  有关键作用的就是pageNum  pageSize和我们的批量获取数据有关系
data = {"applyType": 1,
        "year": 2025,
        "buyerName": "",
        "code": "",
        "areaCode": "",
        "status": "",
        "distributor": "",
        "enterpriseId": "",
        "factoryNumber": "",
        "machineCode": "",
        "purchaseDateStart": "",
        "purchaseDateEnd": "",
        "pageNum": 3,
        "pageSize": 15}


# (1) 生成parameter   加密的时候传进去的需要是一个json字符串  所以需要把python中的字典转化成为json字符串
parameter = js_compile.call("d", json.dumps(data))


data = {
    "parameter": parameter
}

# (2) 生成header值  传进入的需要是一个parameter对象
ret = js_compile.call("get_sign", data)
print("ret:::", ret)
# ret 中的键值对是否在headers 中存在,如果存在就更新一下对应的value 如果没有就把ret中的键值对全部插进去
headers.update(ret)

json_data = {
    'parameter': '41a69732cb266f361a31837c0916648bb8291635c087e530d1a25683d1160ee6265dcefe370b55d7e6ac9aca916fd2136f93e8f4248b1bda1f084d3d281ef4c558c2386e83cbef7944b0cd502dac9fd4ded0caf3a0cb7f2a9dd1907d1e576b5d33b825d1dcfce86ad6f94db52e8f3603d3bd888641a2889ea2fdc6b66ce28a36fd06b8dab3ce2b23a291932e42192719ce2c68f7dff16888924b7c383b33663c74c74a194438fc847eed16c0e16a3667954f332d0418d865537f467f329fe9a1bb98f9d3d4bcb55c384304a8a62bba72f7e663f5b8c725b71304213cab17de23',
}
url = 'http://202.61.89.161:12021/api/api/loginSidePageEDE/getPurchaseOfAgriculturalMachinery'

response = requests.post(url=url, headers=headers, json=data, verify=False, )
print(response.text)

# (3) 响应解密
data = js_compile.call("u", response.json().get("data"))
print(data)

 

1.5.2、JS文件:02 butie.js

require("./03 loader")   // 引入加载器函数
require("./04 mod01")    // 引入模块文件
require("./05 mod02")    // 引入模块文件
n = window.loader        // 给加载器赋值
var l = n("8060").sm4;   // 调用加载器的某个模块

function u(e) {
    var t = l.decrypt(e, "30062AFC48C0E7B5B0918851C0445A37");
    return t
}

// 响应解密测试
//data_1 = 'd7eb7831e3a2a0868562b28f00307c657a150b09f17ee85620d60d445cd76af0348b9106b859d78a0f7a887f86041ad12042dc18a313a7c2361133bb8274b83b185c8037c624ff6394c4695721a83a296e0d675689bc7ea15301c13a1486428dc8ab52f3ed95998fc72d44a0b0eb6ba016656c78f317f52383dd5a257181bdbf14c9ca472055e3ea5d1306ec1f6f5d80c254a073474f33cdfbf48c651b025070d6f715acd9135785410f616dfb0ea74346b028b2aa6c742e67d1f7eb3828f8675d57c83097ae68553e9317faba910898c34ee079a8a87e0216130c7713721f80d0e9b21942d9328d846aeec24f30d9cf71f430577119a904dfdb5c8de4f23780a74f4476356c0ccf74eeb72ee35e35455ed27bf99d052a0dc46d259b507fb25168048d32ffd8305a60d204dd1c67f95a37939f08801d0ab44d24542fa4e7a6e3a51952013a24904ba54fc9750adbd99942a49cffc967d401c81843c7e99b973953fb1cf90214b9c084927432428d5638a73b13ed0aea451f55c88d074f3c89a9d6308c509889e745cec13e20acb6a7b78ca6d4d581a43f5fc1af0fe14ba167ce0e6e47a2ff44a1e1b53c52b9686b7e27501aa51fdb0b4ba464dc2a379e3859f227f84fa346b5a937da8f25fceec28b7080c57ef7bf775c621f4c73d11c07f065eeffcce4dc1f760062f056b1397872a4691355fb3e27c4db8b1981ed57a628653915789d80990d5eb5089549c4f9d2f82c760bfcc5084a65cf29d731e7e0815445b7f1847c24120fbb3bf3783e127343a809185b64d19e9cb7ddba53e46dfcb494a48881d78a441715e217726e68a92ff87bc53737f9968de5d0caca931c6c2dc4db94be82f182eade97707b2f3237ef9f29c2f6fc2d766b09e98de82f1f37e73c5b15bfc2183bd6f7a45238b27993c27bc8d3329c9691d7bdbfdb7ddd3f4a6996a3c17cdc635af9dd149833039f0171af4101d1de894d33fa604ddf303cdd553d9467de941ece044d9202479acd9a5e78c563654c89444232c2b1e2567ca860db1fb0cb7fe881b8addcf8e75980cc4ba229712290f629b661d34b3bf00ee7325ba784493a94b70fe591749dcbbfb5bfac88afd193d245ec0de97838816883c53bbece4305c71221aec60ee83a34ed28d6f715acd9135785410f616dfb0ea743d41d71261d9cb97bbff9171c5d13190b7bb19c9dd4228e2ebd521f8de660fff8fea2c9b198e7e7c8c0b1355ec2d21bb299a63ca89ab093eca160afb7b401a41da1ee34fca31e52c8705b268956aee314d3dece72f93b1f34daaac95bc9d3d4383f14649eeb87fd1c2b05fead609c002bcfa00f5d8cbb9900a069f3a24aa56d6dfc7bfe19e71175b810d5def35d9a714580b6647a0f0656108d708038ac9a8eb211ee17015d994f20342a6f30aff90ed60934526e00a5e2c308d1bc5f51dc4ab360eca94d35e08c90e3b6e9912425360e7d0b735da3ed071e19aa87babfb6720c0272ea483b5cdb0284ec9f9a69d5bbfb0a6b52c6bbc0e3e09b22db0744d677bae716788da3abbf09de81d5d95c02da277a7ef11247db15222e8b05f59f509ec407b3765d78b558ba5374c6b584fb40e425d4b7992805f5ee6fbd0cf481f34ef2e674e08e3355a4ad939afab23dab24188fada5776de38ab1beeab78285a19a4cc296f7b0bddc409d8e3b50d5616dc95347c797e59bf5fc8f0d7f4d778ee9b49191a8c9e6c2413db8837f548d44b9d81d37e6f03da2450358c9f6a69e37b7e95491a94a0c3a08cf082a714ae1bc0fbe429352ea97c9e1bc46170f1bd64bc895f8d6ecd6579543b6f68ea3d5c2bb4e646654b63efe20d1f2cd76bea3c50ebf40174584ddee241bc280b7ec2cd5b4f8371582edcff3f1646d7af04f3665298f6e3b342e98bf34098824da1bb6a7a194d430dbf283170b42caf01edbae97d0b2fe81947e953a7a465efec74eb61baa5182bdba57f02aa5bea761bf07b8ecc174122bd9dbc02987879c4577d90f529683a537a075dcc69317b3eacc210c1e2a679d95a72f7f49e2993d796cc8ff4a487004c0ea3b3f8e60818dc5a934ca3976636e1403b5fc352c513a1b749ef14770cb1f31c2ccf8718657953b716ea20411c3a3217842f14c431f04c9fb44691f84fe0694f65f0949853f9d73b011581a20b33925ac3e75412025be32e35dc18270ba979e15adb475452fb0fae267ab96a92f467c8af2a9416c29137f78e2d6f33cad002cad94de768c682f7759309beec9f8ef458b3ac56411131530887fda43f06537a6c177f022619224955b87bad075c84699fc3db9e9471a16f14cd85aa264ff89166988b101fdb5750ba6084729e8968a84c55dc9a0fd4700642f6f4d1b5f39a923a3db7aefad88bfaf075113d830e9a74afc278a634cb89d1d12ea280a8e632beb42ef17f11ee7348d6713e77d8fe84897682a60877e0983424726e618f0eba344a8204d6bf8fd14eb3b8f1f785dc6df56c4fee9d06306668c5ad8da43f0f06d1a1e39110e96170c8bcc34c68da174a8f7363858d3dd9c66e88021d5941f21dcd71e1cadc20d3f8461c3016ec83040748a2cfba11e2ba84678a66112fe8c84e0b96fc8ffc3d4e0f9db102a3bd09f15babe7cf0aef4fbece25ba7facb266eec73d03aa26527b6aab86d5d0927aaf48086ea45f38d0af29175f6e3a5139a79516a8d0fb5f2c4269761fbccbf6668f0029f77a3fc3fd1bda1f666473ceddc2cb1ecf2ad04340cffbe0618d6f3bae0f54428d1a6c42abada1bc929e3450f223748cd909dbf0fdff812c46a95a66c0846c933bdbf668ce5f80d41aeb03efcc7d15f6f72dfa795c71777db6c1378cb0c33b52ef22f5ab47e302e09723223bf374e06847ed0d344918a8a77d5c8682e6128bce96c50e79ef2a1613e75399549f1d4e3b3ed5b741f0282cfce675fb51bbe68292278d5977292c231e4df1467b4d907db6ea8c0d410f35f5d9657e971f10cfa4458024ae1076c4187e0def1cfd6f3ed1a6dafdca6043f908ce8c74314173a1595545b7203eda1244e235227412f41244a5466a0e78c71b9829cfb151a375c5a44e4ce3d90cf5659439c746aa04ac2f2bb98507f7394cbddc0697ffe0a31ec6a535c9811bc092b708e0b0af94c289b9456d3390073f88f5f7bc258632855f4b84ccbc4f7718f9f1abe2600d68368b990c8ddcedec04c95e0bb4546319280d5e770891e42e8f4b4803fe5f98c3e9e59dbe17fc64d832330059b7ecad36665bbf08c4135b62a4b0dfcfe32cbe697b5ce9f252bb53d64a28c0da5c805a9ad545b7b62ef5f154d8c15f457138b92d7bf7a2ce7d22340692db3b4e702dd243ee00d085127add3dc19195af7f2d262889725b3f7d3f0ed2138d7874d1e44d4b3a5767d0ecff579ef7d188b31c6ae5293bc872b674aced75540e62e69f7dec31d467dddb772313b59889f06a7ef4cc1682582f375dc2ce3479fdaf620b142344ff7ad7d0bf18704aee7ada14733a17bda8d5323cabeba98ca7d157149721471503b6000bde2328bf1bb109d8f47fc6a0e66e2b6b4f66687d79694628be1a7b1f1d281c3b5b28d80c57ef7bf775c621f4c73d11c07f065eeffcce4dc1f760062f056b1397872a4691355fb3e27c4db8b1981ed57a628653915789d80990d5eb5089549c4f9d2f82c760bfcc5084a65cf29d731e7e0815445b7f1847c24120fbb3bf3783e12734343e162daabeb7d17df1f3b17d376813394a48881d78a441715e217726e68a92fe8633a50c5dc82cf997842b19b2bd5c8c4db94be82f182eade97707b2f3237ef9f29c2f6fc2d766b09e98de82f1f37e73c5b15bfc2183bd6f7a45238b27993c27bc8d3329c9691d7bdbfdb7ddd3f4a698c8bd82c2bca08c98e795e7038004f63055f25ec8d7223964eab697cc38b3f773d9467de941ece044d9202479acd9a5e4d44e863f36b73924963d41cd5bda1cd85db9e722494b7db95ad89fb8a1667fd9e3f2d19f58fbaddf99c9c5d1ae975da47c40fda78ae3c3b0b3d8240539302805b732ccbef14bce915ffc3d5a29c9a7cc2ccf8718657953b716ea20411c3a321e605e3f3bcf232bc56f37feec43f8ce3f65f0949853f9d73b011581a20b33925ac3e75412025be32e35dc18270ba979e15adb475452fb0fae267ab96a92f467c8af2a9416c29137f78e2d6f33cad002cad94de768c682f7759309beec9f8ef458b3ac56411131530887fda43f06537a6bb7193a56719709f7b9eb8213b19c493f66e84edb28578dc1b1906cf4ff2ee7ccfa00f5d8cbb9900a069f3a24aa56d6d09a5c49bbcdfeaf83d59d260f861c26a2be9d546179d159837250ce7e77e38ff72afb7cbed3aa1db6b0d1707fcfad373c82c54fa7349ec8815c4b225c331aa3cdcdbd393f0e0de678839742f8da909c442a49cffc967d401c81843c7e99b9739045f1266c009fcae0c87840836fc56b52ea0d66bc29e6cfda3f165aa88803cbc1e7c24fd117d4bd5c6a703bf49b40ef1422b13161cdb04a82baa4a8a1f9e03f795532a443252f9985b2e096a1d7817d1614461b52e969c0fe386306c6d90491eaaec47997799e51845e273a5294444a9f7f73b865b7c97f273fd0a2d3378048a4336d696c23a9db7eb3ffb35cd7c4e4627b9d0fa27fdc644169882a35b0829c4a9ea1087aa285008faa33aaf67a4c42bccb7d65d4ee349127e805a363843e951d4f56959453451208f1a46309fc4b0b894a48881d78a441715e217726e68a92fe8633a50c5dc82cf997842b19b2bd5c8c4db94be82f182eade97707b2f3237ef9f29c2f6fc2d766b09e98de82f1f37e73c5b15bfc2183bd6f7a45238b27993c27bc8d3329c9691d7bdbfdb7ddd3f4a692fdb7a30a8d04a77b0487efe77b91208055f25ec8d7223964eab697cc38b3f773d9467de941ece044d9202479acd9a5e4d44e863f36b73924963d41cd5bda1cd72498f77b76758ec579c96ee3db5363ced2138d7874d1e44d4b3a5767d0ecff53d585991dca793a9816588a9540b2c9e5932bf67e8b23d1157c1ea0f28c2f7f30f3d77e9475e5d42147036b79f15e26f44327eb899ee15ff8ec102f08e3720e8854ca95ee2faaed67ef0c925258ebe82ab929d3e597757cb6694bfa310ce7143a85582d91b9d6d4af007cb3cd2879d0b935ade8d05a6e3651bdd227541e5ed149edb8d104b2a134e590a72997940b34ae7847e3db938d6bd9cf0abbd5832e2c130086343032f54001b89b34d0f734a1e68d13371bd6c5d6484d518366f7e901e95f69de7c1ca95aca2374909371e90162a14e7a2a0090ee5a1453a776701a76e72afb7cbed3aa1db6b0d1707fcfad3737f5bdd93ce144615791bc06922b89697873638c964f69ae455ecc2ca837051ed0dbe82442a20e935af9bcab9dece90c367cdec2b63fa60c64dc70bfc8e772e8fc081ca0aa8b54c9b9c1f57970eb5aa5f938c7c0b2e11e082d28a3a46628ea2eb0ea9d23bed4548c7c41d520603f6724ba4f9286c5f88616871fa111ef1807ee3e8500db72c570ad7269a5bf8c0cf89952dc8813f6efc5e91ddef20ac7a067a7f9ea912d9120799ee9669c604cdfd9409d1d8c71f54308805302bac272a2758c298be41a52dc4da65c970a0d97f07a64bda4d98bf1ca7ababe1fa940cc155d4f144fa6ad7e799f6e22ae9530f312cabf14aee36a8f32f02167c869dc24dcc85c07b1713278d583ace2c0c7427229a46dd0039faf0f15888777435716fb866bc59d42cf5a56da6907aaf33a7491dd4e5ecd04aa17595b8034a0a64203e848ebe735058282050b552adf2dc144e8c51b0eea81781e5f3456a6cbd246e3df8f6b97a1964bebb2172f4676b7ff974513576c4af00c8c7d73f94cb1d8c3d53ee7aacf16306c2a077cbb023bbd0cf33d11df46d898b7c45259f83341829347657b4afc06c5c64082bf2c332a7d70a7d4da241043b5abc1158ccf6127629c52e7ffac422e30926caa53c7d2510e96964bd393370b0fbaeede7480de1c9ee6fff41fa16b86c4e73780210a88e866f1e86f7e2131073122fba34e6fc638cc689296f0cf8215e7c380826090dbfbb7ec567e458effd970a8abc2830f98f18b7cb04adff138dcc51e3efbee911df1055d38ee32303bd1843320dc8b0bb98092757054728afaddc823b8c5df24bef51989a4129529548672672428a97b210e1762e482462b84d86e31ca12102794767aaab0763e1ee6dcbc2d13530525f864e0f948de576a9ce7de71f57a6ae56a8465d9f72251f7ab145354dfd9537f8604f347870d5937b261577fb2688bcb2b041c28309fc0ab8bb07c5a754589319364be173c4f4c82431040898ab10a49ae940f401a09bf1640cc03ed9957f32ffb0be4d82f39e8f40345cca8a1315212353637c43a9b6bc039c6e6a61287f46b5136e2aecc36795ec184c0ef456063ecfc3950bac59535e71dd5e888e1d11539726e4f7ecb0a50452a57bab9ab6c58bf9aef877ce7404e8dc5741d1058d3e57cb6e2c60fe58422782808f378b92a8bb3fcefd4811cdcd0b11b5a2c93c6fd69f1c196578e93ced87b724f843d2c2452499425d6ea62b3fa8d426c088a050411b68942cccbaefde61723adf2798031b77f17989aef2ba873b7db8d18c1383b6db0d614bac90aa05e13c4a6bd793bbb61cde4314da3b48dc19e3fae9d406ef40285b4441632a21d5bc9c06a78f4657a22eb13f267b1b1c038f259c70ef3bb72489811cc7d96330f7bbc73db0e125f508b899f8746f83fc0ff344db3bc6761615a85d7400e63cddb367230e8bba6a356e80a67a6fe663c3e9244504f1ca6ed928ad07cc21fcbf94b7afa0f8566f1f010d1c7dda5b8f19f8a4ad4908bbfadfc95afa09a91bfd0806e5c354615da3b61a7ff21ae44ac477fc0b650717915c778f03f26efec57a81b7e75fc53103b5fc352c513a1b749ef14770cb1f31c2ccf8718657953b716ea20411c3a3213466bc5b3286e4fc98b75309e7e945705ca3601ddffe369ff2f2a2c3fda7f139bd7aaa9d898ca9c54c5fb0dd152a14e2518034c1a8da2d76c193bf02a70a30fe5a49221cd837478643eee798a15de15012ed97766bc34d242c7a26e5e4949f39301ed3e3ba7f538da3ce2670e98a0734bc2f83717ec26d22dff5082678ef9a04675993bd05af9f6a5116fcf3e49a35517ede362dea3b024933b6f20d8499f0b1a8495f5fae1fee223eea7d31f9f6a3814c5798c906631f2fc693fcde08dd975045354dfd9537f8604f347870d5937b264685077f256fa5baf9cd5f9fd54f2c0cd944b32617cbf5239358daac9a6fd45d7d0b735da3ed071e19aa87babfb6720c0272ea483b5cdb0284ec9f9a69d5bbfb0a6b52c6bbc0e3e09b22db0744d677bae716788da3abbf09de81d5d95c02da277a7ef11247db15222e8b05f59f509ec4c371b44042beb4dc55b5dbc777401fcd20b96ff0e981bebc4828ebecc20446f4fa228f1771b9e4d68057147b56e919ea6082eb610bf37400f18364a1ffe9307f0dcf99e1f35acfa44083a4207e02f3dfb8e7a73c5559ec3e6d0bc4e0ea328c8bc3dbda047b47743bae7fce6e1678e84aeb93b9fc5cdad9490e55dbe47e87c56e9b7d9be5d9ab4ee8b28681320896cba3cb5ea7e4a160371c19ef3e8d5fadb0048e330988b10f466d59368d04aca5ad8d75a7a2437d7e990696f9b7dc4cd90fe91b9bea304d9b9e7b5b575b98435549c2d849e5c2b8b14bba8f0971aedb9ebc4873efbec6f5d6d1ce6c7ba9105ae86ebce42110995cd23758bf5c34403733bbeb82233abedbd89bec77619d6e3cb0fe167460e0e21121413bb7005b2b40629a6bc66d833285d080c4ac5d24dd5a2fd0e9a8ffc6d634509a58e92a5baa7da7f17a9012093971a2af6ceb4bbfb44b851545ccd3d37f7eeba9976bb809017376fd0fdb818eafa446ca081e822ae1e376495b488f72d3fb8b7e271afff0b2f2ee9ab5fba149515a15300524f9abf53399cea29e735f6dc84109550d1c4f208632b4f1db0699acf1930e7eb154609cd06df1b33b172cbb5b0eac98823bc767e21049b136266651442ad863c2cc4b342220ca3a6c5ace4656ad33e86b5a7f377b44c770de6e2769607d11c1f01657acd53211c6f6ad1a2257b8b4f50a2e8577eedb1ab909f5745d1d1e337e5b32a0f43ff30001c521249a7e9b4c1547fc4f534e3560af73b3b6ad6e3844723f25bdb42b8d3196640b56a38688968aa984b6d2701083466ad0e482dc08892019a3cfc7f8b4e22179bf3e11d6609e5a1da8e0e1ea48b50dd3bd888641a2889ea2fdc6b66ce28a36466d3cc9661da08183958e5427d7bfda5b06b60571a8c278d6bf485450fbba84c4fee9d06306668c5ad8da43f0f06d1a1e39110e96170c8bcc34c68da174a8f7363858d3dd9c66e88021d5941f21dcd71e1cadc20d3f8461c3016ec83040748a190381d78889152c24fde1650a25cc6834a66a1ec554399bacf05a9f267ee4cb6665420aa6e9c2f7c0a60e67c3f878d045042a0ba5b1f0859edaa536696dfab3d038e484dc52725aa5897d38d652db4e5691d680033d19f350961ee1bd8e7f369212ad5a9550ec73eefe4a0be226c1099c7e48db7cb4e6e48428a626fcad258c4b69c9d07a963b3b4e9e037db43ce2d70052cedc3abaf41acfd3a47493a25b5bf4e753333b7469ca5f1e806a0a826f14bde8ae27445a651f75254679619d7d115a487636f58fb425cd213e1ac87fe6ee88d4e8b72fa7b9f3d9badd0c0ac954b495cb45a19fc654ace40fae4eed768ed9f7987a35ff46f5ca6a04b92510c0c704d66b1de65b998ffbe3a385f7b0e2887bf6b650821d475d73e606ffb8058ef94ce20344e3aff806c449447020aa82f2d9fe8abd00c7b2d3af7b6396f33b088a77cf67a915714fefd721523445fb4716634fd08eaf8faca12215c8113048e00c5d30b9763c4a06a26f8ca7a0c603fd743ac0fa86945dc3cefcb5c9338065dfd2bc736249627b4ddd5f3ff18c39c2cafddc67212e1a8b43901fbc8363e1aae1c3962f7400ff349ff1205e4ea9746f9ba424ced15adee14c60e08e644f77802028f0f7dc2e003d256f78420067acc74c5150f2c57ab7d7df2b90fa665eeb1a5215c9a0f726eb0a797358bcee2d3425af67353c4a82a4c382105f9160a45dbe5945900ce6740913722e23003bb3b8d78386507241320dec04ab17fcadcec6170f5b3d1044f24f3bb11a196bb5138dd04cf585d3bd888641a2889ea2fdc6b66ce28a363921d225183fd75f9a830f930f5cecfa64f6f2e073d2b34e7784ac1dc353c5fa8735566d3b34124bad7854fa0a40b2de1664e3e41c3913888d623bc854e58685d27f72967e7e93fde139ba2e58c72381ec8d35e9cbb26171499605441870bc5c112b82eb8376a13fafff92e16eedb3addea7a81806ab1df54e9eabc026482b2733b2820b4707ca2108d6ada48ad5efc9c296f7b0bddc409d8e3b50d5616dc95347c797e59bf5fc8f0d7f4d778ee9b49191a8c9e6c2413db8837f548d44b9d81d37e6f03da2450358c9f6a69e37b7e95491a94a0c3a08cf082a714ae1bc0fbe42acfbb93d4ea6d4057c2306ba0e3dd099635699155e65717b3571b21ecb3ace1bebba31fa99bdd0728b9b133541d38d3925d142100a4a601c3f150738db5934c2e9da8384928685895c34fa7eeb9160da85268d3ac6fc9e444d860948521e7736bde8ae27445a651f75254679619d7d11c0ebe4119e47e3769d446894e9ee8c3bd4279962e441cadbd75a9817e1b62bc0c8328ac740973bce3b59a3f22cbe4971d2f94717b78d984ebe650d56da0e9c932a9d3e9722704e8d18dbf520f6b2b7a56ab5b2372189ff5baa1e007b78438747b0931d3b1465cd8fdf756cdcaff20fce684e8c4063b053125b404205ac060e1584e55f18e36e5798ac5ec60c8fa712003873f120663c1b4995363605800e4dd25188eb05a52709bcab0d288be439b08cf2de9d25393091153841ca08f17e905238b9f0d9cf3fe87af04f5ec7f90ce5da2d27c3f8aeeecf81b943b06f42f8aeac0704ec0db5af9a2404d0f9a66aff5ac0abe22902d4d15f8433ac361a3cc48033bbbf3ae1ca4ffffccd027fb9ffa963125a2f0c20bf0a02341361ba39845933795bcf974ee4105eda4c7bf49c28f361643848ff1fd44b86e26cfa8decb55a4f93713bb64e064ad1b4d9ed9cb346104697954c8aae1c05cf130755e92a0eec5a51c6bab6f0c49eedfbc98348a6fbf181cf39e5b0281e1a707fc14cf23ccdd3b9b5e3f5a3a569db4a328c19dc36c3a97d97a7e7b14943444dd0614d1dc977258c5115e75fc4005c3c5f6ad0a4ec0a410fd0ec8d35e9cbb26171499605441870bc5c112b82eb8376a13fafff92e16eedb3adfba2267f3a1a411bf62ad00ddab1949180c57ef7bf775c621f4c73d11c07f065eeffcce4dc1f760062f056b1397872a4691355fb3e27c4db8b1981ed57a628653915789d80990d5eb5089549c4f9d2f82c760bfcc5084a65cf29d731e7e0815445b7f1847c24120fbb3bf3783e127343a809185b64d19e9cb7ddba53e46dfcb494a48881d78a441715e217726e68a92fa7f5d21193fdeda227a9fb79c4fd4598c4db94be82f182eade97707b2f3237ef9f29c2f6fc2d766b09e98de82f1f37e73c5b15bfc2183bd6f7a45238b27993c27bc8d3329c9691d7bdbfdb7ddd3f4a6982af074da9690ec666f257801fa2468fc474f112880b307d9c44400ea5768c02dbdf3da9104002ec059d4c1ea9908cdb532d80ce332f1bfb77b0ec11716d97d2e888bd43e644eb779ca4abf1f3dfa9df11478171e59df5eee71387ba1b19b39bf0044dcd3df59dc0b225b3dbf19bcbfc4a8bf0c65aab0f207164164770b8948e208c1b8c767d07fd7093cf9eb511b9f5d146ad1a1924e5fc11819b547756bb6e2558efba4ecbc91dd9df8f506d0187f474b7ebb34e2a307683a535a7d2759ba77ec35fd6ebf69f6f3dcc4042b4b222140fafc1d252f8b2e7054d64325e030010e44653996159c75abcc658ee8639f01a72019915428c967ca13f492eaf6b79367c6fff8eb2747e6a194bb354d8b180ab154d8c15f457138b92d7bf7a2ce7d22340692db3b4e702dd243ee00d085127adf0d0cc57a3c7aef3e515d3d4f5e7aebeed2138d7874d1e44d4b3a5767d0ecff579ef7d188b31c6ae5293bc872b674aced82946c69daf05aaba656401e82f77ac31e4a711cfbc4d53052145419d63664a8735566d3b34124bad7854fa0a40b2de97423cb0aa8aaede6ab012f344b91d994fae9069bf746e220067dcaa7f49241ea0b5e62659fc145d55c39dc50a1d8470d89687a419f8a9c4e2a4c610917f85cba662b8a2659786f5dbbc42fc19413c1c2a32bef62955b7238e081283547dcd8d4dd1c887ec66e6d8c9f467c6f10a9857f6e60cf67adbc5754be73cb2d91d55942977ae66a30dc3b22030e32c45a17668eaf7dfab49b22678897a96eb37aec6f8ec0370775c1c629df83289f00a85330f66d1737f731ab3a6f5c8ee8f8151ad25b81a5e11fcd1fce0b2a16b9aa96be5da265bb1352f383fb235b37baff944fdc2ce4794a27610bc536f95eb13f1d5fdf00a710b3151b61b052e42283f71352893245afa22cdeec807bf0efece9ab828ebfead2a365d30d8d14c69a5ce07523d51578d86d942495ab3ea81230f228b09d1baba20da3267871fc82402a658fc491a7e2ae599e200f7d3706e4c25bb67af900d6061574f60610acaa991a5d2de35185b34d2dfdfff32a72f2989f57167c872b78f7a207557d0478225150863fb123fa85c44ceacab72841e33719d6fbd40e13299642a99aea81e87f796e1d6b41505647c8e1b72f9e1856ae4238f7c9519c14e95b5e1884724666447853428eefaf042c188b77fccd72eb44edee060d836ffc9e8bf4e95d5f6fd2c2b9cd852f2ede486c6faabd8fab2a29bc3ce13d0bae89515b5bd64cc670461fdb5f946780c26c7813ace8e4b162806be11430d9b113ccdba4926968efbc0ebf608a8ea5bd162060962d82e1fa4672871157a694690b8288b6dcbdc6a083d60a3f68aaeda130258dae54d60ffe8c9bc59c81e458269e6bc72afb7cbed3aa1db6b0d1707fcfad37394bee374bdaad0fd7aa84bbb67285184ed22bcec2e19bf9713db1b3cc0a2c38be3f5a3a569db4a328c19dc36c3a97d97bdaec852158064c6634ba577cacb913b92fb784a51f731bf66cc4f75b159eb47ed61c88c6740dfcc100814d45e1bbc8256e00c3b9e96bc86d3d2d761f71b30c9519e47e1109edaa6f2097c84ff58279ee237b9e8781d0b6c0e8bbd65b90af9648472289f8e2742ab6d511b219dfa5cb200718208a48c5626f161e3c210bea15842d3dd2bb42e20180ad9d571db79237f994d3b3bdf075a74e3d5ef77ff5659780a16c59ccc928c963766ab4c2819aadbf407325ce3c38728a2518bf6c9152da8302bda284c38c846ea65a49c9b5896ecbedf57ae54ba78ef15662bef1d254075f541a08569e761ab7f6ec915d9799aa5f7c70067706d8ac0d7e5865d341635c2e3d896a03a645f0b718249c1eee0fa0c273f0fd60f04548054df716a6acd227495695c19e237bb693e838f9c7b1f3c5d0401d86ecaf5d8a5df5fedc0a01c165dd0276e3be465f8455a126d47685effca7ba822ccf89b3ea6fd8a5a45fe8fd2d2b516383c7125456682094d4d62b001d003b5fc352c513a1b749ef14770cb1f31c2ccf8718657953b716ea20411c3a32110e217106d6895486d9849c16479b52bf65f0949853f9d73b011581a20b3392540c0e4a916e14fc64c52dfa6a8c8fe7c7d7595113d93cc682c099176f53dc4168af2a9416c29137f78e2d6f33cad002cad94de768c682f7759309beec9f8ef458b3ac56411131530887fda43f06537a6331c3a61e0261948cbaecd445bb30f73f66e84edb28578dc1b1906cf4ff2ee7ccfa00f5d8cbb9900a069f3a24aa56d6dd8fc66254c72d88218bf32779424e8b440f4cdf1cf4cd0e40efdc0d55cf1e43326cddce71a8f002cba203ec58650e200121968c7dd95874c3b274600093e15641f0601192d88bb491a87bae596092b81d9f7af1af4fdaeb650708bbe20db7b489174970ab554f1eb7005be0a30b28f135f809c3d3ad7882bd0f2c407b6e4eb082a6ca18a7fafc38d1ecdcf3dd8dddeaa6e6a61287f46b5136e2aecc36795ec184c0ef456063ecfc3950bac59535e71dde3efdb1f075b86914c6f4084cedcd7fe1a9c6777f7046a846e01eb967baf9ee3ef4c99023b91e812b2f7e53e949695a3c088a050411b68942cccbaefde61723a8e91241ac5c64cecdf2caa472d63966c4dd20389eb4788699f33e2300b26f3ef5363c5773e93a5c3569363b139f4d0b5d27ac7dc173e036610532378a8e26d8594a48881d78a441715e217726e68a92f660617d238dffafd46db4a589cc2a9dec4db94be82f182eade97707b2f3237ef9f29c2f6fc2d766b09e98de82f1f37e73c5b15bfc2183bd6f7a45238b27993c27bc8d3329c9691d7bdbfdb7ddd3f4a692fdb7a30a8d04a77b0487efe77b91208b61f77241fb866ae1355f716229f552c3d9467de941ece044d9202479acd9a5e5995fb2fb94f4a2f7d81ea32c3a31d813d933e4b9e2c69c499f1d77349ece09299d17998288306105038fd97ebddbb6612471ccb6c700b8e975f23438d99e1135932bf67e8b23d1157c1ea0f28c2f7f34f616911bf8739406dd7a2fede00b53644327eb899ee15ff8ec102f08e3720e8854ca95ee2faaed67ef0c925258ebe82ab929d3e597757cb6694bfa310ce7143a85582d91b9d6d4af007cb3cd2879d0b935ade8d05a6e3651bdd227541e5ed149edb8d104b2a134e590a72997940b34afc42c5e63eb2e880844add5d9916f48030086343032f54001b89b34d0f734a1e68d13371bd6c5d6484d518366f7e901eb3ec9ab9cdbe52d03ae17b1a532fa9465bd65808f6985f19eb8a7b31300827ac72afb7cbed3aa1db6b0d1707fcfad3731f6e4708fe97878d5f540d64dee7afb159b1cb3cdda9f2c9341b74fccec90bc20bda53f77cbed7263214ba709b621a3165332148f866eed5315fa27d5607e667c3b7f95433e8275824e931bee61fc8744fae9069bf746e220067dcaa7f49241ea0b5e62659fc145d55c39dc50a1d8470ca97f6c6929bbcf31ff8c30b36766688c49d79968de1ca3661a14d54896a7892d23a108af06caa989e842240bd19353b24e7c89e30b00eacf7182505397c3f238186a0bcceefec1c28b891bb0b5666c2f7773e8114c0f83d7be9a8d1dccf19bedbadc89430d650930e3012d20cdc95262bb5b250a37537444fa93b406b59c257ba77fe6a39e2d32579ed4f1eaacca9e2deada9bf44d82c357aa8820041f1d9c2099d7aba906c454f4bbdc1b2e1f5896fed5c234c229814f9a31a7957f334f25b0a42fb3902bd4e51e75eead0fa96323be3d896a03a645f0b718249c1eee0fa0c3d579d489e51533f13ed458ef07a6c1de8f5573af220a806a7ef87fe32a877aaa589e66204501c667ecfd7f9f42d1eb9f7dba3bb3f97f7eadd85ce05124426cf263192e0cd72480b46b1310b986809302f628eb674c14fdfa51cb81cd859ee8d'
//console.log(u(data_1))

// 请求加密测试
function d(e) {
    var t = l.encrypt(e, "30062AFC48C0E7B5B0918851C0445A37");
    return t
}

// 外面改成 ' '  里面不能改成单引号,里面改成单引号,就不是json字符串了
// data_2 = '{"applyType":1,"year":2025,"buyerName":"","code":"","areaCode":"","status":"","distributor":"","enterpriseId":"","factoryNumber":"","machineCode":"","purchaseDateStart":"","purchaseDateEnd":"","pageNum":2,"pageSize":15}'
// console.log(d(data_2))


// 方式一
// function r(e) {
//     var t = s(e);
//     return t
// }
//
// function h(e) {
//     var t = JSON.parse(e)
//         , n = Object.keys(t).sort()
//         , i = n.map((function (e) {
//             var n = t[e];
//             if (n) {
//                 var i = ""
//                     , c = encodeURIComponent(e);
//                 return i = "object" === Object(a["a"])(n) ? JSON.stringify(n) : n,
//                     "".concat(c, "=").concat(i)
//             }
//         }
//     ));
//     i = i.filter((function (e) {
//             return void 0 !== e && null !== e && "" !== e
//         }
//     ));
//     var c = i.join("&");
//     return c
// }
//
// function p(e) {
//     var t, n = Date.now();
//     return e ? (e = JSON.parse(u(e.parameter)),
//         e.timestamp = n,
//         e = JSON.stringify(e),
//         t = h(e),
//         t += "&key=HD7232D2AAAKA@978D8723H211?IER&6",
//         {
//             sign: d(r(t).toLocaleUpperCase()),
//             timestamp: d(n.toString()),
//             source: "ZRCSL7V0JIRK1PHY"
//         }) : (e = e || {},
//         e.timestamp = n,
//         e = JSON.stringify(e),
//         t = h(e),
//         t += "&key=HD7232D2AAAKA@978D8723H211?IER&6",
//         {
//             sign: d(r(t).toLocaleUpperCase()),
//             timestamp: d(n.toString()),
//             source: "ZRCSL7V0JIRK1PHY"
//         })
// }
//
//
// var a = n("53ca")
// var s = n("8060").sm3;
//
// dict = {
//     "parameter": "41a69732cb266f361a31837c0916648bb8291635c087e530d1a25683d1160ee6265dcefe370b55d7e6ac9aca916fd2136f93e8f4248b1bda1f084d3d281ef4c558c2386e83cbef7944b0cd502dac9fd4ded0caf3a0cb7f2a9dd1907d1e576b5d33b825d1dcfce86ad6f94db52e8f3603d3bd888641a2889ea2fdc6b66ce28a36fd06b8dab3ce2b23a291932e42192719ce2c68f7dff16888924b7c383b33663c74c74a194438fc847eed16c0e16a3667954f332d0418d865537f467f329fe9a1bb98f9d3d4bcb55c384304a8a62bba72f7e663f5b8c725b71304213cab17de23"
// }
// console.log(p(dict))


// 方式二

//r = a("dd88")    // 其实a这个加载器函数,就是n加载器函数,所以这里我们可以直接替换,把a替换成n
r = n("dd88")
function get_sign(data){
    return r["c"](data)
}

dict = {
    "parameter": "41a69732cb266f361a31837c0916648bb8291635c087e530d1a25683d1160ee6265dcefe370b55d7e6ac9aca916fd2136f93e8f4248b1bda1f084d3d281ef4c558c2386e83cbef7944b0cd502dac9fd4ded0caf3a0cb7f2a9dd1907d1e576b5d33b825d1dcfce86ad6f94db52e8f3603d3bd888641a2889ea2fdc6b66ce28a36fd06b8dab3ce2b23a291932e42192719ce2c68f7dff16888924b7c383b33663c74c74a194438fc847eed16c0e16a3667954f332d0418d865537f467f329fe9a1bb98f9d3d4bcb55c384304a8a62bba72f7e663f5b8c725b71304213cab17de23"
}
console.log(get_sign(dict)) 

1.5.3、加载器函数文件:03 loader.js

window = global;
/******/
(function (modules) { // webpackBootstrap
    /******/     // install a JSONP callback for chunk loading
    /******/
    function webpackJsonpCallback(data) {
        /******/
        var chunkIds = data[0];
        /******/
        var moreModules = data[1];
        /******/
        var executeModules = data[2];
        /******/
        /******/         // add "moreModules" to the modules object,
        /******/         // then flag all "chunkIds" as loaded and fire callback
        /******/
        var moduleId, chunkId, i = 0, resolves = [];
        /******/
        for (; i < chunkIds.length; i++) {
            /******/
            chunkId = chunkIds[i];
            /******/
            if (Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {
                /******/
                resolves.push(installedChunks[chunkId][0]);
                /******/
            }
            /******/
            installedChunks[chunkId] = 0;
            /******/
        }
        /******/
        for (moduleId in moreModules) {
            /******/
            if (Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {
                /******/
                modules[moduleId] = moreModules[moduleId];
                /******/
            }
            /******/
        }
        /******/
        if (parentJsonpFunction) parentJsonpFunction(data);
        /******/
        /******/
        while (resolves.length) {
            /******/
            resolves.shift()();
            /******/
        }
        /******/
        /******/         // add entry modules from loaded chunk to deferred list
        /******/
        deferredModules.push.apply(deferredModules, executeModules || []);
        /******/
        /******/         // run deferred modules when all chunks ready
        /******/
        return checkDeferredModules();
        /******/
    };

    /******/
    function checkDeferredModules() {
        /******/
        var result;
        /******/
        for (var i = 0; i < deferredModules.length; i++) {
            /******/
            var deferredModule = deferredModules[i];
            /******/
            var fulfilled = true;
            /******/
            for (var j = 1; j < deferredModule.length; j++) {
                /******/
                var depId = deferredModule[j];
                /******/
                if (installedChunks[depId] !== 0) fulfilled = false;
                /******/
            }
            /******/
            if (fulfilled) {
                /******/
                deferredModules.splice(i--, 1);
                /******/
                result = __webpack_require__(__webpack_require__.s = deferredModule[0]);
                /******/
            }
            /******/
        }
        /******/
        /******/
        return result;
        /******/
    }

    /******/
    /******/     // The module cache
    /******/
    var installedModules = {};
    /******/
    /******/     // object to store loaded CSS chunks
    /******/
    var installedCssChunks = {
        /******/        "runtime": 0
        /******/
    }
    /******/
    /******/     // object to store loaded and loading chunks
    /******/     // undefined = chunk not loaded, null = chunk preloaded/prefetched
    /******/     // Promise = chunk loading, 0 = chunk loaded
    /******/
    var installedChunks = {
        /******/        "runtime": 0
        /******/
    };
    /******/
    /******/
    var deferredModules = [];
    /******/
    /******/     // script path function
    /******/
    function jsonpScriptSrc(chunkId) {
        /******/
        return __webpack_require__.p + "static/js/" + ({"chunk-commons": "chunk-commons"}[chunkId] || chunkId) + ".1756979604601.js"
        /******/
    }

    /******/
    /******/     // The require function
    /******/
    function __webpack_require__(moduleId) {
        /******/
        /******/         // Check if module is in cache
        /******/
        if (installedModules[moduleId]) {
            /******/
            return installedModules[moduleId].exports;
            /******/
        }
        /******/         // Create a new module (and put it into the cache)
        /******/
        var module = installedModules[moduleId] = {
            /******/            i: moduleId,
            /******/            l: false,
            /******/            exports: {}
            /******/
        };
        /******/
        /******/         // Execute the module function
        /******/
        console.log("moduleId:::",moduleId)
        modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
        /******/
        /******/         // Flag the module as loaded
        /******/
        module.l = true;
        /******/
        /******/         // Return the exports of the module
        /******/
        return module.exports;
        /******/
    }

    // 在n.x调用地方上面添加全局写入
    window.loader = __webpack_require__
    /******/
    /******/     // This file contains only the entry chunk.
    /******/     // The chunk loading function for additional chunks
    /******/
    __webpack_require__.e = function requireEnsure(chunkId) {
        /******/
        var promises = [];
        /******/
        /******/
        /******/         // mini-css-extract-plugin CSS loading
        /******/
        var cssChunks = {
            "chunk-0410c6c2": 1,
            "chunk-04b1b81e": 1,
            "chunk-05730c00": 1,
            "chunk-06499ea2": 1,
            "chunk-0824f430": 1,
            "chunk-08931d38": 1,
            "chunk-08ab38e9": 1,
            "chunk-107f74cf": 1,
            "chunk-15e37911": 1,
            "chunk-1c5a62f8": 1,
            "chunk-27846cfd": 1,
            "chunk-27dfdc30": 1,
            "chunk-2cfb5722": 1,
            "chunk-3d698df2": 1,
            "chunk-3db54e1b": 1,
            "chunk-3ec1a7ac": 1,
            "chunk-43ed7581": 1,
            "chunk-46f2cf5c": 1,
            "chunk-4a5d46ab": 1,
            "chunk-4a7dd5f8": 1,
            "chunk-4ac72130": 1,
            "chunk-527b5b68": 1,
            "chunk-5b4064c8": 1,
            "chunk-5d45c80d": 1,
            "chunk-5e3b521a": 1,
            "chunk-5e79866f": 1,
            "chunk-61f63e18": 1,
            "chunk-6360f155": 1,
            "chunk-066b348c": 1,
            "chunk-27e8e01c": 1,
            "chunk-3750bee2": 1,
            "chunk-8f4dc4aa": 1,
            "chunk-682187c6": 1,
            "chunk-7f6b0704": 1,
            "chunk-89ec4984": 1,
            "chunk-8b3b4e52": 1,
            "chunk-964d256a": 1,
            "chunk-c4bd4688": 1,
            "chunk-c97aa72c": 1,
            "chunk-commons": 1,
            "chunk-1bb66f90": 1,
            "chunk-1c00b55a": 1,
            "chunk-20128ad3": 1,
            "chunk-7451c552": 1,
            "chunk-76a01ace": 1,
            "chunk-28616ac4": 1,
            "chunk-372c06ac": 1,
            "chunk-3786ed54": 1,
            "chunk-39c38942": 1,
            "chunk-50cbaac2": 1,
            "chunk-5b97d370": 1,
            "chunk-60ea7b5c": 1,
            "chunk-fbc0b0d8": 1,
            "chunk-6f12c018": 1,
            "chunk-779e4db2": 1,
            "chunk-8976820c": 1,
            "chunk-a5c87456": 1,
            "chunk-a6e70c4c": 1,
            "chunk-da140868": 1,
            "chunk-dd18e64e": 1,
            "chunk-fb18a074": 1,
            "chunk-d231e390": 1,
            "chunk-e5185d9e": 1,
            "chunk-e71883e2": 1,
            "chunk-e5fd2e94": 1,
            "chunk-f6cf1b7c": 1,
            "chunk-7a54b226": 1,
            "chunk-7b85f110": 1,
            "chunk-b0cc02b0": 1,
            "chunk-506f50b3": 1,
            "chunk-572dca7f": 1,
            "chunk-674dad47": 1,
            "chunk-6060a80a": 1,
            "chunk-124eca28": 1,
            "chunk-541a3e60": 1
        };
        /******/
        if (installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);
        /******/ else if (installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {
            /******/
            promises.push(installedCssChunks[chunkId] = new Promise(function (resolve, reject) {
                /******/
                var href = "static/css/" + ({"chunk-commons": "chunk-commons"}[chunkId] || chunkId) + "." + {
                    "chunk-0410c6c2": "69ed4fa3",
                    "chunk-04b1b81e": "d3526481",
                    "chunk-05730c00": "8b856d52",
                    "chunk-06499ea2": "875762d8",
                    "chunk-0824f430": "570a7df1",
                    "chunk-08931d38": "fe1b82f5",
                    "chunk-08ab38e9": "88e1625d",
                    "chunk-107f74cf": "9d38cd51",
                    "chunk-15e37911": "c8e9871f",
                    "chunk-18c71056": "31d6cfe0",
                    "chunk-1c5a62f8": "2b54d8ce",
                    "chunk-27846cfd": "f488da1d",
                    "chunk-27dfdc30": "0b997858",
                    "chunk-2d0e2366": "31d6cfe0",
                    "chunk-2cfb5722": "d5476a86",
                    "chunk-2d0f012d": "31d6cfe0",
                    "chunk-3d698df2": "20c0a1f4",
                    "chunk-3db54e1b": "0a123e60",
                    "chunk-3ec1a7ac": "a5debf3c",
                    "chunk-43ed7581": "a6e27419",
                    "chunk-46f2cf5c": "36e4c802",
                    "chunk-4a5d46ab": "36ab1ac7",
                    "chunk-4a7dd5f8": "c53cec24",
                    "chunk-4ac72130": "6ea275e8",
                    "chunk-527b5b68": "c263e085",
                    "chunk-5b4064c8": "8620acbe",
                    "chunk-5d45c80d": "5a7368a5",
                    "chunk-5e3b521a": "68a17f5f",
                    "chunk-5e79866f": "541e9572",
                    "chunk-61f63e18": "a472e94c",
                    "chunk-6360f155": "ffb299cf",
                    "chunk-6e83591c": "31d6cfe0",
                    "chunk-30d719b2": "31d6cfe0",
                    "chunk-066b348c": "a5f46f15",
                    "chunk-27e8e01c": "9d07d199",
                    "chunk-3750bee2": "357c81e8",
                    "chunk-8f4dc4aa": "a3ab62b7",
                    "chunk-4a7d8e89": "31d6cfe0",
                    "chunk-682187c6": "8708c1ba",
                    "chunk-79bf461c": "31d6cfe0",
                    "chunk-7f6b0704": "d3e59927",
                    "chunk-89ec4984": "60cd9f52",
                    "chunk-8b3b4e52": "2a02122f",
                    "chunk-964d256a": "27a4eade",
                    "chunk-c4bd4688": "70c6b038",
                    "chunk-c97aa72c": "3fe4c3d6",
                    "chunk-commons": "52a787b7",
                    "chunk-06b9fab6": "31d6cfe0",
                    "chunk-1bb66f90": "f2861f98",
                    "chunk-1c00b55a": "fa508ab6",
                    "chunk-20128ad3": "eefe138e",
                    "chunk-7451c552": "ec96be4d",
                    "chunk-76a01ace": "1fb5b8c5",
                    "chunk-251dc971": "31d6cfe0",
                    "chunk-28616ac4": "20d72c51",
                    "chunk-372c06ac": "0c2327f5",
                    "chunk-3786ed54": "6283c141",
                    "chunk-39c38942": "10c097c3",
                    "chunk-50cbaac2": "9bee359a",
                    "chunk-5b97d370": "22d1ed98",
                    "chunk-60ea7b5c": "286da6c1",
                    "chunk-ea685e08": "31d6cfe0",
                    "chunk-fbc0b0d8": "218a01da",
                    "chunk-6f12c018": "a2662a70",
                    "chunk-779e4db2": "9e507e43",
                    "chunk-8976820c": "d4543304",
                    "chunk-a5c87456": "b8fe3420",
                    "chunk-a6e70c4c": "5ded6d05",
                    "chunk-da140868": "e42a6c73",
                    "chunk-dd18e64e": "9ef4d3a9",
                    "chunk-fb18a074": "5179188e",
                    "chunk-d19c1a98": "31d6cfe0",
                    "chunk-d231e390": "de49af64",
                    "chunk-d9bf117c": "31d6cfe0",
                    "chunk-e5185d9e": "2e844b6f",
                    "chunk-e71883e2": "14c9d422",
                    "chunk-cf7ab578": "31d6cfe0",
                    "chunk-e5fd2e94": "0de2f057",
                    "chunk-f6cf1b7c": "095aa4ab",
                    "chunk-7a54b226": "d0290e0a",
                    "chunk-7b85f110": "730c5c6b",
                    "chunk-b0cc02b0": "c56ccf50",
                    "chunk-506f50b3": "6c17efcd",
                    "chunk-38a7de8a": "31d6cfe0",
                    "chunk-572dca7f": "9184a723",
                    "chunk-674dad47": "bd4bc23c",
                    "chunk-6060a80a": "88ee9c29",
                    "chunk-124eca28": "bd4bc23c",
                    "chunk-541a3e60": "9184a723"
                }[chunkId] + ".css";
                /******/
                var fullhref = __webpack_require__.p + href;
                /******/
                var existingLinkTags = document.getElementsByTagName("link");
                /******/
                for (var i = 0; i < existingLinkTags.length; i++) {
                    /******/
                    var tag = existingLinkTags[i];
                    /******/
                    var dataHref = tag.getAttribute("data-href") || tag.getAttribute("href");
                    /******/
                    if (tag.rel === "stylesheet" && (dataHref === href || dataHref === fullhref)) return resolve();
                    /******/
                }
                /******/
                var existingStyleTags = document.getElementsByTagName("style");
                /******/
                for (var i = 0; i < existingStyleTags.length; i++) {
                    /******/
                    var tag = existingStyleTags[i];
                    /******/
                    var dataHref = tag.getAttribute("data-href");
                    /******/
                    if (dataHref === href || dataHref === fullhref) return resolve();
                    /******/
                }
                /******/
                var linkTag = document.createElement("link");
                /******/
                linkTag.rel = "stylesheet";
                /******/
                linkTag.type = "text/css";
                /******/
                linkTag.onload = resolve;
                /******/
                linkTag.onerror = function (event) {
                    /******/
                    var request = event && event.target && event.target.src || fullhref;
                    /******/
                    var err = new Error("Loading CSS chunk " + chunkId + " failed.\n(" + request + ")");
                    /******/
                    err.code = "CSS_CHUNK_LOAD_FAILED";
                    /******/
                    err.request = request;
                    /******/
                    delete installedCssChunks[chunkId]
                    /******/
                    linkTag.parentNode.removeChild(linkTag)
                    /******/
                    reject(err);
                    /******/
                };
                /******/
                linkTag.href = fullhref;
                /******/
                /******/
                var head = document.getElementsByTagName("head")[0];
                /******/
                head.appendChild(linkTag);
                /******/
            }).then(function () {
                /******/
                installedCssChunks[chunkId] = 0;
                /******/
            }));
            /******/
        }
        /******/
        /******/         // JSONP chunk loading for javascript
        /******/
        /******/
        var installedChunkData = installedChunks[chunkId];
        /******/
        if (installedChunkData !== 0) { // 0 means "already installed".
            /******/
            /******/             // a Promise means "currently loading".
            /******/
            if (installedChunkData) {
                /******/
                promises.push(installedChunkData[2]);
                /******/
            } else {
                /******/                 // setup Promise in chunk cache
                /******/
                var promise = new Promise(function (resolve, reject) {
                    /******/
                    installedChunkData = installedChunks[chunkId] = [resolve, reject];
                    /******/
                });
                /******/
                promises.push(installedChunkData[2] = promise);
                /******/
                /******/                 // start chunk loading
                /******/
                var script = document.createElement('script');
                /******/
                var onScriptComplete;
                /******/
                /******/
                script.charset = 'utf-8';
                /******/
                script.timeout = 120;
                /******/
                if (__webpack_require__.nc) {
                    /******/
                    script.setAttribute("nonce", __webpack_require__.nc);
                    /******/
                }
                /******/
                script.src = jsonpScriptSrc(chunkId);
                /******/
                /******/                 // create error before stack unwound to get useful stacktrace later
                /******/
                var error = new Error();
                /******/
                onScriptComplete = function (event) {
                    /******/                     // avoid mem leaks in IE.
                    /******/
                    script.onerror = script.onload = null;
                    /******/
                    clearTimeout(timeout);
                    /******/
                    var chunk = installedChunks[chunkId];
                    /******/
                    if (chunk !== 0) {
                        /******/
                        if (chunk) {
                            /******/
                            var errorType = event && (event.type === 'load' ? 'missing' : event.type);
                            /******/
                            var realSrc = event && event.target && event.target.src;
                            /******/
                            error.message = 'Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')';
                            /******/
                            error.name = 'ChunkLoadError';
                            /******/
                            error.type = errorType;
                            /******/
                            error.request = realSrc;
                            /******/
                            chunk[1](error);
                            /******/
                        }
                        /******/
                        installedChunks[chunkId] = undefined;
                        /******/
                    }
                    /******/
                };
                /******/
                var timeout = setTimeout(function () {
                    /******/
                    onScriptComplete({type: 'timeout', target: script});
                    /******/
                }, 120000);
                /******/
                script.onerror = script.onload = onScriptComplete;
                /******/
                document.head.appendChild(script);
                /******/
            }
            /******/
        }
        /******/
        return Promise.all(promises);
        /******/
    };
    /******/
    /******/     // expose the modules object (__webpack_modules__)
    /******/
    __webpack_require__.m = modules;
    /******/
    /******/     // expose the module cache
    /******/
    __webpack_require__.c = installedModules;
    /******/
    /******/     // define getter function for harmony exports
    /******/
    __webpack_require__.d = function (exports, name, getter) {
        /******/
        if (!__webpack_require__.o(exports, name)) {
            /******/
            Object.defineProperty(exports, name, {enumerable: true, get: getter});
            /******/
        }
        /******/
    };
    /******/
    /******/     // define __esModule on exports
    /******/
    __webpack_require__.r = function (exports) {
        /******/
        if (typeof Symbol !== 'undefined' && Symbol.toStringTag) {
            /******/
            Object.defineProperty(exports, Symbol.toStringTag, {value: 'Module'});
            /******/
        }
        /******/
        Object.defineProperty(exports, '__esModule', {value: true});
        /******/
    };
    /******/
    /******/     // create a fake namespace object
    /******/     // mode & 1: value is a module id, require it
    /******/     // mode & 2: merge all properties of value into the ns
    /******/     // mode & 4: return value when already ns object
    /******/     // mode & 8|1: behave like require
    /******/
    __webpack_require__.t = function (value, mode) {
        /******/
        if (mode & 1) value = __webpack_require__(value);
        /******/
        if (mode & 8) return value;
        /******/
        if ((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
        /******/
        var ns = Object.create(null);
        /******/
        __webpack_require__.r(ns);
        /******/
        Object.defineProperty(ns, 'default', {enumerable: true, value: value});
        /******/
        if (mode & 2 && typeof value != 'string') for (var key in value) __webpack_require__.d(ns, key, function (key) {
            return value[key];
        }.bind(null, key));
        /******/
        return ns;
        /******/
    };
    /******/
    /******/     // getDefaultExport function for compatibility with non-harmony modules
    /******/
    __webpack_require__.n = function (module) {
        /******/
        var getter = module && module.__esModule ?
            /******/            function getDefault() {
                return module['default'];
            } :
            /******/            function getModuleExports() {
                return module;
            };
        /******/
        __webpack_require__.d(getter, 'a', getter);
        /******/
        return getter;
        /******/
    };
    /******/
    /******/     // Object.prototype.hasOwnProperty.call
    /******/
    __webpack_require__.o = function (object, property) {
        return Object.prototype.hasOwnProperty.call(object, property);
    };
    /******/
    /******/     // __webpack_public_path__
    /******/
    __webpack_require__.p = "/";
    /******/
    /******/     // on error function for async loading
    /******/
    __webpack_require__.oe = function (err) {
        console.error(err);
        throw err;
    };
    /******/
    /******/
    var jsonpArray = window["webpackJsonp"] = window["webpackJsonp"] || [];
    /******/
    var oldJsonpFunction = jsonpArray.push.bind(jsonpArray);
    /******/
    jsonpArray.push = webpackJsonpCallback;
    /******/
    jsonpArray = jsonpArray.slice();
    /******/
    for (var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);
    /******/
    var parentJsonpFunction = oldJsonpFunction;
    /******/
    /******/
    /******/     // run deferred modules from other chunks
    /******/
    checkDeferredModules();
    /******/
})
    /************************************************************************/
    /******/ ([]);

 

1.5.4、模块文件:04 mod01.js

image

1.5.5、模块文件:05 mod02.js

image

二、方式二:国密SM3、SM4

const sm = require("sm-crypto")   // npm install sm-crypto  执行这个进行导包

image

 由上图的代码: var l = n("8060").sm4;  我们应该首选SM4国密算法,如果不认识或者不知道,那就按照正常的操作webpack,如果知道是SM4,那么最好还是使用国密算法

如果想调用这个SM4或者SM3就不一定必须使用代码中的 n("8060") 这个webpack对象了,可以直接 导包调用,如果不知道可以直接使用deepseek查询

imageimage

image

2.1、代码文件02 butie.js

const sm = require("sm-crypto")   // npm install sm-crypto  执行这个进行导包
var l = sm.sm4;   // 调用加载器的某个模块

function u(e) {
    var t = l.decrypt(e, "30062AFC48C0E7B5B0918851C0445A37");
    return t
}

//响应解密测试
// data_1 = 'd7eb7831e3a2a0868562b28f00307c657a150b09f17ee85620d60d445cd76af0348b9106b859d78a0f7a887f86041ad12042dc18a313a7c2361133bb8274b83b185c8037c624ff6394c4695721a83a296e0d675689bc7ea15301c13a1486428dc8ab52f3ed95998fc72d44a0b0eb6ba016656c78f317f52383dd5a257181bdbf14c9ca472055e3ea5d1306ec1f6f5d80c254a073474f33cdfbf48c651b025070d6f715acd9135785410f616dfb0ea74346b028b2aa6c742e67d1f7eb3828f8675d57c83097ae68553e9317faba910898c34ee079a8a87e0216130c7713721f80d0e9b21942d9328d846aeec24f30d9cf71f430577119a904dfdb5c8de4f23780a74f4476356c0ccf74eeb72ee35e35455ed27bf99d052a0dc46d259b507fb25168048d32ffd8305a60d204dd1c67f95a37939f08801d0ab44d24542fa4e7a6e3a51952013a24904ba54fc9750adbd99942a49cffc967d401c81843c7e99b973953fb1cf90214b9c084927432428d5638a73b13ed0aea451f55c88d074f3c89a9d6308c509889e745cec13e20acb6a7b78ca6d4d581a43f5fc1af0fe14ba167ce0e6e47a2ff44a1e1b53c52b9686b7e27501aa51fdb0b4ba464dc2a379e3859f227f84fa346b5a937da8f25fceec28b7080c57ef7bf775c621f4c73d11c07f065eeffcce4dc1f760062f056b1397872a4691355fb3e27c4db8b1981ed57a628653915789d80990d5eb5089549c4f9d2f82c760bfcc5084a65cf29d731e7e0815445b7f1847c24120fbb3bf3783e127343a809185b64d19e9cb7ddba53e46dfcb494a48881d78a441715e217726e68a92ff87bc53737f9968de5d0caca931c6c2dc4db94be82f182eade97707b2f3237ef9f29c2f6fc2d766b09e98de82f1f37e73c5b15bfc2183bd6f7a45238b27993c27bc8d3329c9691d7bdbfdb7ddd3f4a6996a3c17cdc635af9dd149833039f0171af4101d1de894d33fa604ddf303cdd553d9467de941ece044d9202479acd9a5e78c563654c89444232c2b1e2567ca860db1fb0cb7fe881b8addcf8e75980cc4ba229712290f629b661d34b3bf00ee7325ba784493a94b70fe591749dcbbfb5bfac88afd193d245ec0de97838816883c53bbece4305c71221aec60ee83a34ed28d6f715acd9135785410f616dfb0ea743d41d71261d9cb97bbff9171c5d13190b7bb19c9dd4228e2ebd521f8de660fff8fea2c9b198e7e7c8c0b1355ec2d21bb299a63ca89ab093eca160afb7b401a41da1ee34fca31e52c8705b268956aee314d3dece72f93b1f34daaac95bc9d3d4383f14649eeb87fd1c2b05fead609c002bcfa00f5d8cbb9900a069f3a24aa56d6dfc7bfe19e71175b810d5def35d9a714580b6647a0f0656108d708038ac9a8eb211ee17015d994f20342a6f30aff90ed60934526e00a5e2c308d1bc5f51dc4ab360eca94d35e08c90e3b6e9912425360e7d0b735da3ed071e19aa87babfb6720c0272ea483b5cdb0284ec9f9a69d5bbfb0a6b52c6bbc0e3e09b22db0744d677bae716788da3abbf09de81d5d95c02da277a7ef11247db15222e8b05f59f509ec407b3765d78b558ba5374c6b584fb40e425d4b7992805f5ee6fbd0cf481f34ef2e674e08e3355a4ad939afab23dab24188fada5776de38ab1beeab78285a19a4cc296f7b0bddc409d8e3b50d5616dc95347c797e59bf5fc8f0d7f4d778ee9b49191a8c9e6c2413db8837f548d44b9d81d37e6f03da2450358c9f6a69e37b7e95491a94a0c3a08cf082a714ae1bc0fbe429352ea97c9e1bc46170f1bd64bc895f8d6ecd6579543b6f68ea3d5c2bb4e646654b63efe20d1f2cd76bea3c50ebf40174584ddee241bc280b7ec2cd5b4f8371582edcff3f1646d7af04f3665298f6e3b342e98bf34098824da1bb6a7a194d430dbf283170b42caf01edbae97d0b2fe81947e953a7a465efec74eb61baa5182bdba57f02aa5bea761bf07b8ecc174122bd9dbc02987879c4577d90f529683a537a075dcc69317b3eacc210c1e2a679d95a72f7f49e2993d796cc8ff4a487004c0ea3b3f8e60818dc5a934ca3976636e1403b5fc352c513a1b749ef14770cb1f31c2ccf8718657953b716ea20411c3a3217842f14c431f04c9fb44691f84fe0694f65f0949853f9d73b011581a20b33925ac3e75412025be32e35dc18270ba979e15adb475452fb0fae267ab96a92f467c8af2a9416c29137f78e2d6f33cad002cad94de768c682f7759309beec9f8ef458b3ac56411131530887fda43f06537a6c177f022619224955b87bad075c84699fc3db9e9471a16f14cd85aa264ff89166988b101fdb5750ba6084729e8968a84c55dc9a0fd4700642f6f4d1b5f39a923a3db7aefad88bfaf075113d830e9a74afc278a634cb89d1d12ea280a8e632beb42ef17f11ee7348d6713e77d8fe84897682a60877e0983424726e618f0eba344a8204d6bf8fd14eb3b8f1f785dc6df56c4fee9d06306668c5ad8da43f0f06d1a1e39110e96170c8bcc34c68da174a8f7363858d3dd9c66e88021d5941f21dcd71e1cadc20d3f8461c3016ec83040748a2cfba11e2ba84678a66112fe8c84e0b96fc8ffc3d4e0f9db102a3bd09f15babe7cf0aef4fbece25ba7facb266eec73d03aa26527b6aab86d5d0927aaf48086ea45f38d0af29175f6e3a5139a79516a8d0fb5f2c4269761fbccbf6668f0029f77a3fc3fd1bda1f666473ceddc2cb1ecf2ad04340cffbe0618d6f3bae0f54428d1a6c42abada1bc929e3450f223748cd909dbf0fdff812c46a95a66c0846c933bdbf668ce5f80d41aeb03efcc7d15f6f72dfa795c71777db6c1378cb0c33b52ef22f5ab47e302e09723223bf374e06847ed0d344918a8a77d5c8682e6128bce96c50e79ef2a1613e75399549f1d4e3b3ed5b741f0282cfce675fb51bbe68292278d5977292c231e4df1467b4d907db6ea8c0d410f35f5d9657e971f10cfa4458024ae1076c4187e0def1cfd6f3ed1a6dafdca6043f908ce8c74314173a1595545b7203eda1244e235227412f41244a5466a0e78c71b9829cfb151a375c5a44e4ce3d90cf5659439c746aa04ac2f2bb98507f7394cbddc0697ffe0a31ec6a535c9811bc092b708e0b0af94c289b9456d3390073f88f5f7bc258632855f4b84ccbc4f7718f9f1abe2600d68368b990c8ddcedec04c95e0bb4546319280d5e770891e42e8f4b4803fe5f98c3e9e59dbe17fc64d832330059b7ecad36665bbf08c4135b62a4b0dfcfe32cbe697b5ce9f252bb53d64a28c0da5c805a9ad545b7b62ef5f154d8c15f457138b92d7bf7a2ce7d22340692db3b4e702dd243ee00d085127add3dc19195af7f2d262889725b3f7d3f0ed2138d7874d1e44d4b3a5767d0ecff579ef7d188b31c6ae5293bc872b674aced75540e62e69f7dec31d467dddb772313b59889f06a7ef4cc1682582f375dc2ce3479fdaf620b142344ff7ad7d0bf18704aee7ada14733a17bda8d5323cabeba98ca7d157149721471503b6000bde2328bf1bb109d8f47fc6a0e66e2b6b4f66687d79694628be1a7b1f1d281c3b5b28d80c57ef7bf775c621f4c73d11c07f065eeffcce4dc1f760062f056b1397872a4691355fb3e27c4db8b1981ed57a628653915789d80990d5eb5089549c4f9d2f82c760bfcc5084a65cf29d731e7e0815445b7f1847c24120fbb3bf3783e12734343e162daabeb7d17df1f3b17d376813394a48881d78a441715e217726e68a92fe8633a50c5dc82cf997842b19b2bd5c8c4db94be82f182eade97707b2f3237ef9f29c2f6fc2d766b09e98de82f1f37e73c5b15bfc2183bd6f7a45238b27993c27bc8d3329c9691d7bdbfdb7ddd3f4a698c8bd82c2bca08c98e795e7038004f63055f25ec8d7223964eab697cc38b3f773d9467de941ece044d9202479acd9a5e4d44e863f36b73924963d41cd5bda1cd85db9e722494b7db95ad89fb8a1667fd9e3f2d19f58fbaddf99c9c5d1ae975da47c40fda78ae3c3b0b3d8240539302805b732ccbef14bce915ffc3d5a29c9a7cc2ccf8718657953b716ea20411c3a321e605e3f3bcf232bc56f37feec43f8ce3f65f0949853f9d73b011581a20b33925ac3e75412025be32e35dc18270ba979e15adb475452fb0fae267ab96a92f467c8af2a9416c29137f78e2d6f33cad002cad94de768c682f7759309beec9f8ef458b3ac56411131530887fda43f06537a6bb7193a56719709f7b9eb8213b19c493f66e84edb28578dc1b1906cf4ff2ee7ccfa00f5d8cbb9900a069f3a24aa56d6d09a5c49bbcdfeaf83d59d260f861c26a2be9d546179d159837250ce7e77e38ff72afb7cbed3aa1db6b0d1707fcfad373c82c54fa7349ec8815c4b225c331aa3cdcdbd393f0e0de678839742f8da909c442a49cffc967d401c81843c7e99b9739045f1266c009fcae0c87840836fc56b52ea0d66bc29e6cfda3f165aa88803cbc1e7c24fd117d4bd5c6a703bf49b40ef1422b13161cdb04a82baa4a8a1f9e03f795532a443252f9985b2e096a1d7817d1614461b52e969c0fe386306c6d90491eaaec47997799e51845e273a5294444a9f7f73b865b7c97f273fd0a2d3378048a4336d696c23a9db7eb3ffb35cd7c4e4627b9d0fa27fdc644169882a35b0829c4a9ea1087aa285008faa33aaf67a4c42bccb7d65d4ee349127e805a363843e951d4f56959453451208f1a46309fc4b0b894a48881d78a441715e217726e68a92fe8633a50c5dc82cf997842b19b2bd5c8c4db94be82f182eade97707b2f3237ef9f29c2f6fc2d766b09e98de82f1f37e73c5b15bfc2183bd6f7a45238b27993c27bc8d3329c9691d7bdbfdb7ddd3f4a692fdb7a30a8d04a77b0487efe77b91208055f25ec8d7223964eab697cc38b3f773d9467de941ece044d9202479acd9a5e4d44e863f36b73924963d41cd5bda1cd72498f77b76758ec579c96ee3db5363ced2138d7874d1e44d4b3a5767d0ecff53d585991dca793a9816588a9540b2c9e5932bf67e8b23d1157c1ea0f28c2f7f30f3d77e9475e5d42147036b79f15e26f44327eb899ee15ff8ec102f08e3720e8854ca95ee2faaed67ef0c925258ebe82ab929d3e597757cb6694bfa310ce7143a85582d91b9d6d4af007cb3cd2879d0b935ade8d05a6e3651bdd227541e5ed149edb8d104b2a134e590a72997940b34ae7847e3db938d6bd9cf0abbd5832e2c130086343032f54001b89b34d0f734a1e68d13371bd6c5d6484d518366f7e901e95f69de7c1ca95aca2374909371e90162a14e7a2a0090ee5a1453a776701a76e72afb7cbed3aa1db6b0d1707fcfad3737f5bdd93ce144615791bc06922b89697873638c964f69ae455ecc2ca837051ed0dbe82442a20e935af9bcab9dece90c367cdec2b63fa60c64dc70bfc8e772e8fc081ca0aa8b54c9b9c1f57970eb5aa5f938c7c0b2e11e082d28a3a46628ea2eb0ea9d23bed4548c7c41d520603f6724ba4f9286c5f88616871fa111ef1807ee3e8500db72c570ad7269a5bf8c0cf89952dc8813f6efc5e91ddef20ac7a067a7f9ea912d9120799ee9669c604cdfd9409d1d8c71f54308805302bac272a2758c298be41a52dc4da65c970a0d97f07a64bda4d98bf1ca7ababe1fa940cc155d4f144fa6ad7e799f6e22ae9530f312cabf14aee36a8f32f02167c869dc24dcc85c07b1713278d583ace2c0c7427229a46dd0039faf0f15888777435716fb866bc59d42cf5a56da6907aaf33a7491dd4e5ecd04aa17595b8034a0a64203e848ebe735058282050b552adf2dc144e8c51b0eea81781e5f3456a6cbd246e3df8f6b97a1964bebb2172f4676b7ff974513576c4af00c8c7d73f94cb1d8c3d53ee7aacf16306c2a077cbb023bbd0cf33d11df46d898b7c45259f83341829347657b4afc06c5c64082bf2c332a7d70a7d4da241043b5abc1158ccf6127629c52e7ffac422e30926caa53c7d2510e96964bd393370b0fbaeede7480de1c9ee6fff41fa16b86c4e73780210a88e866f1e86f7e2131073122fba34e6fc638cc689296f0cf8215e7c380826090dbfbb7ec567e458effd970a8abc2830f98f18b7cb04adff138dcc51e3efbee911df1055d38ee32303bd1843320dc8b0bb98092757054728afaddc823b8c5df24bef51989a4129529548672672428a97b210e1762e482462b84d86e31ca12102794767aaab0763e1ee6dcbc2d13530525f864e0f948de576a9ce7de71f57a6ae56a8465d9f72251f7ab145354dfd9537f8604f347870d5937b261577fb2688bcb2b041c28309fc0ab8bb07c5a754589319364be173c4f4c82431040898ab10a49ae940f401a09bf1640cc03ed9957f32ffb0be4d82f39e8f40345cca8a1315212353637c43a9b6bc039c6e6a61287f46b5136e2aecc36795ec184c0ef456063ecfc3950bac59535e71dd5e888e1d11539726e4f7ecb0a50452a57bab9ab6c58bf9aef877ce7404e8dc5741d1058d3e57cb6e2c60fe58422782808f378b92a8bb3fcefd4811cdcd0b11b5a2c93c6fd69f1c196578e93ced87b724f843d2c2452499425d6ea62b3fa8d426c088a050411b68942cccbaefde61723adf2798031b77f17989aef2ba873b7db8d18c1383b6db0d614bac90aa05e13c4a6bd793bbb61cde4314da3b48dc19e3fae9d406ef40285b4441632a21d5bc9c06a78f4657a22eb13f267b1b1c038f259c70ef3bb72489811cc7d96330f7bbc73db0e125f508b899f8746f83fc0ff344db3bc6761615a85d7400e63cddb367230e8bba6a356e80a67a6fe663c3e9244504f1ca6ed928ad07cc21fcbf94b7afa0f8566f1f010d1c7dda5b8f19f8a4ad4908bbfadfc95afa09a91bfd0806e5c354615da3b61a7ff21ae44ac477fc0b650717915c778f03f26efec57a81b7e75fc53103b5fc352c513a1b749ef14770cb1f31c2ccf8718657953b716ea20411c3a3213466bc5b3286e4fc98b75309e7e945705ca3601ddffe369ff2f2a2c3fda7f139bd7aaa9d898ca9c54c5fb0dd152a14e2518034c1a8da2d76c193bf02a70a30fe5a49221cd837478643eee798a15de15012ed97766bc34d242c7a26e5e4949f39301ed3e3ba7f538da3ce2670e98a0734bc2f83717ec26d22dff5082678ef9a04675993bd05af9f6a5116fcf3e49a35517ede362dea3b024933b6f20d8499f0b1a8495f5fae1fee223eea7d31f9f6a3814c5798c906631f2fc693fcde08dd975045354dfd9537f8604f347870d5937b264685077f256fa5baf9cd5f9fd54f2c0cd944b32617cbf5239358daac9a6fd45d7d0b735da3ed071e19aa87babfb6720c0272ea483b5cdb0284ec9f9a69d5bbfb0a6b52c6bbc0e3e09b22db0744d677bae716788da3abbf09de81d5d95c02da277a7ef11247db15222e8b05f59f509ec4c371b44042beb4dc55b5dbc777401fcd20b96ff0e981bebc4828ebecc20446f4fa228f1771b9e4d68057147b56e919ea6082eb610bf37400f18364a1ffe9307f0dcf99e1f35acfa44083a4207e02f3dfb8e7a73c5559ec3e6d0bc4e0ea328c8bc3dbda047b47743bae7fce6e1678e84aeb93b9fc5cdad9490e55dbe47e87c56e9b7d9be5d9ab4ee8b28681320896cba3cb5ea7e4a160371c19ef3e8d5fadb0048e330988b10f466d59368d04aca5ad8d75a7a2437d7e990696f9b7dc4cd90fe91b9bea304d9b9e7b5b575b98435549c2d849e5c2b8b14bba8f0971aedb9ebc4873efbec6f5d6d1ce6c7ba9105ae86ebce42110995cd23758bf5c34403733bbeb82233abedbd89bec77619d6e3cb0fe167460e0e21121413bb7005b2b40629a6bc66d833285d080c4ac5d24dd5a2fd0e9a8ffc6d634509a58e92a5baa7da7f17a9012093971a2af6ceb4bbfb44b851545ccd3d37f7eeba9976bb809017376fd0fdb818eafa446ca081e822ae1e376495b488f72d3fb8b7e271afff0b2f2ee9ab5fba149515a15300524f9abf53399cea29e735f6dc84109550d1c4f208632b4f1db0699acf1930e7eb154609cd06df1b33b172cbb5b0eac98823bc767e21049b136266651442ad863c2cc4b342220ca3a6c5ace4656ad33e86b5a7f377b44c770de6e2769607d11c1f01657acd53211c6f6ad1a2257b8b4f50a2e8577eedb1ab909f5745d1d1e337e5b32a0f43ff30001c521249a7e9b4c1547fc4f534e3560af73b3b6ad6e3844723f25bdb42b8d3196640b56a38688968aa984b6d2701083466ad0e482dc08892019a3cfc7f8b4e22179bf3e11d6609e5a1da8e0e1ea48b50dd3bd888641a2889ea2fdc6b66ce28a36466d3cc9661da08183958e5427d7bfda5b06b60571a8c278d6bf485450fbba84c4fee9d06306668c5ad8da43f0f06d1a1e39110e96170c8bcc34c68da174a8f7363858d3dd9c66e88021d5941f21dcd71e1cadc20d3f8461c3016ec83040748a190381d78889152c24fde1650a25cc6834a66a1ec554399bacf05a9f267ee4cb6665420aa6e9c2f7c0a60e67c3f878d045042a0ba5b1f0859edaa536696dfab3d038e484dc52725aa5897d38d652db4e5691d680033d19f350961ee1bd8e7f369212ad5a9550ec73eefe4a0be226c1099c7e48db7cb4e6e48428a626fcad258c4b69c9d07a963b3b4e9e037db43ce2d70052cedc3abaf41acfd3a47493a25b5bf4e753333b7469ca5f1e806a0a826f14bde8ae27445a651f75254679619d7d115a487636f58fb425cd213e1ac87fe6ee88d4e8b72fa7b9f3d9badd0c0ac954b495cb45a19fc654ace40fae4eed768ed9f7987a35ff46f5ca6a04b92510c0c704d66b1de65b998ffbe3a385f7b0e2887bf6b650821d475d73e606ffb8058ef94ce20344e3aff806c449447020aa82f2d9fe8abd00c7b2d3af7b6396f33b088a77cf67a915714fefd721523445fb4716634fd08eaf8faca12215c8113048e00c5d30b9763c4a06a26f8ca7a0c603fd743ac0fa86945dc3cefcb5c9338065dfd2bc736249627b4ddd5f3ff18c39c2cafddc67212e1a8b43901fbc8363e1aae1c3962f7400ff349ff1205e4ea9746f9ba424ced15adee14c60e08e644f77802028f0f7dc2e003d256f78420067acc74c5150f2c57ab7d7df2b90fa665eeb1a5215c9a0f726eb0a797358bcee2d3425af67353c4a82a4c382105f9160a45dbe5945900ce6740913722e23003bb3b8d78386507241320dec04ab17fcadcec6170f5b3d1044f24f3bb11a196bb5138dd04cf585d3bd888641a2889ea2fdc6b66ce28a363921d225183fd75f9a830f930f5cecfa64f6f2e073d2b34e7784ac1dc353c5fa8735566d3b34124bad7854fa0a40b2de1664e3e41c3913888d623bc854e58685d27f72967e7e93fde139ba2e58c72381ec8d35e9cbb26171499605441870bc5c112b82eb8376a13fafff92e16eedb3addea7a81806ab1df54e9eabc026482b2733b2820b4707ca2108d6ada48ad5efc9c296f7b0bddc409d8e3b50d5616dc95347c797e59bf5fc8f0d7f4d778ee9b49191a8c9e6c2413db8837f548d44b9d81d37e6f03da2450358c9f6a69e37b7e95491a94a0c3a08cf082a714ae1bc0fbe42acfbb93d4ea6d4057c2306ba0e3dd099635699155e65717b3571b21ecb3ace1bebba31fa99bdd0728b9b133541d38d3925d142100a4a601c3f150738db5934c2e9da8384928685895c34fa7eeb9160da85268d3ac6fc9e444d860948521e7736bde8ae27445a651f75254679619d7d11c0ebe4119e47e3769d446894e9ee8c3bd4279962e441cadbd75a9817e1b62bc0c8328ac740973bce3b59a3f22cbe4971d2f94717b78d984ebe650d56da0e9c932a9d3e9722704e8d18dbf520f6b2b7a56ab5b2372189ff5baa1e007b78438747b0931d3b1465cd8fdf756cdcaff20fce684e8c4063b053125b404205ac060e1584e55f18e36e5798ac5ec60c8fa712003873f120663c1b4995363605800e4dd25188eb05a52709bcab0d288be439b08cf2de9d25393091153841ca08f17e905238b9f0d9cf3fe87af04f5ec7f90ce5da2d27c3f8aeeecf81b943b06f42f8aeac0704ec0db5af9a2404d0f9a66aff5ac0abe22902d4d15f8433ac361a3cc48033bbbf3ae1ca4ffffccd027fb9ffa963125a2f0c20bf0a02341361ba39845933795bcf974ee4105eda4c7bf49c28f361643848ff1fd44b86e26cfa8decb55a4f93713bb64e064ad1b4d9ed9cb346104697954c8aae1c05cf130755e92a0eec5a51c6bab6f0c49eedfbc98348a6fbf181cf39e5b0281e1a707fc14cf23ccdd3b9b5e3f5a3a569db4a328c19dc36c3a97d97a7e7b14943444dd0614d1dc977258c5115e75fc4005c3c5f6ad0a4ec0a410fd0ec8d35e9cbb26171499605441870bc5c112b82eb8376a13fafff92e16eedb3adfba2267f3a1a411bf62ad00ddab1949180c57ef7bf775c621f4c73d11c07f065eeffcce4dc1f760062f056b1397872a4691355fb3e27c4db8b1981ed57a628653915789d80990d5eb5089549c4f9d2f82c760bfcc5084a65cf29d731e7e0815445b7f1847c24120fbb3bf3783e127343a809185b64d19e9cb7ddba53e46dfcb494a48881d78a441715e217726e68a92fa7f5d21193fdeda227a9fb79c4fd4598c4db94be82f182eade97707b2f3237ef9f29c2f6fc2d766b09e98de82f1f37e73c5b15bfc2183bd6f7a45238b27993c27bc8d3329c9691d7bdbfdb7ddd3f4a6982af074da9690ec666f257801fa2468fc474f112880b307d9c44400ea5768c02dbdf3da9104002ec059d4c1ea9908cdb532d80ce332f1bfb77b0ec11716d97d2e888bd43e644eb779ca4abf1f3dfa9df11478171e59df5eee71387ba1b19b39bf0044dcd3df59dc0b225b3dbf19bcbfc4a8bf0c65aab0f207164164770b8948e208c1b8c767d07fd7093cf9eb511b9f5d146ad1a1924e5fc11819b547756bb6e2558efba4ecbc91dd9df8f506d0187f474b7ebb34e2a307683a535a7d2759ba77ec35fd6ebf69f6f3dcc4042b4b222140fafc1d252f8b2e7054d64325e030010e44653996159c75abcc658ee8639f01a72019915428c967ca13f492eaf6b79367c6fff8eb2747e6a194bb354d8b180ab154d8c15f457138b92d7bf7a2ce7d22340692db3b4e702dd243ee00d085127adf0d0cc57a3c7aef3e515d3d4f5e7aebeed2138d7874d1e44d4b3a5767d0ecff579ef7d188b31c6ae5293bc872b674aced82946c69daf05aaba656401e82f77ac31e4a711cfbc4d53052145419d63664a8735566d3b34124bad7854fa0a40b2de97423cb0aa8aaede6ab012f344b91d994fae9069bf746e220067dcaa7f49241ea0b5e62659fc145d55c39dc50a1d8470d89687a419f8a9c4e2a4c610917f85cba662b8a2659786f5dbbc42fc19413c1c2a32bef62955b7238e081283547dcd8d4dd1c887ec66e6d8c9f467c6f10a9857f6e60cf67adbc5754be73cb2d91d55942977ae66a30dc3b22030e32c45a17668eaf7dfab49b22678897a96eb37aec6f8ec0370775c1c629df83289f00a85330f66d1737f731ab3a6f5c8ee8f8151ad25b81a5e11fcd1fce0b2a16b9aa96be5da265bb1352f383fb235b37baff944fdc2ce4794a27610bc536f95eb13f1d5fdf00a710b3151b61b052e42283f71352893245afa22cdeec807bf0efece9ab828ebfead2a365d30d8d14c69a5ce07523d51578d86d942495ab3ea81230f228b09d1baba20da3267871fc82402a658fc491a7e2ae599e200f7d3706e4c25bb67af900d6061574f60610acaa991a5d2de35185b34d2dfdfff32a72f2989f57167c872b78f7a207557d0478225150863fb123fa85c44ceacab72841e33719d6fbd40e13299642a99aea81e87f796e1d6b41505647c8e1b72f9e1856ae4238f7c9519c14e95b5e1884724666447853428eefaf042c188b77fccd72eb44edee060d836ffc9e8bf4e95d5f6fd2c2b9cd852f2ede486c6faabd8fab2a29bc3ce13d0bae89515b5bd64cc670461fdb5f946780c26c7813ace8e4b162806be11430d9b113ccdba4926968efbc0ebf608a8ea5bd162060962d82e1fa4672871157a694690b8288b6dcbdc6a083d60a3f68aaeda130258dae54d60ffe8c9bc59c81e458269e6bc72afb7cbed3aa1db6b0d1707fcfad37394bee374bdaad0fd7aa84bbb67285184ed22bcec2e19bf9713db1b3cc0a2c38be3f5a3a569db4a328c19dc36c3a97d97bdaec852158064c6634ba577cacb913b92fb784a51f731bf66cc4f75b159eb47ed61c88c6740dfcc100814d45e1bbc8256e00c3b9e96bc86d3d2d761f71b30c9519e47e1109edaa6f2097c84ff58279ee237b9e8781d0b6c0e8bbd65b90af9648472289f8e2742ab6d511b219dfa5cb200718208a48c5626f161e3c210bea15842d3dd2bb42e20180ad9d571db79237f994d3b3bdf075a74e3d5ef77ff5659780a16c59ccc928c963766ab4c2819aadbf407325ce3c38728a2518bf6c9152da8302bda284c38c846ea65a49c9b5896ecbedf57ae54ba78ef15662bef1d254075f541a08569e761ab7f6ec915d9799aa5f7c70067706d8ac0d7e5865d341635c2e3d896a03a645f0b718249c1eee0fa0c273f0fd60f04548054df716a6acd227495695c19e237bb693e838f9c7b1f3c5d0401d86ecaf5d8a5df5fedc0a01c165dd0276e3be465f8455a126d47685effca7ba822ccf89b3ea6fd8a5a45fe8fd2d2b516383c7125456682094d4d62b001d003b5fc352c513a1b749ef14770cb1f31c2ccf8718657953b716ea20411c3a32110e217106d6895486d9849c16479b52bf65f0949853f9d73b011581a20b3392540c0e4a916e14fc64c52dfa6a8c8fe7c7d7595113d93cc682c099176f53dc4168af2a9416c29137f78e2d6f33cad002cad94de768c682f7759309beec9f8ef458b3ac56411131530887fda43f06537a6331c3a61e0261948cbaecd445bb30f73f66e84edb28578dc1b1906cf4ff2ee7ccfa00f5d8cbb9900a069f3a24aa56d6dd8fc66254c72d88218bf32779424e8b440f4cdf1cf4cd0e40efdc0d55cf1e43326cddce71a8f002cba203ec58650e200121968c7dd95874c3b274600093e15641f0601192d88bb491a87bae596092b81d9f7af1af4fdaeb650708bbe20db7b489174970ab554f1eb7005be0a30b28f135f809c3d3ad7882bd0f2c407b6e4eb082a6ca18a7fafc38d1ecdcf3dd8dddeaa6e6a61287f46b5136e2aecc36795ec184c0ef456063ecfc3950bac59535e71dde3efdb1f075b86914c6f4084cedcd7fe1a9c6777f7046a846e01eb967baf9ee3ef4c99023b91e812b2f7e53e949695a3c088a050411b68942cccbaefde61723a8e91241ac5c64cecdf2caa472d63966c4dd20389eb4788699f33e2300b26f3ef5363c5773e93a5c3569363b139f4d0b5d27ac7dc173e036610532378a8e26d8594a48881d78a441715e217726e68a92f660617d238dffafd46db4a589cc2a9dec4db94be82f182eade97707b2f3237ef9f29c2f6fc2d766b09e98de82f1f37e73c5b15bfc2183bd6f7a45238b27993c27bc8d3329c9691d7bdbfdb7ddd3f4a692fdb7a30a8d04a77b0487efe77b91208b61f77241fb866ae1355f716229f552c3d9467de941ece044d9202479acd9a5e5995fb2fb94f4a2f7d81ea32c3a31d813d933e4b9e2c69c499f1d77349ece09299d17998288306105038fd97ebddbb6612471ccb6c700b8e975f23438d99e1135932bf67e8b23d1157c1ea0f28c2f7f34f616911bf8739406dd7a2fede00b53644327eb899ee15ff8ec102f08e3720e8854ca95ee2faaed67ef0c925258ebe82ab929d3e597757cb6694bfa310ce7143a85582d91b9d6d4af007cb3cd2879d0b935ade8d05a6e3651bdd227541e5ed149edb8d104b2a134e590a72997940b34afc42c5e63eb2e880844add5d9916f48030086343032f54001b89b34d0f734a1e68d13371bd6c5d6484d518366f7e901eb3ec9ab9cdbe52d03ae17b1a532fa9465bd65808f6985f19eb8a7b31300827ac72afb7cbed3aa1db6b0d1707fcfad3731f6e4708fe97878d5f540d64dee7afb159b1cb3cdda9f2c9341b74fccec90bc20bda53f77cbed7263214ba709b621a3165332148f866eed5315fa27d5607e667c3b7f95433e8275824e931bee61fc8744fae9069bf746e220067dcaa7f49241ea0b5e62659fc145d55c39dc50a1d8470ca97f6c6929bbcf31ff8c30b36766688c49d79968de1ca3661a14d54896a7892d23a108af06caa989e842240bd19353b24e7c89e30b00eacf7182505397c3f238186a0bcceefec1c28b891bb0b5666c2f7773e8114c0f83d7be9a8d1dccf19bedbadc89430d650930e3012d20cdc95262bb5b250a37537444fa93b406b59c257ba77fe6a39e2d32579ed4f1eaacca9e2deada9bf44d82c357aa8820041f1d9c2099d7aba906c454f4bbdc1b2e1f5896fed5c234c229814f9a31a7957f334f25b0a42fb3902bd4e51e75eead0fa96323be3d896a03a645f0b718249c1eee0fa0c3d579d489e51533f13ed458ef07a6c1de8f5573af220a806a7ef87fe32a877aaa589e66204501c667ecfd7f9f42d1eb9f7dba3bb3f97f7eadd85ce05124426cf263192e0cd72480b46b1310b986809302f628eb674c14fdfa51cb81cd859ee8d'
// console.log(u(data_1))

// 请求加密测试
function d(e) {
    var t = l.encrypt(e, "30062AFC48C0E7B5B0918851C0445A37");
    return t
}

// 外面改成 ' '  里面不能改成单引号,里面改成单引号,就不是json字符串了
// data_2 = '{"applyType":1,"year":2025,"buyerName":"","code":"","areaCode":"","status":"","distributor":"","enterpriseId":"","factoryNumber":"","machineCode":"","purchaseDateStart":"","purchaseDateEnd":"","pageNum":2,"pageSize":15}'
// console.log(d(data_2))


//方式一
function r(e) {
    var t = s(e);
    return t
}

function h(e) {
    var t = JSON.parse(e)
        , n = Object.keys(t).sort()
        , i = n.map((function (e) {
            var n = t[e];
            if (n) {
                var i = ""
                    , c = encodeURIComponent(e);
                // return i = "object" === Object(a["a"])(n) ? JSON.stringify(n) : n,
                //     "".concat(c, "=").concat(i)
                // 前端的逗号操作符返回最后一个表达式的结果  所以可以直接替换
                return  "".concat(c, "=").concat(i)
            }
        }
    ));
    i = i.filter((function (e) {
            return void 0 !== e && null !== e && "" !== e
        }
    ));
    var c = i.join("&");
    return c
}

function p(e) {
    var t, n = Date.now();
    return e ? (e = JSON.parse(u(e.parameter)),
        e.timestamp = n,
        e = JSON.stringify(e),
        t = h(e),
        t += "&key=HD7232D2AAAKA@978D8723H211?IER&6",
        {
            sign: d(r(t).toLocaleUpperCase()),
            timestamp: d(n.toString()),
            source: "ZRCSL7V0JIRK1PHY"
        }) : (e = e || {},
        e.timestamp = n,
        e = JSON.stringify(e),
        t = h(e),
        t += "&key=HD7232D2AAAKA@978D8723H211?IER&6",
        {
            sign: d(r(t).toLocaleUpperCase()),
            timestamp: d(n.toString()),
            source: "ZRCSL7V0JIRK1PHY"
        })
}

var s = sm.sm3;

dict = {
    "parameter": "41a69732cb266f361a31837c0916648bb8291635c087e530d1a25683d1160ee6265dcefe370b55d7e6ac9aca916fd2136f93e8f4248b1bda1f084d3d281ef4c558c2386e83cbef7944b0cd502dac9fd4ded0caf3a0cb7f2a9dd1907d1e576b5d33b825d1dcfce86ad6f94db52e8f3603d3bd888641a2889ea2fdc6b66ce28a36fd06b8dab3ce2b23a291932e42192719ce2c68f7dff16888924b7c383b33663c74c74a194438fc847eed16c0e16a3667954f332d0418d865537f467f329fe9a1bb98f9d3d4bcb55c384304a8a62bba72f7e663f5b8c725b71304213cab17de23"
}
console.log(p(dict))

 

 2.2、JS代码中的逗号操作符

i = "object" === Object(a["a"])(n) ? JSON.stringify(n) : n,
"".concat(c, "=").concat(i)

 

这里涉及到 JavaScript 的运算符优先级 和 逗号操作符 的特性。

逗号操作符的特性

在 JavaScript 中,逗号操作符 会按顺序执行多个表达式,但只返回最后一个表达式的结果。

let result = (表达式1, 表达式2, 表达式3);
// 执行顺序:表达式1 → 表达式2 → 表达式3
// 返回结果:表达式3的值

 

你的代码分析

i = "object" === Object(a["a"])(n) ? JSON.stringify(n) : n,
"".concat(c, "=").concat(i)

这实际上是一个 逗号操作符 表达式,包含两个子表达式:

第一个表达式(赋值):

i = "object" === Object(a["a"])(n) ? JSON.stringify(n) : n

 

  • 执行三元运算

  • 将结果赋值给变量 i

  • 这个表达式的结果是赋值后的 i 值

第二个表达式(字符串拼接):

"".concat(c, "=").concat(i)

 

  • 拼接字符串

  • 这个表达式的结果是最终的参数字符串

为什么执行后面的操作?

因为 逗号操作符返回最后一个表达式的结果,所以整个语句的结果是第二个表达式的结果

等价代码写法

// 你的代码相当于

// 等价一
// 先执行赋值
let i = "object" === Object(a["a"])(n) ? JSON.stringify(n) : n;

// 然后执行并返回拼接结果
"".concat(c, "=").concat(i);

// 等价二
const result = (
    i = "object" === Object(a["a"])(n) ? JSON.stringify(n) : n,
    `${c}=${i}`
);
// result 包含最终的参数字符串

运算符优先级说明

优先级从高到低:

  1. 三元运算符 ? :

  2. 赋值运算符 =

  3. 逗号操作符 ,

所以你的代码被解析为:

(i = (三元运算结果)), (字符串拼接操作)

总结

  • 逗号操作符 按顺序执行所有表达式

  • 但只返回 最后一个表达式 的结果

  • 前面的表达式通常用于 副作用(如赋值)

  • 这是一种简洁但可能降低可读性的写法

 

 

posted @ 2025-09-09 19:31  L遇上J  阅读(24)  评论(0)    收藏  举报