Commit 34327c626b278ec2e8f0ddd1585dc08646bfbaec
1 parent
691d74ee
Exists in
master
1. F 完成所有接口的逻辑
2. A 后台添加机器状态统计功能 3. F 调整升级新增字段
Showing
30 changed files
with
1431 additions
and
3118 deletions
Show diff stats
app-api/config/url-rules.php
@@ -7,8 +7,8 @@ return [ | @@ -7,8 +7,8 @@ return [ | ||
7 | 'POST authDevice' => 'auth-device/index', | 7 | 'POST authDevice' => 'auth-device/index', |
8 | 'POST checkOtaVersion' => 'upgrade/check-version', | 8 | 'POST checkOtaVersion' => 'upgrade/check-version', |
9 | 'POST reportOtaUpgradeEvent' => 'upgrade/report-upgrade-event', | 9 | 'POST reportOtaUpgradeEvent' => 'upgrade/report-upgrade-event', |
10 | - 'POST checkAppVersion' => 'upgrade/check-app-versionx', | ||
11 | - 'POST reportAppUpgradeEvent' => 'upgrade/reportAppUpgradeEvent', | 10 | + 'POST checkAppVersion' => 'upgrade/check-app-version', |
11 | + 'POST reportAppUpgradeEvent' => 'upgrade/report-app-upgrade-event', | ||
12 | 'POST reportDeviceVersion' => 'upgrade/report-device-version', | 12 | 'POST reportDeviceVersion' => 'upgrade/report-device-version', |
13 | 'GET errorPage' => 'site/error-page-info', | 13 | 'GET errorPage' => 'site/error-page-info', |
14 | 'GET minaQuery' => 'site/mina-query', | 14 | 'GET minaQuery' => 'site/mina-query', |
app-api/controllers/AuthDeviceController.php
@@ -6,6 +6,7 @@ namespace app\api\controllers; | @@ -6,6 +6,7 @@ namespace app\api\controllers; | ||
6 | use Yii; | 6 | use Yii; |
7 | 7 | ||
8 | use common\helpers\Utils; | 8 | use common\helpers\Utils; |
9 | +use common\helpers\Log as AppLog; | ||
9 | use domain\device\DeviceRepository; | 10 | use domain\device\DeviceRepository; |
10 | use domain\device\Device; | 11 | use domain\device\Device; |
11 | use domain\device\DeviceStatus; | 12 | use domain\device\DeviceStatus; |
@@ -32,30 +33,42 @@ class AuthDeviceController extends BaseController | @@ -32,30 +33,42 @@ class AuthDeviceController extends BaseController | ||
32 | { | 33 | { |
33 | const SIGN_SALT = '13456'; | 34 | const SIGN_SALT = '13456'; |
34 | 35 | ||
35 | - | 36 | + private static function myLog($str) |
37 | + { | ||
38 | + AppLog::DEBUG($str); | ||
39 | + } | ||
36 | /** | 40 | /** |
37 | * 设备授权接口 | 41 | * 设备授权接口 |
38 | * @return stdClass | 42 | * @return stdClass |
39 | */ | 43 | */ |
40 | public function actionIndex() | 44 | public function actionIndex() |
41 | { | 45 | { |
42 | - $req = Yii::$app->request; | ||
43 | - $manufactureNo = $req->post('manufacture'); | ||
44 | - $deviceId = $req->post('device_id'); | ||
45 | - $projectNo = $req->post('project'); | ||
46 | - $modelNo = $req->post('model'); | ||
47 | - $sign = $req->post('sign'); | ||
48 | - $productionNo = $req->post('production'); | ||
49 | - $timestamp = $req->post('timestamp'); | ||
50 | $e = new stdClass(); | 46 | $e = new stdClass(); |
51 | - $e->status = 0; | 47 | + $e->status = 1; |
52 | $e->message = 'message'; | 48 | $e->message = 'message'; |
53 | $e->serial_no = '';; | 49 | $e->serial_no = '';; |
54 | $e->mac = ''; | 50 | $e->mac = ''; |
55 | 51 | ||
52 | + $getPostData = file_get_contents('php://input', 'r'); | ||
53 | + self::myLog('actionIndex postData:'.$getPostData); | ||
54 | + if (!$getPostData) { | ||
55 | + $e->status = 2; | ||
56 | + $e->message = '数据为空'; | ||
57 | + return $e; | ||
58 | + } | ||
59 | + $getPostData = json_decode($getPostData, true); | ||
60 | + $manufactureNo = isset($getPostData['manufacture'])?$getPostData['manufacture']:''; | ||
61 | + $deviceId = isset($getPostData['device_id'])?$getPostData['device_id']:''; | ||
62 | + $projectNo = isset($getPostData['project'])?$getPostData['project']:''; | ||
63 | + $modelNo = isset($getPostData['model'])?$getPostData['model']:''; | ||
64 | + $productionNo = isset($getPostData['production'])?$getPostData['production']:''; | ||
65 | + $timestamp = isset($getPostData['timestamp'])?$getPostData['timestamp']:''; | ||
66 | + $sign = isset($getPostData['sign'])?$getPostData['sign']:''; | ||
67 | + | ||
56 | $salt = self::SIGN_SALT; | 68 | $salt = self::SIGN_SALT; |
57 | $makeSign = md5($manufactureNo . $projectNo. $modelNo . $productionNo . $timestamp . $salt); | 69 | $makeSign = md5($manufactureNo . $projectNo. $modelNo . $productionNo . $timestamp . $salt); |
58 | if ($sign != $makeSign) { | 70 | if ($sign != $makeSign) { |
71 | + $e->status = 3; | ||
59 | $e->message = '签名有误'; | 72 | $e->message = '签名有误'; |
60 | return $e; | 73 | return $e; |
61 | } | 74 | } |
@@ -65,7 +78,7 @@ class AuthDeviceController extends BaseController | @@ -65,7 +78,7 @@ class AuthDeviceController extends BaseController | ||
65 | $e->mac = $deviceModel->mac; | 78 | $e->mac = $deviceModel->mac; |
66 | $e->serial_no = $deviceModel->serial_no; | 79 | $e->serial_no = $deviceModel->serial_no; |
67 | $e->message = 'ok'; | 80 | $e->message = 'ok'; |
68 | - $e->status = 1; | 81 | + $e->status = 0; |
69 | return $e; | 82 | return $e; |
70 | } | 83 | } |
71 | $authResult = Device::authDevice($deviceId, $manufactureNo, $projectNo, $modelNo, $productionNo); | 84 | $authResult = Device::authDevice($deviceId, $manufactureNo, $projectNo, $modelNo, $productionNo); |
@@ -74,8 +87,9 @@ class AuthDeviceController extends BaseController | @@ -74,8 +87,9 @@ class AuthDeviceController extends BaseController | ||
74 | $e->mac = $authResult->mac; | 87 | $e->mac = $authResult->mac; |
75 | $e->serial_no = $authResult->serial_no; | 88 | $e->serial_no = $authResult->serial_no; |
76 | $e->message = $authResult->message; | 89 | $e->message = $authResult->message; |
77 | - $e->status = 1; | 90 | + $e->status = 0; |
78 | } else { | 91 | } else { |
92 | + $e->status = 4; | ||
79 | $e->message = $authResult->message; | 93 | $e->message = $authResult->message; |
80 | } | 94 | } |
81 | 95 |
app-api/controllers/UpgradeController.php
@@ -3,8 +3,24 @@ | @@ -3,8 +3,24 @@ | ||
3 | namespace app\api\controllers; | 3 | namespace app\api\controllers; |
4 | 4 | ||
5 | use Yii; | 5 | use Yii; |
6 | +use common\helpers\Log as AppLog; | ||
7 | +use common\helpers\Utils; | ||
8 | +use domain\model\ModelRepository; | ||
9 | +use domain\production\ProductionRepository; | ||
10 | +use domain\upgrade\models\Upgrade as UpgradeModel; | ||
11 | +use domain\upgrade\UpgradeLog; | ||
12 | +use domain\upgrade\UpgradeLogRepository; | ||
13 | +use domain\upgrade\UpgradeRepository; | ||
14 | +use domain\upgrade\UpgradeStatus; | ||
15 | +use domain\device\DeviceStatsRepository; | ||
16 | +use domain\device\Device; | ||
17 | +use domain\device\DeviceStats; | ||
18 | +use domain\manufacturer\ManufacturerRepository; | ||
19 | +use domain\project\ProjectRepository; | ||
20 | +use domain\device\DeviceRepository; | ||
6 | 21 | ||
7 | use stdClass; | 22 | use stdClass; |
23 | + | ||
8 | use function sizeof; | 24 | use function sizeof; |
9 | use function date; | 25 | use function date; |
10 | use function count; | 26 | use function count; |
@@ -16,112 +32,467 @@ use function time; | @@ -16,112 +32,467 @@ use function time; | ||
16 | */ | 32 | */ |
17 | class UpgradeController extends BaseController | 33 | class UpgradeController extends BaseController |
18 | { | 34 | { |
35 | + | ||
36 | + private static function myLog($str) | ||
37 | + { | ||
38 | + AppLog::DEBUG($str); | ||
39 | + } | ||
19 | /** | 40 | /** |
20 | * OTA 包升级检测 | 41 | * OTA 包升级检测 |
21 | * @return stdClass | 42 | * @return stdClass |
22 | */ | 43 | */ |
23 | public function actionCheckVersion() | 44 | public function actionCheckVersion() |
24 | { | 45 | { |
25 | - $req = Yii::$app->request; | ||
26 | - $barcode = $req->post('barcode'); | ||
27 | - $deviceId = $req->post('device_id'); | ||
28 | - $softwareVersion = $req->post('software_version'); | ||
29 | - $hardwareVersion = $req->post('hardware_version'); | ||
30 | - | ||
31 | $e = new stdClass(); | 46 | $e = new stdClass(); |
32 | - $e->status = 0; | ||
33 | - $e->message = 'fail'; | 47 | + $e->status = 1; |
48 | + $e->message = 'ok'; | ||
34 | $e->update_flag = 0; // 0 1 2 | 49 | $e->update_flag = 0; // 0 1 2 |
35 | - $e->version = ''; | ||
36 | - $e->file_path = ''; | ||
37 | - $e->file_md5 = ''; | ||
38 | - $e->size = 3627; | ||
39 | - $e->package_type = 0; // 0 1, 2 | ||
40 | - $e->version_message = 'ok'; | 50 | + $getPostData = file_get_contents('php://input', 'r'); |
51 | + self::myLog('actionCheckVersion:'.$getPostData); | ||
52 | + if (!$getPostData) { | ||
53 | + $e->message = '数据为空'; | ||
54 | + return $e; | ||
55 | + } | ||
56 | + $getPostData = json_decode($getPostData, true); | ||
57 | + $barcode = isset($getPostData['barcode'])? $getPostData['barcode']:''; | ||
58 | + $deviceId = isset($getPostData['device_id'])? $getPostData['device_id']:''; | ||
59 | + $softwareVersion = isset($getPostData['software_version'])? $getPostData['software_version']:''; | ||
60 | + $hardwareVersion = isset($getPostData['hardware_version'])? $getPostData['hardware_version']:''; | ||
61 | + | ||
62 | + if (empty($barcode) || empty($packageName) || empty($currentVersion) || empty($softwareVersion)|| empty($hardwareVersion)) { | ||
63 | + $e->status = 2; | ||
64 | + $e->message = '部分数据为空'; | ||
65 | + return $e; | ||
66 | + } | ||
67 | + | ||
68 | + $deviceBatchInfo = Device::explodeBarcode($barcode); | ||
69 | + if (empty($deviceBatchInfo)) { | ||
70 | + $e->status = 3; | ||
71 | + $e->message = 'barcode格式有误'; | ||
72 | + return $e; | ||
73 | + } | ||
74 | + | ||
75 | + $deviceModel = DeviceRepository::findOne(['device_id' => $deviceId]); | ||
76 | + if (empty($deviceModel)) { | ||
77 | + $e->status = 4; | ||
78 | + $e->message = '无该设备记录'; | ||
79 | + return $e; | ||
80 | + } | ||
81 | + | ||
82 | + $ma = ManufacturerRepository::findOne(['manufacture_no' => $deviceBatchInfo[0]]); | ||
83 | + $manufactureId = 0; | ||
84 | + if ($ma) { | ||
85 | + $manufactureId = $ma->id; | ||
86 | + } | ||
87 | + | ||
88 | + $upgradeModel = UpgradeModel::find(); | ||
89 | + $upgradeModel->where([ | ||
90 | + 'manufacture_id' => $manufactureId, | ||
91 | + 'status' => UpgradeStatus::STATUS_ON, | ||
92 | + 'is_delete' => 0, | ||
93 | + 'type' => UpgradeStatus::TYPE_OTA | ||
94 | + ]); | ||
95 | + $upgradeModel->andWhere(['>', 'version', $hardwareVersion]); | ||
96 | + $upgradeModel->orderBy('created_at desc'); | ||
97 | + $upgradeRecord = $upgradeModel->one(); | ||
98 | + | ||
99 | + if (!$upgradeRecord) { | ||
100 | + $e->status = 1; | ||
101 | + $e->message = '暂无升级包'; | ||
102 | + $e->update_flag = 0; | ||
103 | + $e->version = ''; | ||
104 | + $e->file_path = ''; | ||
105 | + $e->file_md5 = ''; | ||
106 | + $e->size = 0; | ||
107 | + $e->version_message = ''; | ||
108 | + $e->package_type = 0; | ||
109 | + | ||
110 | + return $e; | ||
111 | + } | ||
112 | + $devices = []; | ||
113 | + if ($upgradeRecord->device_ids) { | ||
114 | + $devices = explode(',', $upgradeRecord->device_ids); | ||
115 | + } | ||
116 | + // 不在预发布指定的设备里面 | ||
117 | + if ($devices && !in_array($deviceId, $devices)) { | ||
118 | + $e->status = 1; | ||
119 | + $e->message = '暂无升级包'; | ||
120 | + $e->update_flag = 0; | ||
121 | + $e->version = ''; | ||
122 | + $e->file_path = ''; | ||
123 | + $e->file_md5 = ''; | ||
124 | + $e->size = 0; | ||
125 | + $e->version_message = ''; | ||
126 | + $e->package_type = 0; | ||
127 | + | ||
128 | + return $e; | ||
129 | + } | ||
130 | + | ||
131 | + $domainURL = Yii::$app->params['file_upload_domain']; | ||
132 | + $e->status = 0; | ||
133 | + $e->message = '有升级包'; | ||
134 | + $e->update_flag = $upgradeRecord->focuse; | ||
135 | + $e->version = $upgradeRecord->version; | ||
136 | + $e->file_path = $domainURL.$upgradeRecord->path; | ||
137 | + $e->file_md5 = $upgradeRecord->file_md5; | ||
138 | + $e->size = $upgradeRecord->size; | ||
139 | + $e->package_type = $upgradeRecord->package_type; | ||
140 | + $e->version_message = $upgradeRecord->desc; | ||
41 | 141 | ||
42 | return $e; | 142 | return $e; |
43 | } | 143 | } |
44 | 144 | ||
45 | /** | 145 | /** |
46 | - * | 146 | + * 上报 OTA 升级事件 |
47 | * @return stdClass | 147 | * @return stdClass |
48 | */ | 148 | */ |
49 | public function actionReportUpgradeEvent() | 149 | public function actionReportUpgradeEvent() |
50 | { | 150 | { |
51 | - $req = Yii::$app->request; | ||
52 | - $barcode = $req->post('barcode'); | ||
53 | - $deviceId = $req->post('device_id'); | ||
54 | - $currentVersion = $req->post('current_version'); | ||
55 | - $targetVersion = $req->post('target_version'); | ||
56 | - $status = $req->post('status'); | ||
57 | - $errorCode = $req->post('error_code'); | ||
58 | - $timestamp = $req->post('timestamp'); | ||
59 | - | ||
60 | $e = new stdClass(); | 151 | $e = new stdClass(); |
61 | - $e->status = 0; | ||
62 | - $e->message = 'fail'; | 152 | + $e->status = 1; |
153 | + $getPostData = file_get_contents('php://input', 'r'); | ||
154 | + self::myLog('actionReportUpgradeEvent:'. $getPostData); | ||
155 | + if (!$getPostData) { | ||
156 | + $e->message = '数据为空'; | ||
157 | + return $e; | ||
158 | + } | ||
159 | + $getPostData = json_decode($getPostData, true); | ||
160 | + $barcode = isset($getPostData['barcode'])? $getPostData['barcode']:''; | ||
161 | + $deviceId = isset($getPostData['device_id'])? $getPostData['device_id']:''; | ||
162 | + $currentVersion = isset($getPostData['current_version'])? $getPostData['current_version']:''; | ||
163 | + $targetVersion = isset($getPostData['target_version'])? $getPostData['target_version']:''; | ||
164 | + $status = isset($getPostData['status'])? $getPostData['status']:''; | ||
165 | + $errorCode = isset($getPostData['error_code'])? $getPostData['error_code']:''; | ||
166 | + $timestamp = isset($getPostData['timestamp'])? $getPostData['timestamp']:''; | ||
167 | + | ||
168 | + if (empty($barcode) || empty($currentVersion) || empty($targetVersion) || empty($status) || empty($errorCode) || empty($timestamp)) { | ||
169 | + $e->status = 2; | ||
170 | + $e->message = '部分数据为空'; | ||
171 | + return $e; | ||
172 | + } | ||
63 | 173 | ||
174 | + if (empty($deviceId)) { | ||
175 | + $e->status = 3; | ||
176 | + $e->message = '设备ID为空'; | ||
177 | + return $e; | ||
178 | + } | ||
179 | + $deviceBatchInfo = Device::explodeBarcode($barcode); | ||
180 | + if (empty($deviceBatchInfo)) { | ||
181 | + $e->status = 4; | ||
182 | + $e->message = 'barcode格式有误'; | ||
183 | + return $e; | ||
184 | + } | ||
185 | + $upgradeLogModel = UpgradeLogRepository::findOne(['device_id' => $deviceId, 'current_version' => $currentVersion, 'target_version' => $targetVersion, 'status' => $status, 'type' => UpgradeStatus::TYPE_OTA]); | ||
186 | + if ($upgradeLogModel) { | ||
187 | + $upgradeLogModel->timestamp = $timestamp; | ||
188 | + $upgradeLogModel->save(); | ||
189 | + $e->status = 0; | ||
190 | + $e->message = '已更新'; | ||
191 | + | ||
192 | + return $e; | ||
193 | + } | ||
194 | + $ma = ManufacturerRepository::findOne(['manufacture_no' => $deviceBatchInfo[0]]); | ||
195 | + $pro = ProjectRepository::findOne(['project_no' => $deviceBatchInfo[1]]); | ||
196 | + $model = ModelRepository::findOne(['model_no' => $deviceBatchInfo[2]]); | ||
197 | + $manufactureId = $projectId = $modelId = 0; | ||
198 | + if ($ma) { | ||
199 | + $manufactureId = $ma->id; | ||
200 | + } | ||
201 | + if ($pro) { | ||
202 | + $projectId = $pro->id; | ||
203 | + } | ||
204 | + if ($model) { | ||
205 | + $modelId = $model->id; | ||
206 | + } | ||
207 | + | ||
208 | + $item = [ | ||
209 | + "barcode" => $barcode, | ||
210 | + "device_id" => $deviceId, | ||
211 | + "manufacture_id" => $manufactureId, | ||
212 | + "project_id" => $projectId, | ||
213 | + "model_id" => $modelId, | ||
214 | + "current_version" => $currentVersion, | ||
215 | + "target_version" => $targetVersion, | ||
216 | + "status" => $status, | ||
217 | + "error_code" => $errorCode, | ||
218 | + "timestamp" => $timestamp, | ||
219 | + "type" => UpgradeStatus::TYPE_OTA | ||
220 | + ]; | ||
221 | + $saveR = UpgradeLog::create($item); | ||
222 | + if ($saveR) { | ||
223 | + $e->status = 0; | ||
224 | + $e->message = 'ok'; | ||
225 | + } else { | ||
226 | + $e->status = 5; | ||
227 | + $e->message = '报告记录失败'; | ||
228 | + } | ||
64 | 229 | ||
65 | return $e; | 230 | return $e; |
66 | } | 231 | } |
67 | 232 | ||
233 | + /** | ||
234 | + * APP 升级检测 | ||
235 | + * @return stdClass | ||
236 | + */ | ||
68 | public function actionCheckAppVersion() | 237 | public function actionCheckAppVersion() |
69 | { | 238 | { |
70 | - $req = Yii::$app->request; | ||
71 | - $barcode = $req->post('barcode'); | ||
72 | - $deviceId = $req->post('device_id'); | ||
73 | - $packageName = $req->post('package_name'); | ||
74 | - $currentVersion = $req->post('current_version'); | ||
75 | - | ||
76 | $e = new stdClass(); | 239 | $e = new stdClass(); |
77 | - $e->status = 0; | ||
78 | - $e->message = 'fail'; | ||
79 | - $e->update_flag = 0; // 0 1 2 | ||
80 | - $e->version = ''; | ||
81 | - $e->file_path = ''; | ||
82 | - $e->file_md5 = ''; | ||
83 | - $e->size = 3627; | ||
84 | - $e->version_message = 'ok'; | 240 | + $e->status = 1; |
241 | + $getPostData = file_get_contents('php://input', 'r'); | ||
242 | + self::myLog('actionReportUpgradeEvent:'. $getPostData); | ||
243 | + if (!$getPostData) { | ||
244 | + $e->message = '数据为空'; | ||
245 | + return $e; | ||
246 | + } | ||
247 | + $getPostData = json_decode($getPostData, true); | ||
248 | + $barcode = isset($getPostData['barcode'])? $getPostData['barcode']: ''; | ||
249 | + $deviceId = isset($getPostData['device_id'])? $getPostData['device_id']: ''; | ||
250 | + $packageName = isset($getPostData['package_name'])? $getPostData['package_name']: ''; | ||
251 | + $currentVersion = isset($getPostData['current_version'])? $getPostData['current_version']: ''; | ||
252 | + | ||
253 | + if (empty($barcode) || empty($packageName) || empty($currentVersion)) { | ||
254 | + $e->status = 2; | ||
255 | + $e->message = '部分数据为空'; | ||
256 | + return $e; | ||
257 | + } | ||
258 | + | ||
259 | + $deviceBatchInfo = Device::explodeBarcode($barcode); | ||
260 | + if (empty($deviceBatchInfo)) { | ||
261 | + $e->status = 3; | ||
262 | + $e->message = 'barcode格式有误'; | ||
263 | + return $e; | ||
264 | + } | ||
265 | + | ||
266 | + $deviceModel = DeviceRepository::findOne(['device_id' => $deviceId]); | ||
267 | + if (empty($deviceModel)) { | ||
268 | + $e->status = 4; | ||
269 | + $e->message = '无该设备记录'; | ||
270 | + return $e; | ||
271 | + } | ||
272 | + | ||
273 | + $ma = ManufacturerRepository::findOne(['manufacture_no' => $deviceBatchInfo[0]]); | ||
274 | + $manufactureId = 0; | ||
275 | + if ($ma) { | ||
276 | + $manufactureId = $ma->id; | ||
277 | + } | ||
278 | + | ||
279 | + $upgradeModel = UpgradeModel::find(); | ||
280 | + $upgradeModel->where([ | ||
281 | + 'manufacture_id' => $manufactureId, | ||
282 | + 'status' => UpgradeStatus::STATUS_ON, | ||
283 | + 'package_name' => $packageName, | ||
284 | + 'is_delete' => 0, | ||
285 | + 'type' => UpgradeStatus::TYPE_APP | ||
286 | + ]); | ||
287 | + $upgradeModel->andWhere(['>', 'version', $currentVersion]); | ||
288 | + $upgradeModel->orderBy('created_at desc'); | ||
289 | + $upgradeRecord = $upgradeModel->one(); | ||
290 | + | ||
291 | + if (!$upgradeRecord) { | ||
292 | + $e->status = 1; | ||
293 | + $e->message = '暂无升级包'; | ||
294 | + $e->update_flag = 0; | ||
295 | + $e->version = ''; | ||
296 | + $e->file_path = ''; | ||
297 | + $e->file_md5 = ''; | ||
298 | + $e->size = 0; | ||
299 | + $e->version_message = ''; | ||
300 | + } else { | ||
301 | + $domainURL = Yii::$app->params['file_upload_domain']; | ||
302 | + $e->status = 0; | ||
303 | + $e->message = '有升级包'; | ||
304 | + $e->update_flag = $upgradeRecord->focuse; | ||
305 | + $e->version = $upgradeRecord->version; | ||
306 | + $e->file_path = $domainURL.$upgradeRecord->path; | ||
307 | + $e->file_md5 = $upgradeRecord->file_md5; | ||
308 | + $e->size = $upgradeRecord->size; | ||
309 | + $e->version_message = $upgradeRecord->desc; | ||
310 | + } | ||
85 | 311 | ||
86 | return $e; | 312 | return $e; |
87 | } | 313 | } |
88 | 314 | ||
89 | /** | 315 | /** |
316 | + * APP 升级报告 | ||
90 | * @return stdClass | 317 | * @return stdClass |
91 | */ | 318 | */ |
92 | public function actionReportAppUpgradeEvent() | 319 | public function actionReportAppUpgradeEvent() |
93 | { | 320 | { |
94 | - $req = Yii::$app->request; | ||
95 | - $barcode = $req->post('barcode'); | ||
96 | - $deviceId = $req->post('device_id'); | ||
97 | - $currentVersion = $req->post('current_version'); | ||
98 | - $targetVersion = $req->post('target_version'); | ||
99 | - $status = $req->post('status'); | ||
100 | - $errorCode = $req->post('error_code'); | ||
101 | - $timestamp = $req->post('timestamp'); | ||
102 | - | ||
103 | $e = new stdClass(); | 321 | $e = new stdClass(); |
104 | - $e->status = 0; | ||
105 | - $e->message = 'fail'; | 322 | + $e->status = 1; |
323 | + $getPostData = file_get_contents('php://input', 'r'); | ||
324 | + self::myLog('actionReportUpgradeEvent:'. $getPostData); | ||
325 | + if (!$getPostData) { | ||
326 | + $e->message = '数据为空'; | ||
327 | + return $e; | ||
328 | + } | ||
329 | + $getPostData = json_decode($getPostData, true); | ||
330 | + $barcode = isset($getPostData['barcode'])? $getPostData['barcode']: ''; | ||
331 | + $deviceId = isset($getPostData['device_id'])? $getPostData['device_id']: ''; | ||
332 | + $currentVersion = isset($getPostData['current_version'])? $getPostData['current_version']: ''; | ||
333 | + $targetVersion = isset($getPostData['target_version'])? $getPostData['target_version']: ''; | ||
334 | + $status = isset($getPostData['status'])? $getPostData['status']: ''; | ||
335 | + $errorCode = isset($getPostData['error_code'])? $getPostData['error_code']: ''; | ||
336 | + $timestamp = isset($getPostData['timestamp'])? $getPostData['timestamp']: ''; | ||
337 | + | ||
338 | + if (empty($barcode) || empty($currentVersion) || empty($targetVersion) || empty($status) || empty($errorCode) || empty($timestamp)) { | ||
339 | + $e->status = 2; | ||
340 | + $e->message = '部分数据为空'; | ||
341 | + return $e; | ||
342 | + } | ||
343 | + | ||
344 | + if (empty($deviceId)) { | ||
345 | + $e->status = 3; | ||
346 | + $e->message = '设备ID为空'; | ||
347 | + return $e; | ||
348 | + } | ||
349 | + $deviceBatchInfo = Device::explodeBarcode($barcode); | ||
350 | + if (empty($deviceBatchInfo)) { | ||
351 | + $e->status = 4; | ||
352 | + $e->message = 'barcode格式有误'; | ||
353 | + return $e; | ||
354 | + } | ||
355 | + $upgradeLogModel = UpgradeLogRepository::findOne(['device_id' => $deviceId, 'current_version' => $currentVersion, 'target_version' => $targetVersion, 'status' => $status, 'type' => UpgradeStatus::TYPE_APP]); | ||
356 | + if ($upgradeLogModel) { | ||
357 | + $upgradeLogModel->timestamp = $timestamp; | ||
358 | + $upgradeLogModel->save(); | ||
359 | + $e->status = 0; | ||
360 | + $e->message = '已更新'; | ||
361 | + | ||
362 | + return $e; | ||
363 | + } | ||
364 | + $ma = ManufacturerRepository::findOne(['manufacture_no' => $deviceBatchInfo[0]]); | ||
365 | + $pro = ProjectRepository::findOne(['project_no' => $deviceBatchInfo[1]]); | ||
366 | + $model = ModelRepository::findOne(['model_no' => $deviceBatchInfo[2]]); | ||
367 | + $manufactureId = $projectId = $modelId = 0; | ||
368 | + if ($ma) { | ||
369 | + $manufactureId = $ma->id; | ||
370 | + } | ||
371 | + if ($pro) { | ||
372 | + $projectId = $pro->id; | ||
373 | + } | ||
374 | + if ($model) { | ||
375 | + $modelId = $model->id; | ||
376 | + } | ||
377 | + | ||
378 | + $item = [ | ||
379 | + "barcode" => $barcode, | ||
380 | + "device_id" => $deviceId, | ||
381 | + "manufacture_id" => $manufactureId, | ||
382 | + "project_id" => $projectId, | ||
383 | + "model_id" => $modelId, | ||
384 | + "current_version" => $currentVersion, | ||
385 | + "target_version" => $targetVersion, | ||
386 | + "status" => $status, | ||
387 | + "error_code" => $errorCode, | ||
388 | + "timestamp" => $timestamp, | ||
389 | + "type" => UpgradeStatus::TYPE_APP | ||
390 | + ]; | ||
391 | + $saveR = UpgradeLog::create($item); | ||
392 | + if ($saveR) { | ||
393 | + $e->status = 0; | ||
394 | + $e->message = 'ok'; | ||
395 | + } else { | ||
396 | + $e->status = 5; | ||
397 | + $e->message = '记录失败'; | ||
398 | + } | ||
106 | 399 | ||
107 | return $e; | 400 | return $e; |
108 | } | 401 | } |
109 | 402 | ||
110 | /** | 403 | /** |
404 | + * 机器状态统计 | ||
111 | * @return stdClass | 405 | * @return stdClass |
112 | */ | 406 | */ |
113 | public function actionReportDeviceVersion() | 407 | public function actionReportDeviceVersion() |
114 | { | 408 | { |
115 | - $req = Yii::$app->request; | ||
116 | - $barcode = $req->post('barcode'); | ||
117 | - $deviceId = $req->post('device_id'); | ||
118 | - $softwareVersion = $req->post('software_version'); | ||
119 | - $hardwareVersion = $req->post('hardware_version'); | ||
120 | - $timestamp = $req->post('timestamp'); | ||
121 | - | ||
122 | $e = new stdClass(); | 409 | $e = new stdClass(); |
410 | + $e->status = 1; | ||
411 | + $getPostData = file_get_contents('php://input', 'r'); | ||
412 | + self::myLog('actionReportDeviceVersion:'. $getPostData); | ||
413 | + if (!$getPostData) { | ||
414 | + $e->message = '数据为空'; | ||
415 | + return $e; | ||
416 | + } | ||
417 | + $getPostData = json_decode($getPostData, true); | ||
418 | + $barcode = isset($getPostData['barcode'])? $getPostData['barcode']: ''; | ||
419 | + $deviceId = isset($getPostData['device_id'])? $getPostData['device_id']: ''; | ||
420 | + $softwareVersion = isset($getPostData['software_version'])? $getPostData['software_version']: ''; | ||
421 | + $hardwareVersion = isset($getPostData['hardware_version'])? $getPostData['hardware_version']: ''; | ||
422 | + $timestamp = isset($getPostData['timestamp'])? $getPostData['timestamp']: ''; | ||
423 | + | ||
424 | + if (empty($barcode) || empty($softwareVersion) || empty($hardwareVersion) || empty($timestamp)) { | ||
425 | + $e->status = 2; | ||
426 | + $e->message = '部分数据为空'; | ||
427 | + return $e; | ||
428 | + } | ||
429 | + | ||
430 | + if (empty($deviceId)) { | ||
431 | + $e->status = 3; | ||
432 | + $e->message = '设备ID为空'; | ||
433 | + return $e; | ||
434 | + } | ||
435 | + | ||
436 | + $ipAddress = Utils::clientIp(); | ||
437 | + $deviceStatsModel = DeviceStatsRepository::findOne(['device_id' => $deviceId]); | ||
438 | + if ($deviceStatsModel) { | ||
439 | + $deviceStatsModel->timestamp = $timestamp; | ||
440 | + $deviceStatsModel->ip = $ipAddress; | ||
441 | + $deviceStatsModel->save(); | ||
442 | + $e->status = 0; | ||
443 | + $e->message = 'ok'; | ||
444 | + return $e; | ||
445 | + } | ||
446 | + | ||
447 | + $deviceBatchInfo = Device::explodeBarcode($barcode); | ||
448 | + if (empty($deviceBatchInfo)) { | ||
449 | + $e->status = 4; | ||
450 | + $e->message = 'barcode格式有误'; | ||
451 | + return $e; | ||
452 | + } | ||
453 | + | ||
454 | + $ma = ManufacturerRepository::findOne(['manufacture_no' => $deviceBatchInfo[0]]); | ||
455 | + $pro = ProjectRepository::findOne(['project_no' => $deviceBatchInfo[1]]); | ||
456 | + $model = ModelRepository::findOne(['model_no' => $deviceBatchInfo[2]]); | ||
457 | + $prod = ProductionRepository::findOne(['production_no' => $deviceBatchInfo[3]]); | ||
458 | + $manufactureId = $projectId = $modelId = $productionId = 0; | ||
459 | + if ($ma) { | ||
460 | + $manufactureId = $ma->id; | ||
461 | + } | ||
462 | + if ($pro) { | ||
463 | + $projectId = $pro->id; | ||
464 | + } | ||
465 | + if ($model) { | ||
466 | + $modelId = $model->id; | ||
467 | + } | ||
468 | + if ($prod) { | ||
469 | + $productionId = $prod->id; | ||
470 | + } | ||
471 | + | ||
472 | + $cityResult = Utils::getAddressByIPAddress($ipAddress); | ||
473 | + $city = ''; | ||
474 | + if ($cityResult && isset($cityResult['city']) && !empty($cityResult['city'])) { | ||
475 | + $city = $cityResult['city']; | ||
476 | + } | ||
477 | + | ||
478 | + $item = [ | ||
479 | + 'device_id' => $deviceId, | ||
480 | + 'barcode' => $barcode, | ||
481 | + 'software_version' => $softwareVersion, | ||
482 | + 'hardware_version' => $hardwareVersion, | ||
483 | + 'timestamp' => $timestamp, | ||
484 | + 'manufacture_id' => $manufactureId, | ||
485 | + 'project_id' => $projectId, | ||
486 | + 'model_id' => $modelId, | ||
487 | + 'production_id' => $productionId, | ||
488 | + 'ip' => $ipAddress, | ||
489 | + 'city' => $city | ||
490 | + ]; | ||
491 | + | ||
492 | + DeviceStats::create($item); | ||
493 | + | ||
123 | $e->status = 0; | 494 | $e->status = 0; |
124 | - $e->message = 'fail'; | 495 | + $e->message = 'ok'; |
125 | 496 | ||
126 | return $e; | 497 | return $e; |
127 | } | 498 | } |
@@ -0,0 +1,73 @@ | @@ -0,0 +1,73 @@ | ||
1 | +<?php | ||
2 | + | ||
3 | +namespace app\api\helpers; | ||
4 | + | ||
5 | +class Aes | ||
6 | +{ | ||
7 | + /** | ||
8 | + * var string $method 加解密方法,可通过openssl_get_cipher_methods()获得 | ||
9 | + */ | ||
10 | + protected $method; | ||
11 | + | ||
12 | + /** | ||
13 | + * var string $secret_key 加解密的密钥 | ||
14 | + */ | ||
15 | + protected $secret_key; | ||
16 | + | ||
17 | + /** | ||
18 | + * var string $iv 加解密的向量,有些方法需要设置比如CBC | ||
19 | + */ | ||
20 | + protected $iv; | ||
21 | + | ||
22 | + /** | ||
23 | + * var string $options (不知道怎么解释,目前设置为0没什么问题) | ||
24 | + */ | ||
25 | + protected $options; | ||
26 | + | ||
27 | + /** | ||
28 | + * 构造函数 | ||
29 | + * | ||
30 | + * @param string $key 密钥 | ||
31 | + * @param string $method 加密方式 | ||
32 | + * @param string $iv iv向量 | ||
33 | + * @param mixed $options 还不是很清楚 | ||
34 | + * | ||
35 | + */ | ||
36 | + public function __construct($key, $method = 'AES-128-ECB', $iv = '', $options = 0) | ||
37 | + { | ||
38 | + // key是必须要设置的 | ||
39 | + $this->secret_key = isset($key) ? $key : 'king_board_key_01'; | ||
40 | + | ||
41 | + $this->method = $method; | ||
42 | + | ||
43 | + $this->iv = $iv; | ||
44 | + | ||
45 | + $this->options = $options; | ||
46 | + } | ||
47 | + | ||
48 | + /** | ||
49 | + * 加密方法,对数据进行加密,返回加密后的数据 | ||
50 | + * | ||
51 | + * @param string $data 要加密的数据 | ||
52 | + * | ||
53 | + * @return string | ||
54 | + * | ||
55 | + */ | ||
56 | + public function encrypt($data) | ||
57 | + { | ||
58 | + return openssl_encrypt($data, $this->method, $this->secret_key, $this->options, $this->iv); | ||
59 | + } | ||
60 | + | ||
61 | + /** | ||
62 | + * 解密方法,对数据进行解密,返回解密后的数据 | ||
63 | + * | ||
64 | + * @param string $data 要解密的数据 | ||
65 | + * | ||
66 | + * @return string | ||
67 | + * | ||
68 | + */ | ||
69 | + public function decrypt($data) | ||
70 | + { | ||
71 | + return openssl_decrypt($data, $this->method, $this->secret_key, $this->options, $this->iv); | ||
72 | + } | ||
73 | +} | ||
0 | \ No newline at end of file | 74 | \ No newline at end of file |
app-ht/modules/datas/controllers/DeviceStatsController.php
0 → 100644
@@ -0,0 +1,119 @@ | @@ -0,0 +1,119 @@ | ||
1 | +<?php | ||
2 | + | ||
3 | +namespace app\ht\modules\datas\controllers; | ||
4 | + | ||
5 | +use domain\device\DeviceStatsRepository; | ||
6 | +use Yii; | ||
7 | +use yii\data\Pagination; | ||
8 | +use domain\upgrade\UpgradeLogRepository; | ||
9 | +use domain\upgrade\UpgradeStatus; | ||
10 | +use app\ht\controllers\BaseController; | ||
11 | + | ||
12 | +/** | ||
13 | + * 机器状态码管理 | ||
14 | + * Class DeviceStatsController | ||
15 | + * @package app\ht\modules\upgrade\controllers | ||
16 | + */ | ||
17 | +class DeviceStatsController extends BaseController | ||
18 | +{ | ||
19 | + /** | ||
20 | + * 版本日志管理 | ||
21 | + */ | ||
22 | + public function actionIndex() | ||
23 | + { | ||
24 | + $params = $this->dataList(1); | ||
25 | + /** | ||
26 | + * 渲染模板 | ||
27 | + */ | ||
28 | + return $this->render('index', $params); | ||
29 | + } | ||
30 | + | ||
31 | + /** | ||
32 | + * 查询数据列表 | ||
33 | + */ | ||
34 | + protected function dataList($type = '') | ||
35 | + { | ||
36 | + $request = Yii::$app->request; | ||
37 | + $createTime = $request->get('createTime'); | ||
38 | + $endTime = $request->get('endTime'); | ||
39 | + $software_version = $request->get('software_version'); | ||
40 | + $hardware_version = $request->get('hardware_version'); | ||
41 | + $manufacture_name = $request->get('manufacture_name'); | ||
42 | + $model_name = $request->get('model_name'); | ||
43 | + $device_id = $request->get('device_id'); | ||
44 | + $barcode = $request->get('barcode'); | ||
45 | + $city = $request->get('city'); | ||
46 | + | ||
47 | + $gets = [ | ||
48 | + 'createTime' => $createTime, | ||
49 | + 'endTime' => $endTime, | ||
50 | + 'software_version' => $software_version, | ||
51 | + 'hardware_version' => $hardware_version, | ||
52 | + 'manufacture_name' => $manufacture_name, | ||
53 | + 'device_id' => $device_id, | ||
54 | + 'barcode' => $barcode, | ||
55 | + 'model_name' => $model_name, | ||
56 | + 'city' => $city, | ||
57 | + ]; | ||
58 | + | ||
59 | + $where = ['and']; | ||
60 | + if ($createTime) { | ||
61 | + $createTime = strtotime($createTime); | ||
62 | + $where[] = ['>=', 'ds.created_at', $createTime]; | ||
63 | + } | ||
64 | + if ($endTime) { | ||
65 | + $endTime = strtotime($endTime) + 86400; | ||
66 | + $where[] = ['<=', 'ds.created_at', $endTime]; | ||
67 | + } | ||
68 | + | ||
69 | + if ($software_version) { | ||
70 | + $where[] = ['like', 'ds.software_version', $software_version]; | ||
71 | + } | ||
72 | + if ($hardware_version) { | ||
73 | + $where[] = ['like', 'ds.hardware_version', $hardware_version]; | ||
74 | + } | ||
75 | + if ($manufacture_name) { | ||
76 | + $where[] = ['like', 'mf.name', $manufacture_name]; | ||
77 | + } | ||
78 | + if ($model_name) { | ||
79 | + $where[] = ['like', 'md.name', $model_name]; | ||
80 | + } | ||
81 | + if ($device_id) { | ||
82 | + $where[] = ['like', 'ds.device_id', $device_id]; | ||
83 | + } | ||
84 | + if ($barcode) { | ||
85 | + $where[] = ['like', 'ds.barcode', $barcode]; | ||
86 | + } | ||
87 | + if ($city) { | ||
88 | + $where[] = ['like', 'ds.city', $city]; | ||
89 | + } | ||
90 | + | ||
91 | + if ($type == 0) { | ||
92 | + $pageList = DeviceStatsRepository::getPageList($where, 0 , 0); | ||
93 | + $pages = null; | ||
94 | + } else { | ||
95 | + $pageSize = 20; | ||
96 | + $pages = new Pagination(['totalCount' => DeviceStatsRepository::getPageCount($where), 'pageSize' => $pageSize]); | ||
97 | + $pageList = DeviceStatsRepository::getPageList($where, $pages->offset, $pages->limit); | ||
98 | + } | ||
99 | + | ||
100 | + /** | ||
101 | + * 数据整理 | ||
102 | + */ | ||
103 | + return [ | ||
104 | + 'listdata' => $pageList, | ||
105 | + 'pages' => $pages, | ||
106 | + 'gets' => $gets | ||
107 | + ]; | ||
108 | + } | ||
109 | + | ||
110 | + /** | ||
111 | + * 导出设备状态数据 | ||
112 | + * @return string | ||
113 | + */ | ||
114 | + public function actionExport() | ||
115 | + { | ||
116 | + $params = $this->dataList(0); | ||
117 | + return $this->renderPartial('export', $params); | ||
118 | + } | ||
119 | +} | ||
0 | \ No newline at end of file | 120 | \ No newline at end of file |
@@ -0,0 +1,66 @@ | @@ -0,0 +1,66 @@ | ||
1 | +<?php | ||
2 | + | ||
3 | +use domain\upgrade\UpgradeLogStatus; | ||
4 | + | ||
5 | +header('Content-Type: application/vnd.ms-excel;charset=utf-8'); | ||
6 | +$title = date('Y-m-d') . '_机器状态统计数据'; | ||
7 | +$name = $title . ".xls"; | ||
8 | +header('Content-Disposition: attachment;filename=' . $name . ''); | ||
9 | +header('Cache-Control: max-age=0'); | ||
10 | +$fp = fopen('php://output', 'a'); | ||
11 | +$limit = 10000; | ||
12 | +$cnt = 0; | ||
13 | +?> | ||
14 | +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" | ||
15 | + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> | ||
16 | +<html xmlns:o="urn:schemas-microsoft-com:office:office" | ||
17 | + xmlns:x="urn:schemas-microsoft-com:office:excel" | ||
18 | + xmlns="http://www.w3.org/TR/REC-html40"> | ||
19 | + | ||
20 | +<head> | ||
21 | + <meta http-equiv=Content-Type content="text/html; charset=utf-8"> | ||
22 | + | ||
23 | +</head> | ||
24 | +<body> | ||
25 | +<div id="Classeur1_16681" align='center' x:publishsource="Excel"> | ||
26 | + <table border='1' cellpadding='0' cellspacing='0' width='100%' style="border-collapse: collapse"> | ||
27 | + <thead> | ||
28 | + <tr> | ||
29 | + <th width="10%">设备ID</th> | ||
30 | + <th width="10%">Barcode</th> | ||
31 | + <th width="10%">硬件版本</th> | ||
32 | + <th width="10%">软件版本</th> | ||
33 | + <th width="10%">厂商</th> | ||
34 | + <th width="10%">设备型号</th> | ||
35 | + <th width="10%">所在城市</th> | ||
36 | + <th width="10%">IP地址</th> | ||
37 | + <th width="15%">时间</th> | ||
38 | + </tr> | ||
39 | + </thead> | ||
40 | + <tbody> | ||
41 | + <?php foreach ($listdata as $key => $item) : ?> | ||
42 | + <tr> | ||
43 | + <td style="padding:12px;"><?= (isset($item["device_id"]) ? $item["device_id"] : "-") ?></td> | ||
44 | + <td style="padding:12px;"><?= (isset($item["barcode"]) ? $item["barcode"] : "-") ?></td> | ||
45 | + <td style="padding:12px;"><?= (isset($item["software_version"]) ? $item["software_version"] : "-") ?></td> | ||
46 | + <td style="padding:12px;"><?= (isset($item["hardware_version"]) ? $item["hardware_version"] : "-") ?></td> | ||
47 | + <td style="padding:12px;"><?= (isset($item["manufacture_name"]) ? $item["manufacture_name"] : "-") ?></td> | ||
48 | + <td style="padding:12px;"><?= (isset($item["model_name"]) ? $item["model_name"] : "") ?></td> | ||
49 | + <td style="padding:12px;"><?= empty($item["city"])? '-':$item["city"]?></td> | ||
50 | + <td style="padding:12px;"><?= $item["ip"]?></td> | ||
51 | + <td style="padding:12px;"><?= date("Y-m-d H:i:s", $item['created_at'])?></td> | ||
52 | + </tr> | ||
53 | + <?php | ||
54 | + $cnt++; | ||
55 | + if (1000 == $cnt) { //刷新一下输出buffer,防止由于数据过多造成问题 | ||
56 | + ob_flush(); | ||
57 | + flush(); | ||
58 | + $cnt = 0; | ||
59 | + } | ||
60 | + ?> | ||
61 | + <?php endforeach; ?> | ||
62 | + </tbody> | ||
63 | + </table> | ||
64 | +</div> | ||
65 | +</body> | ||
66 | +</html> | ||
0 | \ No newline at end of file | 67 | \ No newline at end of file |
@@ -0,0 +1,160 @@ | @@ -0,0 +1,160 @@ | ||
1 | +<?php | ||
2 | + | ||
3 | +use yii\helpers\Url; | ||
4 | +use app\ht\widgets\LinkPager; | ||
5 | +use domain\upgrade\UpgradeStatus; | ||
6 | +use domain\upgrade\UpgradeLogStatus; | ||
7 | + | ||
8 | +$this->params['breadcrumbs'][] = '机器状态统计'; | ||
9 | +?> | ||
10 | +<style> | ||
11 | + .table > tbody > tr > td | ||
12 | + { | ||
13 | + border: white 0px solid; | ||
14 | + border-top: solid 1px #fff; | ||
15 | + border-bottom: 1px solid #fff; | ||
16 | + } | ||
17 | + .table{ | ||
18 | + margin-bottom: 0px!important; | ||
19 | + } | ||
20 | +</style> | ||
21 | +<div class="panel panel-default"> | ||
22 | + <div class="panel-body"> | ||
23 | + <form action="" method="get" id="search-form" class="filter-form"> | ||
24 | + <table width="100%" class="table"> | ||
25 | + <tbody> | ||
26 | + <tr > | ||
27 | + <td width="10%" class="text-right">barcode</td> | ||
28 | + <td width="10%" class="text-left"> | ||
29 | + <input type="text" class="form-control" name="barcode" style="width: 150px;" placeholder="barcode" value="<?php if (!empty($gets['barcode'])){ echo $gets['barcode']; } ?>"> | ||
30 | + </td> | ||
31 | + <td width="10%" class="text-right">设备ID</td> | ||
32 | + <td width="10%" class="text-left"> | ||
33 | + <input type="text" class="form-control" name="device_id" style="width: 150px;" placeholder="设备ID" value="<?php if (!empty($gets['device_id'])){ echo $gets['device_id']; } ?>"> | ||
34 | + </td> | ||
35 | + <td width="10%" class="text-right">厂商</td> | ||
36 | + <td width="10%" class="text-left"> | ||
37 | + <input type="text" class="form-control" name="manufacture_name" style="width: 150px;" placeholder="输入厂商" value="<?php if (!empty($gets['manufacture_name'])){ echo $gets['manufacture_name']; } ?>"> | ||
38 | + </td> | ||
39 | + <td width="10%" class="text-right">机器型号</td> | ||
40 | + <td width="30%" class="text-left"> | ||
41 | + <input type="text" class="form-control" name="model_name" style="width: 290px;" placeholder="机器型号" value="<?php if (!empty($gets['model_name'])){ echo $gets['model_name']; } ?>"> | ||
42 | + </td> | ||
43 | + </tr> | ||
44 | + <tr> | ||
45 | + <td class="text-right">软件版本</td> | ||
46 | + <td class="text-left"> | ||
47 | + <input type="text" class="form-control" name="software_version" style="width: 150px;" placeholder="软件版本" value="<?php if (!empty($gets['software_version'])){ echo $gets['software_version']; } ?>"> | ||
48 | + </td> | ||
49 | + <td class="text-right">硬件版本</td> | ||
50 | + <td class="text-left"> | ||
51 | + <input type="text" class="form-control" name="hardware_version" style="width: 150px;" placeholder="硬件版本" value="<?php if (!empty($gets['hardware_version'])){ echo $gets['hardware_version']; } ?>"> | ||
52 | + </select> | ||
53 | + </td> | ||
54 | + <td class="text-right">所在城市</td> | ||
55 | + <td class="text-left"> | ||
56 | + <input type="text" class="form-control" name="city" style="width: 150px;" placeholder="城市" value="<?php if (!empty($gets['city'])){ echo $gets['city']; } ?>"> | ||
57 | + </td> | ||
58 | + <td class="text-right">时间</td> | ||
59 | + <td class="text-left"> | ||
60 | + <div class="form-inline"> | ||
61 | + <input type="date" class="form-control" style="width: 140px;" name="createTime" placeholder="起" value="<?php if (!empty($gets['createTime'])){ echo $gets['createTime']; } ?>"> - | ||
62 | + <input type="date" class="form-control" style="width: 140px;" name="endTime" placeholder="止" value="<?php if (!empty($gets['endTime'])){ echo $gets['endTime']; } ?>"> | ||
63 | + </div> | ||
64 | + </td> | ||
65 | + </tr> | ||
66 | + | ||
67 | + <tr class="search"> | ||
68 | + <td colspan="8" class="text-center"> | ||
69 | + | ||
70 | + <button type="submit" class="btn btn-primary btncls" id="search"><i class="glyphicon glyphicon-search"></i> 查 询 </button> | ||
71 | + <a class="btn btn-default btncls" href="<?=Url::toRoute(["/datas/device-stats/index"])?>">重 置</a> | ||
72 | + <a class="btn btn-default" style="float: right;" href="javascript:void(0)" id="btn-export"> 导出数据 </a> | ||
73 | + </td> | ||
74 | + </tr> | ||
75 | + </tbody> | ||
76 | + </table> | ||
77 | + </form> | ||
78 | + </div> | ||
79 | +</div> | ||
80 | + | ||
81 | +<div class="panel panel-default"> | ||
82 | + <div class="panel-body"> | ||
83 | + <table class="table table-striped table-bordered" id="brand-table"> | ||
84 | + <thead> | ||
85 | + <tr> | ||
86 | + <th width="10%">设备ID</th> | ||
87 | + <th width="10%">Barcode</th> | ||
88 | + <th width="10%">硬件版本</th> | ||
89 | + <th width="10%">软件版本</th> | ||
90 | + <th width="10%">厂商</th> | ||
91 | + <th width="10%">设备型号</th> | ||
92 | + <th width="10%">所在城市</th> | ||
93 | + <th width="10%">IP地址</th> | ||
94 | + <th width="15%">时间</th> | ||
95 | + </tr> | ||
96 | + </thead> | ||
97 | + | ||
98 | + <tbody> | ||
99 | + <?php if ($listdata) { ?> | ||
100 | + <?php foreach ($listdata as $item) : ?> | ||
101 | + <tr> | ||
102 | + <td style="padding:12px;"><?= (isset($item["device_id"]) ? $item["device_id"] : "-") ?></td> | ||
103 | + <td style="padding:12px;"><?= (isset($item["barcode"]) ? $item["barcode"] : "-") ?></td> | ||
104 | + <td style="padding:12px;"><?= (isset($item["software_version"]) ? $item["software_version"] : "-") ?></td> | ||
105 | + <td style="padding:12px;"><?= (isset($item["hardware_version"]) ? $item["hardware_version"] : "-") ?></td> | ||
106 | + <td style="padding:12px;"><?= (isset($item["manufacture_name"]) ? $item["manufacture_name"] : "-") ?></td> | ||
107 | + <td style="padding:12px;"><?= (isset($item["model_name"]) ? $item["model_name"] : "") ?></td> | ||
108 | + <td style="padding:12px;"><?= empty($item["city"])? '-':$item["city"]?></td> | ||
109 | + <td style="padding:12px;"><?= $item["ip"]?></td> | ||
110 | + <td style="padding:12px;"><?= date("Y-m-d H:i:s", $item['created_at'])?></td> | ||
111 | + </tr> | ||
112 | + <?php endforeach; ?> | ||
113 | + <?php } else { ?> | ||
114 | + <tr> | ||
115 | + <td colspan="9"> | ||
116 | + <center>暂无记录</center> | ||
117 | + </td> | ||
118 | + </tr> | ||
119 | + <?php } ?> | ||
120 | + </tbody> | ||
121 | + </table> | ||
122 | + </div> | ||
123 | + | ||
124 | + <div class="panel-footer"> | ||
125 | + <div class="hqy-panel-pager"> | ||
126 | + <?= LinkPager::widget([ | ||
127 | + 'pagination' => $pages, | ||
128 | + ]); ?> | ||
129 | + <div class="clearfix"></div> | ||
130 | + </div> | ||
131 | + </div> | ||
132 | +</div> | ||
133 | +<script> | ||
134 | + window.queryParams = function(params) { | ||
135 | + $("#search-form").find('input[name]').each(function () { | ||
136 | + var val = $(this).val(); | ||
137 | + var name = $(this).attr('name'); | ||
138 | + if(val){ | ||
139 | + params[name] = val; | ||
140 | + } | ||
141 | + }); | ||
142 | + return params; | ||
143 | + } | ||
144 | + $(document).ready(function () { | ||
145 | + $('#btn-export').click(function(e){ | ||
146 | + var params = {}; | ||
147 | + window.queryParams(params); | ||
148 | + | ||
149 | + $strQuery = "?"; | ||
150 | + if (params) { | ||
151 | + for (var p in params) { | ||
152 | + $strQuery += p + "=" + params[p] + "&"; | ||
153 | + } | ||
154 | + } | ||
155 | + $strQuery = $strQuery.substring(0, $strQuery.length-1); | ||
156 | + window.location.href = "export" + $strQuery; | ||
157 | + return false; | ||
158 | + }) | ||
159 | + }); | ||
160 | +</script> | ||
0 | \ No newline at end of file | 161 | \ No newline at end of file |
app-ht/modules/device/config/perm.php
app-ht/modules/device/controllers/DeviceController.php
@@ -3,6 +3,7 @@ | @@ -3,6 +3,7 @@ | ||
3 | namespace app\ht\modules\device\controllers; | 3 | namespace app\ht\modules\device\controllers; |
4 | 4 | ||
5 | 5 | ||
6 | +use domain\device\DeviceAuthFailRepository; | ||
6 | use Yii; | 7 | use Yii; |
7 | use yii\base\Exception; | 8 | use yii\base\Exception; |
8 | use yii\data\Pagination; | 9 | use yii\data\Pagination; |
@@ -103,7 +104,8 @@ class DeviceController extends BaseController | @@ -103,7 +104,8 @@ class DeviceController extends BaseController | ||
103 | } | 104 | } |
104 | 105 | ||
105 | /** | 106 | /** |
106 | - * | 107 | + * @return string |
108 | + * @throws \yii\db\Exception | ||
107 | */ | 109 | */ |
108 | public function actionDoCreateDevice() | 110 | public function actionDoCreateDevice() |
109 | { | 111 | { |
@@ -203,6 +205,69 @@ class DeviceController extends BaseController | @@ -203,6 +205,69 @@ class DeviceController extends BaseController | ||
203 | 205 | ||
204 | } | 206 | } |
205 | 207 | ||
208 | + public function actionAuthFailIndex() | ||
209 | + { | ||
210 | + $request = Yii::$app->request; | ||
211 | + $serialNo = $request->get('serial_no'); | ||
212 | + $mac = $request->get('mac'); | ||
213 | + $project = $request->get('project'); | ||
214 | + $model = $request->get('model'); | ||
215 | + $production = $request->get('production'); | ||
216 | + $manufacture = $request->get('manufacture'); | ||
217 | + $deviceId = $request->get('device_id'); | ||
218 | + $status = $request->get('status'); | ||
219 | + $page = $request->get('page'); | ||
220 | + $where = [ | ||
221 | + 'and', | ||
222 | + ['=','a.is_delete', 0] | ||
223 | + ]; | ||
224 | + if (!empty($serialNo)) { | ||
225 | + $where[] = ['like', 'a.serial_no', $serialNo]; | ||
226 | + } | ||
227 | + if (!empty($project)) { | ||
228 | + $where[] = ['like', 'p.name', $project]; | ||
229 | + } | ||
230 | + if (!empty($model)) { | ||
231 | + $where[] = ['like', 'mo.name', $model]; | ||
232 | + } | ||
233 | + if (!empty($production)) { | ||
234 | + $where[] = ['like', 'pd.name', $production]; | ||
235 | + } | ||
236 | + if (!empty($mac)) { | ||
237 | + $where[] = ['like', 'a.mac', $mac]; | ||
238 | + } | ||
239 | + if (!empty($manufacture)) { | ||
240 | + $where[] = ['like', 'm.name', $manufacture]; | ||
241 | + } | ||
242 | + if (!empty($deviceId)) { | ||
243 | + $where[] = ['like', 'a.device_id', $deviceId]; | ||
244 | + } | ||
245 | + if (isset($_GET['status']) && -1 != $status) { | ||
246 | + $where[] = ['=', 'a.status', $status]; | ||
247 | + } | ||
248 | + | ||
249 | + if (0 >= $page) { | ||
250 | + $page = 1; | ||
251 | + } | ||
252 | + $pageSize = 20; | ||
253 | + $page = ($page -1) * $pageSize; | ||
254 | + // DeviceRepository::getList($where, $pageSize, $page); | ||
255 | + $deviceData = DeviceAuthFailRepository::getList($where, $pageSize, $page); | ||
256 | + $pages = new Pagination(['totalCount' => DeviceAuthFailRepository::getListCount($where), 'pageSize' => $pageSize]); | ||
257 | + | ||
258 | + $params['deviceList'] = $deviceData; | ||
259 | + $params['pages'] = $pages; | ||
260 | + $params["gets"] = [ | ||
261 | + 'project' => $project, | ||
262 | + 'model' => $model, | ||
263 | + 'device_id' => $deviceId, | ||
264 | + 'production' => $production, | ||
265 | + 'manufacture' => $manufacture, | ||
266 | + ]; | ||
267 | + | ||
268 | + return $this->render('auth-fail-index', $params); | ||
269 | + } | ||
270 | + | ||
206 | /** | 271 | /** |
207 | * @return string | 272 | * @return string |
208 | */ | 273 | */ |
@@ -0,0 +1,163 @@ | @@ -0,0 +1,163 @@ | ||
1 | +<?php | ||
2 | +use yii\helpers\Url; | ||
3 | +use app\ht\widgets\LinkPager; | ||
4 | +use domain\device\DeviceStatus; | ||
5 | + | ||
6 | +$this->title = '授权失败管理'; | ||
7 | +$this->params['breadcrumbs'][] = '失败序列号管理'; | ||
8 | +$this->params['breadcrumbs'][] = $this->title; | ||
9 | +?> | ||
10 | +<style> | ||
11 | + .cell-cls{width:60%;word-wrap: break-word} | ||
12 | + .td-cls{padding:8px 0} | ||
13 | +</style> | ||
14 | +<div class="panel panel-default"> | ||
15 | + <div class="panel-body"> | ||
16 | + <form action="" method="get" id="search-form" class="filter-form"> | ||
17 | + <div class="form-group col-sm-12"> | ||
18 | + <label for="manufacture" class="col-sm-1 control-label text-right">厂商:</label> | ||
19 | + <div class="col-sm-2 form-inline"> | ||
20 | + <input type="text" class="form-control" id="manufacture" name="manufacture" value="<?php if (!empty($gets['manufacture'])){ echo $gets['manufacture'];} ?>" autocomplete="off"> | ||
21 | + </div> | ||
22 | + <label for="project" class="col-sm-1 control-label text-right">项目名:</label> | ||
23 | + <div class="col-sm-2 form-inline"> | ||
24 | + <input type="text" class="form-control" id="project" name="project" value="<?php if (!empty($gets['project'])){ echo $gets['project'];} ?>" autocomplete="off"> | ||
25 | + </div> | ||
26 | + <label for="model" class="col-sm-1 control-label text-right">型号:</label> | ||
27 | + <div class="col-sm-2 form-inline"> | ||
28 | + <input type="text" class="form-control" id="model" name="model" value="<?php if (!empty($gets['model'])){ echo $gets['model'];} ?>" autocomplete="off"> | ||
29 | + </div> | ||
30 | + <label for="production" class="col-sm-1 control-label text-right">生产日期:</label> | ||
31 | + <div class="col-sm-2 form-inline"> | ||
32 | + <input type="text" class="form-control" id="production" name="production" value="<?php if (!empty($gets['production'])){ echo $gets['production'];} ?>" autocomplete="off"> | ||
33 | + </div> | ||
34 | + </div> | ||
35 | + | ||
36 | + <div class="form-group col-sm-12"> | ||
37 | + | ||
38 | + <label for="device_id" class="col-sm-1 control-label text-right">设备ID:</label> | ||
39 | + <div class="col-sm-2 form-inline"> | ||
40 | + <input type="text" class="form-control" id="device_id" name="device_id" value="<?php if (!empty($gets['device_id'])){ echo $gets['device_id'];} ?>" autocomplete="off"> | ||
41 | + </div> | ||
42 | + <label for="handel" class="col-sm-1 control-label text-right">处理状态:</label> | ||
43 | + <div class="col-sm-2 form-inline"> | ||
44 | + <input type="text" class="form-control" id="handel" name="handel" value="<?php if (!empty($gets['handel'])){ echo $gets['handel'];} ?>" autocomplete="off"> | ||
45 | + </div> | ||
46 | + <label for="apply_at" class="col-sm-1 control-label text-right">申请时间:</label> | ||
47 | + <div class="col-sm-2 form-inline"> | ||
48 | + <input type="text" class="form-control" id="apply_at" name="apply_at" value="<?php if (!empty($gets['apply_at'])){ echo $gets['apply_at'];} ?>" autocomplete="off"> | ||
49 | + </div> | ||
50 | + | ||
51 | + </div> | ||
52 | + | ||
53 | + | ||
54 | + | ||
55 | + <div class="form-group col-sm-12" style="text-align: center;"> | ||
56 | + <button type="submit" class="btn btn-primary font-1" id="submitFilterBtn">查询</button> | ||
57 | + </div> | ||
58 | + </form> | ||
59 | + </div> | ||
60 | +</div> | ||
61 | + | ||
62 | +<div class="panel panel-default"> | ||
63 | + <div class="panel-body"> | ||
64 | + <table class="table table-striped table-bordered" id="brand-table"> | ||
65 | + <thead> | ||
66 | + <tr> | ||
67 | + <th width="6%">ID</th> | ||
68 | + <th width="15%">厂商</th> | ||
69 | + <th width="6%">项目</th> | ||
70 | + <th width="8%">设备型号</th> | ||
71 | + <th width="8%">生产日期</th> | ||
72 | + <th width="15%">设备ID</th> | ||
73 | + <th width="10%">申请时间</th> | ||
74 | + <th width="20%">操作</th> | ||
75 | + </tr> | ||
76 | + </thead> | ||
77 | + | ||
78 | + <tbody> | ||
79 | + <?php if ($deviceList) { ?> | ||
80 | + <?php foreach ($deviceList as $item) : ?> | ||
81 | + <tr> | ||
82 | + <td class="td-cls"> | ||
83 | + <?= $item['id'] ?> | ||
84 | + </td> | ||
85 | + | ||
86 | + <td class="td-cls"> | ||
87 | + <?= $item['manufacture'] ?> | ||
88 | + </td> | ||
89 | + <td class="td-cls"> | ||
90 | + <?= $item['project'] ?> | ||
91 | + </td> | ||
92 | + <td class="td-cls"> | ||
93 | + <?= $item['model'] ?> | ||
94 | + </td> | ||
95 | + <td class="td-cls"> | ||
96 | + <?= $item['production'] ?> | ||
97 | + </td> | ||
98 | + | ||
99 | + <td class="td-cls"> | ||
100 | + <?= $item['device_id']? $item['device_id']:'暂无'?> | ||
101 | + </td> | ||
102 | + <td class="td-cls"> | ||
103 | + <?= $item['apply_at']?date('Y-m-d H:i:s', $item['apply_at']):'暂无' ?> | ||
104 | + </td> | ||
105 | + | ||
106 | + <td class="td-cls"> | ||
107 | + <button class="btn btn-info btn-sm btn_edit" aid="<?=$item['id'] ?>">编辑</button> | | ||
108 | + <button class="btn btn-primary btn-sm btn_auth" aid="<?=$item['id'] ?>">授权</button> | ||
109 | + </td> | ||
110 | + </tr> | ||
111 | + <?php endforeach; ?> | ||
112 | + <?php } else { ?> | ||
113 | + <tr> | ||
114 | + <td colspan="12"> | ||
115 | + <center>暂无记录</center> | ||
116 | + </td> | ||
117 | + </tr> | ||
118 | + <?php } ?> | ||
119 | + </tbody> | ||
120 | + </table> | ||
121 | + </div> | ||
122 | + | ||
123 | + <div class="panel-footer"> | ||
124 | + <div class="hqy-panel-pager"> | ||
125 | + <?= LinkPager::widget([ | ||
126 | + 'pagination' => $pages, | ||
127 | + ]); ?> | ||
128 | + <div class="clearfix"></div> | ||
129 | + </div> | ||
130 | + </div> | ||
131 | +</div> | ||
132 | + | ||
133 | +<script> | ||
134 | + var authURL = "<?=Url::toRoute('/device/device/auth-device')?>"; | ||
135 | + var delURL = "<?=Url::toRoute('/device/device/del-device')?>"; | ||
136 | + $(function () { | ||
137 | + $('.btn_auth').click(function(e) { | ||
138 | + var aid = $(this).attr('aid'); | ||
139 | + $.post(authURL, {id:aid}, function(res) { | ||
140 | + if (!res.success) { | ||
141 | + alert(res.message); | ||
142 | + return false; | ||
143 | + } | ||
144 | + window.location.reload(); | ||
145 | + }, 'json') | ||
146 | + }) | ||
147 | + | ||
148 | + //btn_del | ||
149 | + $('.btn_del').click(function(e) { | ||
150 | + if (!confirm('确定删除!')) { | ||
151 | + return false; | ||
152 | + } | ||
153 | + var aid = $(this).attr('aid'); | ||
154 | + $.post(delURL, {id:aid}, function(res) { | ||
155 | + if (!res.success) { | ||
156 | + alert(res.message); | ||
157 | + return false; | ||
158 | + } | ||
159 | + window.location.reload(); | ||
160 | + }, 'json') | ||
161 | + }) | ||
162 | + }); | ||
163 | +</script> | ||
0 | \ No newline at end of file | 164 | \ No newline at end of file |
app-ht/modules/device/views/device/index.php
@@ -127,10 +127,10 @@ $this->params['breadcrumbs'][] = $this->title; | @@ -127,10 +127,10 @@ $this->params['breadcrumbs'][] = $this->title; | ||
127 | <?= $item['production'] ?> | 127 | <?= $item['production'] ?> |
128 | </td> | 128 | </td> |
129 | <td class="td-cls"> | 129 | <td class="td-cls"> |
130 | - <div class="cell-cls"><?= $item['mac'] ?></div> | 130 | + <div class="cell-cls edit_mac edit_mac_<?=$item['id']?>" data-id="<?=$item['id']?>" data="<?= $item['mac'] ?>"><?= $item['mac'] ?></div> |
131 | </td> | 131 | </td> |
132 | <td class="td-cls"> | 132 | <td class="td-cls"> |
133 | - <?= $item['device_id']? $item['device_id']:'暂无'?> | 133 | + <div class="edit_device edit_device_<?=$item['id']?>" data-id="<?=$item['id']?>" data="<?=$item['device_id']?>"><?= $item['device_id']? $item['device_id']:'暂无'?></div> |
134 | </td> | 134 | </td> |
135 | <td class="td-cls"> | 135 | <td class="td-cls"> |
136 | <?= $item['apply_at']?date('Y-m-d H:i:s', $item['apply_at']):'暂无' ?> | 136 | <?= $item['apply_at']?date('Y-m-d H:i:s', $item['apply_at']):'暂无' ?> |
@@ -142,7 +142,7 @@ $this->params['breadcrumbs'][] = $this->title; | @@ -142,7 +142,7 @@ $this->params['breadcrumbs'][] = $this->title; | ||
142 | <?= $statusList[$item['status']] ?> | 142 | <?= $statusList[$item['status']] ?> |
143 | </td> | 143 | </td> |
144 | <td class="td-cls"> | 144 | <td class="td-cls"> |
145 | - <button class="btn btn-info btn-sm btn_edit" aid="<?=$item['id'] ?>">编辑</button> | | 145 | + <button class="btn btn-info btn-sm btn_edit" aid="<?=$item['id'] ?>" data-action="edit">编辑</button> | |
146 | <?php if(DeviceStatus::HAS_AUTH != $item['status']){?> <button class="btn btn-primary btn-sm btn_auth" aid="<?=$item['id'] ?>">授权</button> | <?php }?> | 146 | <?php if(DeviceStatus::HAS_AUTH != $item['status']){?> <button class="btn btn-primary btn-sm btn_auth" aid="<?=$item['id'] ?>">授权</button> | <?php }?> |
147 | <button class="btn btn-danger btn-sm btn_del" aid="<?=$item['id'] ?>">删除</button> | 147 | <button class="btn btn-danger btn-sm btn_del" aid="<?=$item['id'] ?>">删除</button> |
148 | </td> | 148 | </td> |
@@ -198,5 +198,44 @@ $this->params['breadcrumbs'][] = $this->title; | @@ -198,5 +198,44 @@ $this->params['breadcrumbs'][] = $this->title; | ||
198 | window.location.reload(); | 198 | window.location.reload(); |
199 | }, 'json') | 199 | }, 'json') |
200 | }) | 200 | }) |
201 | + $('.btn_edit').click(function(e) { | ||
202 | + var action = $(this).attr('data-action') | ||
203 | + var id = $(this).attr('aid'); | ||
204 | + var editMac = $('.edit_mac_'+id); | ||
205 | + var editDevice = $('.edit_device_'+id); | ||
206 | + | ||
207 | + if ('edit' == action ) { | ||
208 | + var editMacs = $('.edit_mac'); | ||
209 | + $.each(editMacs, function(i,n){ | ||
210 | + $(n).html($(n).attr('data')); | ||
211 | + }) | ||
212 | + var editDevices = $('.edit_device'); | ||
213 | + $.each(editDevices, function(i,n){ | ||
214 | + $(n).html($(n).attr('data')); | ||
215 | + }) | ||
216 | + var btnEdits = $('.btn_edit'); | ||
217 | + $.each(btnEdits, function(i,n){ | ||
218 | + $(n).html('编辑').attr('data-action','edit'); | ||
219 | + }) | ||
220 | + $(this).html('保存').attr('data-action','save'); | ||
221 | + | ||
222 | + var editMacVal = editMac.attr('data'); | ||
223 | + var editDeviceVal = editDevice.attr('data'); | ||
224 | + editMac.html('<input type="text" class="mac_edit" value="'+editMacVal+'">'); | ||
225 | + editDevice.html('<input type="text" class="device_edit" value="'+editDeviceVal+'">'); | ||
226 | + } else { | ||
227 | + var newMAc = editMac.find('.mac_edit').val(); | ||
228 | + var newDevice = editDevice.find('.device_edit').val(); | ||
229 | + // 请求之后保存 | ||
230 | + //$.post() | ||
231 | + editMac.html(newMAc).attr('data', newMAc); | ||
232 | + editDevice.html(newDevice).attr('data', newDevice); | ||
233 | + $(this).html('编辑').attr('data-action','edit'); | ||
234 | + } | ||
235 | + | ||
236 | + | ||
237 | + }) | ||
238 | + | ||
239 | + | ||
201 | }); | 240 | }); |
202 | </script> | 241 | </script> |
203 | \ No newline at end of file | 242 | \ No newline at end of file |
app-ht/modules/upgrade/controllers/UpgradeController.php
@@ -369,7 +369,8 @@ class UpgradeController extends BaseController | @@ -369,7 +369,8 @@ class UpgradeController extends BaseController | ||
369 | * 值:4; 没有文件被上传。 | 369 | * 值:4; 没有文件被上传。 |
370 | * date:2018.4.18 from:zhix.net | 370 | * date:2018.4.18 from:zhix.net |
371 | */ | 371 | */ |
372 | - public function actionUploadFile(){ | 372 | + public function actionUploadFile() |
373 | + { | ||
373 | header("Expires: Mon, 26 Jul 2020 05:00:00 GMT"); | 374 | header("Expires: Mon, 26 Jul 2020 05:00:00 GMT"); |
374 | header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); | 375 | header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); |
375 | header("Content-type: text/html; charset=utf-8"); | 376 | header("Content-type: text/html; charset=utf-8"); |
@@ -502,12 +503,12 @@ class UpgradeController extends BaseController | @@ -502,12 +503,12 @@ class UpgradeController extends BaseController | ||
502 | } | 503 | } |
503 | fclose($out); | 504 | fclose($out); |
504 | $response = [ | 505 | $response = [ |
505 | - 'success'=>true, | ||
506 | - 'oldName'=>$oldName, | ||
507 | - 'filePath'=>$savePath, | ||
508 | - 'fileSize'=>filesize($uploadPath), | ||
509 | - 'fileSuffixes'=>$pathInfo['extension'], //文件后缀名 | ||
510 | - 'file_md5'=>md5_file($uploadPath), | 506 | + 'success' => true, |
507 | + 'oldName' => $oldName, | ||
508 | + 'filePath' => $savePath, | ||
509 | + 'fileSize' => filesize($uploadPath), | ||
510 | + 'fileSuffixes' => $pathInfo['extension'], //文件后缀名 | ||
511 | + 'file_md5' => md5_file($uploadPath), | ||
511 | ]; | 512 | ]; |
512 | /** | 513 | /** |
513 | * 后台操作日志 | 514 | * 后台操作日志 |
app-ht/views/layouts/routes.php
@@ -56,7 +56,9 @@ if (isset($user->is_manufacture) && $user->is_manufacture == 1) { | @@ -56,7 +56,9 @@ if (isset($user->is_manufacture) && $user->is_manufacture == 1) { | ||
56 | 'path' => '/device', | 56 | 'path' => '/device', |
57 | 'redirect' => '/device/device/index' | 57 | 'redirect' => '/device/device/index' |
58 | ], | 58 | ], |
59 | + | ||
59 | ['label' => '序列号管理', 'path' => '/device/device/index'], | 60 | ['label' => '序列号管理', 'path' => '/device/device/index'], |
61 | + ['label' => '授权失败管理', 'path' => '/device/device/auth-fail-index'], | ||
60 | ['label' => '创建序列号', 'path' => '/device/device/create-device'], | 62 | ['label' => '创建序列号', 'path' => '/device/device/create-device'], |
61 | ] | 63 | ] |
62 | ], | 64 | ], |
@@ -110,12 +112,12 @@ if (isset($user->is_manufacture) && $user->is_manufacture == 1) { | @@ -110,12 +112,12 @@ if (isset($user->is_manufacture) && $user->is_manufacture == 1) { | ||
110 | 'routes' => [ | 112 | 'routes' => [ |
111 | [ | 113 | [ |
112 | 'path' => '/datas', | 114 | 'path' => '/datas', |
113 | - 'redirect' => '/datas/datas/index' | 115 | + 'redirect' => '/datas/upgrade-log/index?type=' . UpgradeStatus::TYPE_OTA |
114 | ], | 116 | ], |
115 | - ['label' => '序列号统计', 'path' => '/datas/datas/index'], | 117 | + /*['label' => '序列号统计', 'path' => '/datas/datas/index'], */ |
116 | ['label' => 'OTA升级统计', 'path' => '/datas/upgrade-log/index?type=' . UpgradeStatus::TYPE_OTA], | 118 | ['label' => 'OTA升级统计', 'path' => '/datas/upgrade-log/index?type=' . UpgradeStatus::TYPE_OTA], |
117 | ['label' => 'APP升级统计', 'path' => '/datas/upgrade-log/index?type=' . UpgradeStatus::TYPE_APP], | 119 | ['label' => 'APP升级统计', 'path' => '/datas/upgrade-log/index?type=' . UpgradeStatus::TYPE_APP], |
118 | - ['label' => '机器状态统计', 'path' => '/datas/datas-setting/default'], | 120 | + ['label' => '机器状态统计', 'path' => '/datas/device-stats/index'], |
119 | ] | 121 | ] |
120 | ], | 122 | ], |
121 | [ | 123 | [ |
app-ht/web/exts-src/baidumap/MarkerClusterer.js
@@ -1,636 +0,0 @@ | @@ -1,636 +0,0 @@ | ||
1 | -/** | ||
2 | - * @fileoverview MarkerClusterer标记聚合器用来解决加载大量点要素到地图上产生覆盖现象的问题,并提高性能。 | ||
3 | - * 主入口类是<a href="symbols/BMapLib.MarkerClusterer.html">MarkerClusterer</a>, | ||
4 | - * 基于Baidu Map API 1.2。 | ||
5 | - * | ||
6 | - * @author Baidu Map Api Group | ||
7 | - * @version 1.2 | ||
8 | - */ | ||
9 | - | ||
10 | - | ||
11 | -/** | ||
12 | - * @namespace BMap的所有library类均放在BMapLib命名空间下 | ||
13 | - */ | ||
14 | -var BMapLib = window.BMapLib = BMapLib || {}; | ||
15 | -(function(){ | ||
16 | - | ||
17 | - /** | ||
18 | - * 获取一个扩展的视图范围,把上下左右都扩大一样的像素值。 | ||
19 | - * @param {Map} map BMap.Map的实例化对象 | ||
20 | - * @param {BMap.Bounds} bounds BMap.Bounds的实例化对象 | ||
21 | - * @param {Number} gridSize 要扩大的像素值 | ||
22 | - * | ||
23 | - * @return {BMap.Bounds} 返回扩大后的视图范围。 | ||
24 | - */ | ||
25 | - var getExtendedBounds = function(map, bounds, gridSize){ | ||
26 | - bounds = cutBoundsInRange(bounds); | ||
27 | - var pixelNE = map.pointToPixel(bounds.getNorthEast()); | ||
28 | - var pixelSW = map.pointToPixel(bounds.getSouthWest()); | ||
29 | - pixelNE.x += gridSize; | ||
30 | - pixelNE.y -= gridSize; | ||
31 | - pixelSW.x -= gridSize; | ||
32 | - pixelSW.y += gridSize; | ||
33 | - var newNE = map.pixelToPoint(pixelNE); | ||
34 | - var newSW = map.pixelToPoint(pixelSW); | ||
35 | - return new BMap.Bounds(newSW, newNE); | ||
36 | - }; | ||
37 | - | ||
38 | - /** | ||
39 | - * 按照百度地图支持的世界范围对bounds进行边界处理 | ||
40 | - * @param {BMap.Bounds} bounds BMap.Bounds的实例化对象 | ||
41 | - * | ||
42 | - * @return {BMap.Bounds} 返回不越界的视图范围 | ||
43 | - */ | ||
44 | - var cutBoundsInRange = function (bounds) { | ||
45 | - var maxX = getRange(bounds.getNorthEast().lng, -180, 180); | ||
46 | - var minX = getRange(bounds.getSouthWest().lng, -180, 180); | ||
47 | - var maxY = getRange(bounds.getNorthEast().lat, -74, 74); | ||
48 | - var minY = getRange(bounds.getSouthWest().lat, -74, 74); | ||
49 | - return new BMap.Bounds(new BMap.Point(minX, minY), new BMap.Point(maxX, maxY)); | ||
50 | - }; | ||
51 | - | ||
52 | - /** | ||
53 | - * 对单个值进行边界处理。 | ||
54 | - * @param {Number} i 要处理的数值 | ||
55 | - * @param {Number} min 下边界值 | ||
56 | - * @param {Number} max 上边界值 | ||
57 | - * | ||
58 | - * @return {Number} 返回不越界的数值 | ||
59 | - */ | ||
60 | - var getRange = function (i, mix, max) { | ||
61 | - mix && (i = Math.max(i, mix)); | ||
62 | - max && (i = Math.min(i, max)); | ||
63 | - return i; | ||
64 | - }; | ||
65 | - | ||
66 | - /** | ||
67 | - * 判断给定的对象是否为数组 | ||
68 | - * @param {Object} source 要测试的对象 | ||
69 | - * | ||
70 | - * @return {Boolean} 如果是数组返回true,否则返回false | ||
71 | - */ | ||
72 | - var isArray = function (source) { | ||
73 | - return '[object Array]' === Object.prototype.toString.call(source); | ||
74 | - }; | ||
75 | - | ||
76 | - /** | ||
77 | - * 返回item在source中的索引位置 | ||
78 | - * @param {Object} item 要测试的对象 | ||
79 | - * @param {Array} source 数组 | ||
80 | - * | ||
81 | - * @return {Number} 如果在数组内,返回索引,否则返回-1 | ||
82 | - */ | ||
83 | - var indexOf = function(item, source){ | ||
84 | - var index = -1; | ||
85 | - if(isArray(source)){ | ||
86 | - if (source.indexOf) { | ||
87 | - index = source.indexOf(item); | ||
88 | - } else { | ||
89 | - for (var i = 0, m; m = source[i]; i++) { | ||
90 | - if (m === item) { | ||
91 | - index = i; | ||
92 | - break; | ||
93 | - } | ||
94 | - } | ||
95 | - } | ||
96 | - } | ||
97 | - return index; | ||
98 | - }; | ||
99 | - | ||
100 | - /** | ||
101 | - *@exports MarkerClusterer as BMapLib.MarkerClusterer | ||
102 | - */ | ||
103 | - var MarkerClusterer = | ||
104 | - /** | ||
105 | - * MarkerClusterer | ||
106 | - * @class 用来解决加载大量点要素到地图上产生覆盖现象的问题,并提高性能 | ||
107 | - * @constructor | ||
108 | - * @param {Map} map 地图的一个实例。 | ||
109 | - * @param {Json Object} options 可选参数,可选项包括:<br /> | ||
110 | - * markers {Array<Marker>} 要聚合的标记数组<br /> | ||
111 | - * girdSize {Number} 聚合计算时网格的像素大小,默认60<br /> | ||
112 | - * maxZoom {Number} 最大的聚合级别,大于该级别就不进行相应的聚合<br /> | ||
113 | - * minClusterSize {Number} 最小的聚合数量,小于该数量的不能成为一个聚合,默认为2<br /> | ||
114 | - * isAverangeCenter {Boolean} 聚合点的落脚位置是否是所有聚合在内点的平均值,默认为否,落脚在聚合内的第一个点<br /> | ||
115 | - * styles {Array<IconStyle>} 自定义聚合后的图标风格,请参考TextIconOverlay类<br /> | ||
116 | - */ | ||
117 | - BMapLib.MarkerClusterer = function(map, options){ | ||
118 | - if (!map){ | ||
119 | - return; | ||
120 | - } | ||
121 | - this._map = map; | ||
122 | - this._markers = []; | ||
123 | - this._clusters = []; | ||
124 | - | ||
125 | - var opts = options || {}; | ||
126 | - this._gridSize = opts["gridSize"] || 60; | ||
127 | - this._maxZoom = opts["maxZoom"] || 18; | ||
128 | - this._minClusterSize = opts["minClusterSize"] || 2; | ||
129 | - this._isAverageCenter = false; | ||
130 | - if (opts['isAverageCenter'] != undefined) { | ||
131 | - this._isAverageCenter = opts['isAverageCenter']; | ||
132 | - } | ||
133 | - this._styles = opts["styles"] || []; | ||
134 | - | ||
135 | - var that = this; | ||
136 | - this._map.addEventListener("zoomend",function(){ | ||
137 | - that._redraw(); | ||
138 | - }); | ||
139 | - | ||
140 | - this._map.addEventListener("moveend",function(){ | ||
141 | - that._redraw(); | ||
142 | - }); | ||
143 | - | ||
144 | - var mkrs = opts["markers"]; | ||
145 | - isArray(mkrs) && this.addMarkers(mkrs); | ||
146 | - }; | ||
147 | - | ||
148 | - /** | ||
149 | - * 添加要聚合的标记数组。 | ||
150 | - * @param {Array<Marker>} markers 要聚合的标记数组 | ||
151 | - * | ||
152 | - * @return 无返回值。 | ||
153 | - */ | ||
154 | - MarkerClusterer.prototype.addMarkers = function(markers){ | ||
155 | - for(var i = 0, len = markers.length; i <len ; i++){ | ||
156 | - this._pushMarkerTo(markers[i]); | ||
157 | - } | ||
158 | - this._createClusters(); | ||
159 | - }; | ||
160 | - | ||
161 | - /** | ||
162 | - * 把一个标记添加到要聚合的标记数组中 | ||
163 | - * @param {BMap.Marker} marker 要添加的标记 | ||
164 | - * | ||
165 | - * @return 无返回值。 | ||
166 | - */ | ||
167 | - MarkerClusterer.prototype._pushMarkerTo = function(marker){ | ||
168 | - | ||
169 | - var index = indexOf(marker, this._markers); | ||
170 | - if(index === -1){ | ||
171 | - marker.isInCluster = false; | ||
172 | - this._markers.push(marker);//Marker拖放后enableDragging不做变化,忽略 | ||
173 | - } | ||
174 | - /* 用这个索引方式20万条数据可以把时间缩为原来的 20分之1, 但是会把重复坐标的给 排除 了*/ | ||
175 | - | ||
176 | - /* | ||
177 | - var position = marker.getPosition(); | ||
178 | - var key = 'A'+position.lng+'_'+position.lat; | ||
179 | - if (undefined === this._markers[key]) { | ||
180 | - marker.isInCluster = false; | ||
181 | - this._markers.push(marker); | ||
182 | - } | ||
183 | - */ | ||
184 | - }; | ||
185 | - | ||
186 | - /** | ||
187 | - * 添加一个聚合的标记。 | ||
188 | - * @param {BMap.Marker} marker 要聚合的单个标记。 | ||
189 | - * @return 无返回值。 | ||
190 | - */ | ||
191 | - MarkerClusterer.prototype.addMarker = function(marker) { | ||
192 | - this._pushMarkerTo(marker); | ||
193 | - this._createClusters(); | ||
194 | - }; | ||
195 | - | ||
196 | - /** | ||
197 | - * 根据所给定的标记,创建聚合点 | ||
198 | - * @return 无返回值 | ||
199 | - */ | ||
200 | - MarkerClusterer.prototype._createClusters = function(){ | ||
201 | - var mapBounds = this._map.getBounds(); | ||
202 | - var extendedBounds = getExtendedBounds(this._map, mapBounds, this._gridSize); | ||
203 | - for(var i = 0, marker; marker = this._markers[i]; i++){ | ||
204 | - if(!marker.isInCluster && extendedBounds.containsPoint(marker.getPosition()) ){ | ||
205 | - this._addToClosestCluster(marker); | ||
206 | - } | ||
207 | - } | ||
208 | - var len = this._markers.length; | ||
209 | - for (var i = 0; i < len; i++) { | ||
210 | - if(this._clusters[i]){ | ||
211 | - this._clusters[i].render(); | ||
212 | - } | ||
213 | - } | ||
214 | - }; | ||
215 | - | ||
216 | - /** | ||
217 | - * 根据标记的位置,把它添加到最近的聚合中 | ||
218 | - * @param {BMap.Marker} marker 要进行聚合的单个标记 | ||
219 | - * | ||
220 | - * @return 无返回值。 | ||
221 | - */ | ||
222 | - MarkerClusterer.prototype._addToClosestCluster = function (marker){ | ||
223 | - var distance = 4000000; | ||
224 | - var clusterToAddTo = null; | ||
225 | - var position = marker.getPosition(); | ||
226 | - for(var i = 0, cluster; cluster = this._clusters[i]; i++){ | ||
227 | - var center = cluster.getCenter(); | ||
228 | - if(center){ | ||
229 | - var d = this._map.getDistance(center, marker.getPosition()); | ||
230 | - if(d < distance){ | ||
231 | - distance = d; | ||
232 | - clusterToAddTo = cluster; | ||
233 | - } | ||
234 | - } | ||
235 | - } | ||
236 | - | ||
237 | - if (clusterToAddTo && clusterToAddTo.isMarkerInClusterBounds(marker)){ | ||
238 | - clusterToAddTo.addMarker(marker); | ||
239 | - } else { | ||
240 | - var cluster = new Cluster(this); | ||
241 | - cluster.addMarker(marker); | ||
242 | - this._clusters.push(cluster); | ||
243 | - } | ||
244 | - }; | ||
245 | - | ||
246 | - /** | ||
247 | - * 清除上一次的聚合的结果 | ||
248 | - * @return 无返回值。 | ||
249 | - */ | ||
250 | - MarkerClusterer.prototype._clearLastClusters = function(){ | ||
251 | - for(var i = 0, cluster; cluster = this._clusters[i]; i++){ | ||
252 | - cluster.remove(); | ||
253 | - } | ||
254 | - this._clusters = [];//置空Cluster数组 | ||
255 | - this._removeMarkersFromCluster();//把Marker的cluster标记设为false | ||
256 | - }; | ||
257 | - | ||
258 | - /** | ||
259 | - * 清除某个聚合中的所有标记 | ||
260 | - * @return 无返回值 | ||
261 | - */ | ||
262 | - MarkerClusterer.prototype._removeMarkersFromCluster = function(){ | ||
263 | - for(var i = 0, marker; marker = this._markers[i]; i++){ | ||
264 | - marker.isInCluster = false; | ||
265 | - } | ||
266 | - }; | ||
267 | - | ||
268 | - /** | ||
269 | - * 把所有的标记从地图上清除 | ||
270 | - * @return 无返回值 | ||
271 | - */ | ||
272 | - MarkerClusterer.prototype._removeMarkersFromMap = function(){ | ||
273 | - for(var i = 0, marker; marker = this._markers[i]; i++){ | ||
274 | - marker.isInCluster = false; | ||
275 | - this._map.removeOverlay(marker); | ||
276 | - } | ||
277 | - }; | ||
278 | - | ||
279 | - /** | ||
280 | - * 删除单个标记 | ||
281 | - * @param {BMap.Marker} marker 需要被删除的marker | ||
282 | - * | ||
283 | - * @return {Boolean} 删除成功返回true,否则返回false | ||
284 | - */ | ||
285 | - MarkerClusterer.prototype._removeMarker = function(marker) { | ||
286 | - var index = indexOf(marker, this._markers); | ||
287 | - if (index === -1) { | ||
288 | - return false; | ||
289 | - } | ||
290 | - this._map.removeOverlay(marker); | ||
291 | - this._markers.splice(index, 1); | ||
292 | - return true; | ||
293 | - }; | ||
294 | - | ||
295 | - /** | ||
296 | - * 删除单个标记 | ||
297 | - * @param {BMap.Marker} marker 需要被删除的marker | ||
298 | - * | ||
299 | - * @return {Boolean} 删除成功返回true,否则返回false | ||
300 | - */ | ||
301 | - MarkerClusterer.prototype.removeMarker = function(marker) { | ||
302 | - var success = this._removeMarker(marker); | ||
303 | - if (success) { | ||
304 | - this._clearLastClusters(); | ||
305 | - this._createClusters(); | ||
306 | - } | ||
307 | - return success; | ||
308 | - }; | ||
309 | - | ||
310 | - /** | ||
311 | - * 删除一组标记 | ||
312 | - * @param {Array<BMap.Marker>} markers 需要被删除的marker数组 | ||
313 | - * | ||
314 | - * @return {Boolean} 删除成功返回true,否则返回false | ||
315 | - */ | ||
316 | - MarkerClusterer.prototype.removeMarkers = function(markers) { | ||
317 | - var success = false; | ||
318 | - for (var i = 0; i < markers.length; i++) { | ||
319 | - var r = this._removeMarker(markers[i]); | ||
320 | - success = success || r; | ||
321 | - } | ||
322 | - | ||
323 | - if (success) { | ||
324 | - this._clearLastClusters(); | ||
325 | - this._createClusters(); | ||
326 | - } | ||
327 | - return success; | ||
328 | - }; | ||
329 | - | ||
330 | - /** | ||
331 | - * 从地图上彻底清除所有的标记 | ||
332 | - * @return 无返回值 | ||
333 | - */ | ||
334 | - MarkerClusterer.prototype.clearMarkers = function() { | ||
335 | - this._clearLastClusters(); | ||
336 | - this._removeMarkersFromMap(); | ||
337 | - this._markers = []; | ||
338 | - }; | ||
339 | - | ||
340 | - /** | ||
341 | - * 重新生成,比如改变了属性等 | ||
342 | - * @return 无返回值 | ||
343 | - */ | ||
344 | - MarkerClusterer.prototype._redraw = function () { | ||
345 | - this._clearLastClusters(); | ||
346 | - this._createClusters(); | ||
347 | - }; | ||
348 | - | ||
349 | - /** | ||
350 | - * 获取网格大小 | ||
351 | - * @return {Number} 网格大小 | ||
352 | - */ | ||
353 | - MarkerClusterer.prototype.getGridSize = function() { | ||
354 | - return this._gridSize; | ||
355 | - }; | ||
356 | - | ||
357 | - /** | ||
358 | - * 设置网格大小 | ||
359 | - * @param {Number} size 网格大小 | ||
360 | - * @return 无返回值 | ||
361 | - */ | ||
362 | - MarkerClusterer.prototype.setGridSize = function(size) { | ||
363 | - this._gridSize = size; | ||
364 | - this._redraw(); | ||
365 | - }; | ||
366 | - | ||
367 | - /** | ||
368 | - * 获取聚合的最大缩放级别。 | ||
369 | - * @return {Number} 聚合的最大缩放级别。 | ||
370 | - */ | ||
371 | - MarkerClusterer.prototype.getMaxZoom = function() { | ||
372 | - return this._maxZoom; | ||
373 | - }; | ||
374 | - | ||
375 | - /** | ||
376 | - * 设置聚合的最大缩放级别 | ||
377 | - * @param {Number} maxZoom 聚合的最大缩放级别 | ||
378 | - * @return 无返回值 | ||
379 | - */ | ||
380 | - MarkerClusterer.prototype.setMaxZoom = function(maxZoom) { | ||
381 | - this._maxZoom = maxZoom; | ||
382 | - this._redraw(); | ||
383 | - }; | ||
384 | - | ||
385 | - /** | ||
386 | - * 获取聚合的样式风格集合 | ||
387 | - * @return {Array<IconStyle>} 聚合的样式风格集合 | ||
388 | - */ | ||
389 | - MarkerClusterer.prototype.getStyles = function() { | ||
390 | - return this._styles; | ||
391 | - }; | ||
392 | - | ||
393 | - /** | ||
394 | - * 设置聚合的样式风格集合 | ||
395 | - * @param {Array<IconStyle>} styles 样式风格数组 | ||
396 | - * @return 无返回值 | ||
397 | - */ | ||
398 | - MarkerClusterer.prototype.setStyles = function(styles) { | ||
399 | - this._styles = styles; | ||
400 | - this._redraw(); | ||
401 | - }; | ||
402 | - | ||
403 | - /** | ||
404 | - * 获取单个聚合的最小数量。 | ||
405 | - * @return {Number} 单个聚合的最小数量。 | ||
406 | - */ | ||
407 | - MarkerClusterer.prototype.getMinClusterSize = function() { | ||
408 | - return this._minClusterSize; | ||
409 | - }; | ||
410 | - | ||
411 | - /** | ||
412 | - * 设置单个聚合的最小数量。 | ||
413 | - * @param {Number} size 单个聚合的最小数量。 | ||
414 | - * @return 无返回值。 | ||
415 | - */ | ||
416 | - MarkerClusterer.prototype.setMinClusterSize = function(size) { | ||
417 | - this._minClusterSize = size; | ||
418 | - this._redraw(); | ||
419 | - }; | ||
420 | - | ||
421 | - /** | ||
422 | - * 获取单个聚合的落脚点是否是聚合内所有标记的平均中心。 | ||
423 | - * @return {Boolean} true或false。 | ||
424 | - */ | ||
425 | - MarkerClusterer.prototype.isAverageCenter = function() { | ||
426 | - return this._isAverageCenter; | ||
427 | - }; | ||
428 | - | ||
429 | - /** | ||
430 | - * 获取聚合的Map实例。 | ||
431 | - * @return {Map} Map的示例。 | ||
432 | - */ | ||
433 | - MarkerClusterer.prototype.getMap = function() { | ||
434 | - return this._map; | ||
435 | - }; | ||
436 | - | ||
437 | - /** | ||
438 | - * 获取所有的标记数组。 | ||
439 | - * @return {Array<Marker>} 标记数组。 | ||
440 | - */ | ||
441 | - MarkerClusterer.prototype.getMarkers = function() { | ||
442 | - return this._markers; | ||
443 | - }; | ||
444 | - | ||
445 | - /** | ||
446 | - * 获取聚合的总数量。 | ||
447 | - * @return {Number} 聚合的总数量。 | ||
448 | - */ | ||
449 | - MarkerClusterer.prototype.getClustersCount = function() { | ||
450 | - var count = 0; | ||
451 | - for(var i = 0, cluster; cluster = this._clusters[i]; i++){ | ||
452 | - cluster.isReal() && count++; | ||
453 | - } | ||
454 | - return count; | ||
455 | - }; | ||
456 | - | ||
457 | - /** | ||
458 | - * @ignore | ||
459 | - * Cluster | ||
460 | - * @class 表示一个聚合对象,该聚合,包含有N个标记,这N个标记组成的范围,并有予以显示在Map上的TextIconOverlay等。 | ||
461 | - * @constructor | ||
462 | - * @param {MarkerClusterer} markerClusterer 一个标记聚合器示例。 | ||
463 | - */ | ||
464 | - function Cluster(markerClusterer){ | ||
465 | - this._markerClusterer = markerClusterer; | ||
466 | - this._map = markerClusterer.getMap(); | ||
467 | - this._minClusterSize = markerClusterer.getMinClusterSize(); | ||
468 | - this._isAverageCenter = markerClusterer.isAverageCenter(); | ||
469 | - this._center = null;//落脚位置 | ||
470 | - this._markers = [];//这个Cluster中所包含的markers | ||
471 | - this._gridBounds = null;//以中心点为准,向四边扩大gridSize个像素的范围,也即网格范围 | ||
472 | - this._isReal = false; //真的是个聚合 | ||
473 | - | ||
474 | - this._clusterMarker = new BMapLib.TextIconOverlay(this._center, this._markers.length, {"styles":this._markerClusterer.getStyles()}); | ||
475 | - //this._map.addOverlay(this._clusterMarker); | ||
476 | - } | ||
477 | - | ||
478 | - /** | ||
479 | - * 向该聚合添加一个标记。 | ||
480 | - * @param {Marker} marker 要添加的标记。 | ||
481 | - * @return 无返回值。 | ||
482 | - */ | ||
483 | - Cluster.prototype.addMarker = function(marker){ | ||
484 | - if(this.isMarkerInCluster(marker)){ | ||
485 | - return false; | ||
486 | - }//也可用marker.isInCluster判断,外面判断OK,这里基本不会命中 | ||
487 | - | ||
488 | - if (!this._center){ | ||
489 | - this._center = marker.getPosition(); | ||
490 | - this.updateGridBounds();// | ||
491 | - } else { | ||
492 | - if(this._isAverageCenter){ | ||
493 | - var l = this._markers.length + 1; | ||
494 | - var lat = (this._center.lat * (l - 1) + marker.getPosition().lat) / l; | ||
495 | - var lng = (this._center.lng * (l - 1) + marker.getPosition().lng) / l; | ||
496 | - this._center = new BMap.Point(lng, lat); | ||
497 | - this.updateGridBounds(); | ||
498 | - }//计算新的Center | ||
499 | - } | ||
500 | - | ||
501 | - marker.isInCluster = true; | ||
502 | - this._markers.push(marker); | ||
503 | - /* | ||
504 | - var len = this._markers.length; | ||
505 | - if(len < this._minClusterSize ){ | ||
506 | - this._map.addOverlay(marker); | ||
507 | - //this.updateClusterMarker(); | ||
508 | - return true; | ||
509 | - } else if (len === this._minClusterSize) { | ||
510 | - for (var i = 0; i < len; i++) { | ||
511 | - this._markers[i].getMap() && this._map.removeOverlay(this._markers[i]); | ||
512 | - } | ||
513 | - | ||
514 | - } | ||
515 | - this._map.addOverlay(this._clusterMarker); | ||
516 | - this._isReal = true; | ||
517 | - this.updateClusterMarker(); | ||
518 | - return true; */ | ||
519 | - }; | ||
520 | - Cluster.prototype.render = function(){ | ||
521 | - var len = this._markers.length; | ||
522 | - | ||
523 | - if (len < this._minClusterSize) { | ||
524 | - for (var i = 0; i < len; i++) { | ||
525 | - this._map.addOverlay(this._markers[i]); | ||
526 | - } | ||
527 | - } else { | ||
528 | - this._map.addOverlay(this._clusterMarker); | ||
529 | - this._isReal = true; | ||
530 | - this.updateClusterMarker(); | ||
531 | - } | ||
532 | - } | ||
533 | - /** | ||
534 | - * 判断一个标记是否在该聚合中。 | ||
535 | - * @param {Marker} marker 要判断的标记。 | ||
536 | - * @return {Boolean} true或false。 | ||
537 | - */ | ||
538 | - Cluster.prototype.isMarkerInCluster= function(marker){ | ||
539 | - if (this._markers.indexOf) { | ||
540 | - return this._markers.indexOf(marker) != -1; | ||
541 | - } else { | ||
542 | - for (var i = 0, m; m = this._markers[i]; i++) { | ||
543 | - if (m === marker) { | ||
544 | - return true; | ||
545 | - } | ||
546 | - } | ||
547 | - } | ||
548 | - return false; | ||
549 | - }; | ||
550 | - | ||
551 | - /** | ||
552 | - * 判断一个标记是否在该聚合网格范围中。 | ||
553 | - * @param {Marker} marker 要判断的标记。 | ||
554 | - * @return {Boolean} true或false。 | ||
555 | - */ | ||
556 | - Cluster.prototype.isMarkerInClusterBounds = function(marker) { | ||
557 | - return this._gridBounds.containsPoint(marker.getPosition()); | ||
558 | - }; | ||
559 | - | ||
560 | - Cluster.prototype.isReal = function(marker) { | ||
561 | - return this._isReal; | ||
562 | - }; | ||
563 | - | ||
564 | - /** | ||
565 | - * 更新该聚合的网格范围。 | ||
566 | - * @return 无返回值。 | ||
567 | - */ | ||
568 | - Cluster.prototype.updateGridBounds = function() { | ||
569 | - var bounds = new BMap.Bounds(this._center, this._center); | ||
570 | - this._gridBounds = getExtendedBounds(this._map, bounds, this._markerClusterer.getGridSize()); | ||
571 | - }; | ||
572 | - | ||
573 | - /** | ||
574 | - * 更新该聚合的显示样式,也即TextIconOverlay。 | ||
575 | - * @return 无返回值。 | ||
576 | - */ | ||
577 | - Cluster.prototype.updateClusterMarker = function () { | ||
578 | - if (this._map.getZoom() > this._markerClusterer.getMaxZoom()) { | ||
579 | - this._clusterMarker && this._map.removeOverlay(this._clusterMarker); | ||
580 | - for (var i = 0, marker; marker = this._markers[i]; i++) { | ||
581 | - this._map.addOverlay(marker); | ||
582 | - } | ||
583 | - return; | ||
584 | - } | ||
585 | - | ||
586 | - if (this._markers.length < this._minClusterSize) { | ||
587 | - this._clusterMarker.hide(); | ||
588 | - return; | ||
589 | - } | ||
590 | - | ||
591 | - this._clusterMarker.setPosition(this._center); | ||
592 | - | ||
593 | - this._clusterMarker.setText(this._markers.length); | ||
594 | - | ||
595 | - var thatMap = this._map; | ||
596 | - var thatBounds = this.getBounds(); | ||
597 | - this._clusterMarker.addEventListener("click", function(event){ | ||
598 | - thatMap.setViewport(thatBounds); | ||
599 | - }); | ||
600 | - | ||
601 | - }; | ||
602 | - | ||
603 | - /** | ||
604 | - * 删除该聚合。 | ||
605 | - * @return 无返回值。 | ||
606 | - */ | ||
607 | - Cluster.prototype.remove = function(){ | ||
608 | - for (var i = 0, m; m = this._markers[i]; i++) { | ||
609 | - this._markers[i].getMap() && this._map.removeOverlay(this._markers[i]); | ||
610 | - }//清除散的标记点 | ||
611 | - this._map.removeOverlay(this._clusterMarker); | ||
612 | - this._markers.length = 0; | ||
613 | - delete this._markers; | ||
614 | - } | ||
615 | - | ||
616 | - /** | ||
617 | - * 获取该聚合所包含的所有标记的最小外接矩形的范围。 | ||
618 | - * @return {BMap.Bounds} 计算出的范围。 | ||
619 | - */ | ||
620 | - Cluster.prototype.getBounds = function() { | ||
621 | - var bounds = new BMap.Bounds(this._center,this._center); | ||
622 | - for (var i = 0, marker; marker = this._markers[i]; i++) { | ||
623 | - bounds.extend(marker.getPosition()); | ||
624 | - } | ||
625 | - return bounds; | ||
626 | - }; | ||
627 | - | ||
628 | - /** | ||
629 | - * 获取该聚合的落脚点。 | ||
630 | - * @return {BMap.Point} 该聚合的落脚点。 | ||
631 | - */ | ||
632 | - Cluster.prototype.getCenter = function() { | ||
633 | - return this._center; | ||
634 | - }; | ||
635 | - | ||
636 | -})(); | ||
637 | \ No newline at end of file | 0 | \ No newline at end of file |
app-ht/web/exts-src/baidumap/TextIconOverlay.js
@@ -1,1046 +0,0 @@ | @@ -1,1046 +0,0 @@ | ||
1 | -/** | ||
2 | - * @fileoverview 此类表示地图上的一个覆盖物,该覆盖物由文字和图标组成,从Overlay继承。 | ||
3 | - * 主入口类是<a href="symbols/BMapLib.TextIconOverlay.html">TextIconOverlay</a>, | ||
4 | - * 基于Baidu Map API 1.2。 | ||
5 | - * | ||
6 | - * @author Baidu Map Api Group | ||
7 | - * @version 1.2 | ||
8 | - */ | ||
9 | - | ||
10 | - | ||
11 | -/** | ||
12 | - * @namespace BMap的所有library类均放在BMapLib命名空间下 | ||
13 | - */ | ||
14 | -var BMapLib = window.BMapLib = BMapLib || {}; | ||
15 | - | ||
16 | -(function () { | ||
17 | - | ||
18 | - /** | ||
19 | - * 声明baidu包 | ||
20 | - */ | ||
21 | - var T, | ||
22 | - baidu = T = baidu || {version: "1.3.8"}; | ||
23 | - | ||
24 | - (function (){ | ||
25 | - //提出guid,防止在与老版本Tangram混用时 | ||
26 | - //在下一行错误的修改window[undefined] | ||
27 | - baidu.guid = "$BAIDU$"; | ||
28 | - | ||
29 | - //Tangram可能被放在闭包中 | ||
30 | - //一些页面级别唯一的属性,需要挂载在window[baidu.guid]上 | ||
31 | - window[baidu.guid] = window[baidu.guid] || {}; | ||
32 | - | ||
33 | - /** | ||
34 | - * @ignore | ||
35 | - * @namespace baidu.dom 操作dom的方法。 | ||
36 | - */ | ||
37 | - baidu.dom = baidu.dom || {}; | ||
38 | - | ||
39 | - | ||
40 | - /** | ||
41 | - * 从文档中获取指定的DOM元素 | ||
42 | - * @name baidu.dom.g | ||
43 | - * @function | ||
44 | - * @grammar baidu.dom.g(id) | ||
45 | - * @param {string|HTMLElement} id 元素的id或DOM元素 | ||
46 | - * @shortcut g,T.G | ||
47 | - * @meta standard | ||
48 | - * @see baidu.dom.q | ||
49 | - * | ||
50 | - * @returns {HTMLElement|null} 获取的元素,查找不到时返回null,如果参数不合法,直接返回参数 | ||
51 | - */ | ||
52 | - baidu.dom.g = function (id) { | ||
53 | - if ('string' == typeof id || id instanceof String) { | ||
54 | - return document.getElementById(id); | ||
55 | - } else if (id && id.nodeName && (id.nodeType == 1 || id.nodeType == 9)) { | ||
56 | - return id; | ||
57 | - } | ||
58 | - return null; | ||
59 | - }; | ||
60 | - | ||
61 | - // 声明快捷方法 | ||
62 | - baidu.g = baidu.G = baidu.dom.g; | ||
63 | - | ||
64 | - /** | ||
65 | - * 获取目标元素所属的document对象 | ||
66 | - * @name baidu.dom.getDocument | ||
67 | - * @function | ||
68 | - * @grammar baidu.dom.getDocument(element) | ||
69 | - * @param {HTMLElement|string} element 目标元素或目标元素的id | ||
70 | - * @meta standard | ||
71 | - * @see baidu.dom.getWindow | ||
72 | - * | ||
73 | - * @returns {HTMLDocument} 目标元素所属的document对象 | ||
74 | - */ | ||
75 | - baidu.dom.getDocument = function (element) { | ||
76 | - element = baidu.dom.g(element); | ||
77 | - return element.nodeType == 9 ? element : element.ownerDocument || element.document; | ||
78 | - }; | ||
79 | - | ||
80 | - /** | ||
81 | - * @ignore | ||
82 | - * @namespace baidu.lang 对语言层面的封装,包括类型判断、模块扩展、继承基类以及对象自定义事件的支持。 | ||
83 | - */ | ||
84 | - baidu.lang = baidu.lang || {}; | ||
85 | - | ||
86 | - /** | ||
87 | - * 判断目标参数是否string类型或String对象 | ||
88 | - * @name baidu.lang.isString | ||
89 | - * @function | ||
90 | - * @grammar baidu.lang.isString(source) | ||
91 | - * @param {Any} source 目标参数 | ||
92 | - * @shortcut isString | ||
93 | - * @meta standard | ||
94 | - * @see baidu.lang.isObject,baidu.lang.isNumber,baidu.lang.isArray,baidu.lang.isElement,baidu.lang.isBoolean,baidu.lang.isDate | ||
95 | - * | ||
96 | - * @returns {boolean} 类型判断结果 | ||
97 | - */ | ||
98 | - baidu.lang.isString = function (source) { | ||
99 | - return '[object String]' == Object.prototype.toString.call(source); | ||
100 | - }; | ||
101 | - | ||
102 | - // 声明快捷方法 | ||
103 | - baidu.isString = baidu.lang.isString; | ||
104 | - | ||
105 | - /** | ||
106 | - * 从文档中获取指定的DOM元素 | ||
107 | - * **内部方法** | ||
108 | - * | ||
109 | - * @param {string|HTMLElement} id 元素的id或DOM元素 | ||
110 | - * @meta standard | ||
111 | - * @return {HTMLElement} DOM元素,如果不存在,返回null,如果参数不合法,直接返回参数 | ||
112 | - */ | ||
113 | - baidu.dom._g = function (id) { | ||
114 | - if (baidu.lang.isString(id)) { | ||
115 | - return document.getElementById(id); | ||
116 | - } | ||
117 | - return id; | ||
118 | - }; | ||
119 | - | ||
120 | - // 声明快捷方法 | ||
121 | - baidu._g = baidu.dom._g; | ||
122 | - | ||
123 | - /** | ||
124 | - * @ignore | ||
125 | - * @namespace baidu.browser 判断浏览器类型和特性的属性。 | ||
126 | - */ | ||
127 | - baidu.browser = baidu.browser || {}; | ||
128 | - | ||
129 | - if (/msie (\d+\.\d)/i.test(navigator.userAgent)) { | ||
130 | - //IE 8下,以documentMode为准 | ||
131 | - //在百度模板中,可能会有$,防止冲突,将$1 写成 \x241 | ||
132 | - /** | ||
133 | - * 判断是否为ie浏览器 | ||
134 | - * @property ie ie版本号 | ||
135 | - * @grammar baidu.browser.ie | ||
136 | - * @meta standard | ||
137 | - * @shortcut ie | ||
138 | - * @see baidu.browser.firefox,baidu.browser.safari,baidu.browser.opera,baidu.browser.chrome,baidu.browser.maxthon | ||
139 | - */ | ||
140 | - baidu.browser.ie = baidu.ie = document.documentMode || + RegExp['\x241']; | ||
141 | - } | ||
142 | - | ||
143 | - /** | ||
144 | - * 获取目标元素的computed style值。如果元素的样式值不能被浏览器计算,则会返回空字符串(IE) | ||
145 | - * | ||
146 | - * @author berg | ||
147 | - * @name baidu.dom.getComputedStyle | ||
148 | - * @function | ||
149 | - * @grammar baidu.dom.getComputedStyle(element, key) | ||
150 | - * @param {HTMLElement|string} element 目标元素或目标元素的id | ||
151 | - * @param {string} key 要获取的样式名 | ||
152 | - * | ||
153 | - * @see baidu.dom.getStyle | ||
154 | - * | ||
155 | - * @returns {string} 目标元素的computed style值 | ||
156 | - */ | ||
157 | - | ||
158 | - baidu.dom.getComputedStyle = function(element, key){ | ||
159 | - element = baidu.dom._g(element); | ||
160 | - var doc = baidu.dom.getDocument(element), | ||
161 | - styles; | ||
162 | - if (doc.defaultView && doc.defaultView.getComputedStyle) { | ||
163 | - styles = doc.defaultView.getComputedStyle(element, null); | ||
164 | - if (styles) { | ||
165 | - return styles[key] || styles.getPropertyValue(key); | ||
166 | - } | ||
167 | - } | ||
168 | - return ''; | ||
169 | - }; | ||
170 | - | ||
171 | - /** | ||
172 | - * 提供给setStyle与getStyle使用 | ||
173 | - */ | ||
174 | - baidu.dom._styleFixer = baidu.dom._styleFixer || {}; | ||
175 | - | ||
176 | - /** | ||
177 | - * 提供给setStyle与getStyle使用 | ||
178 | - */ | ||
179 | - baidu.dom._styleFilter = baidu.dom._styleFilter || []; | ||
180 | - | ||
181 | - /** | ||
182 | - * 为获取和设置样式的过滤器 | ||
183 | - * @private | ||
184 | - * @meta standard | ||
185 | - */ | ||
186 | - baidu.dom._styleFilter.filter = function (key, value, method) { | ||
187 | - for (var i = 0, filters = baidu.dom._styleFilter, filter; filter = filters[i]; i++) { | ||
188 | - if (filter = filter[method]) { | ||
189 | - value = filter(key, value); | ||
190 | - } | ||
191 | - } | ||
192 | - return value; | ||
193 | - }; | ||
194 | - | ||
195 | - /** | ||
196 | - * @ignore | ||
197 | - * @namespace baidu.string 操作字符串的方法。 | ||
198 | - */ | ||
199 | - baidu.string = baidu.string || {}; | ||
200 | - | ||
201 | - /** | ||
202 | - * 将目标字符串进行驼峰化处理 | ||
203 | - * @name baidu.string.toCamelCase | ||
204 | - * @function | ||
205 | - * @grammar baidu.string.toCamelCase(source) | ||
206 | - * @param {string} source 目标字符串 | ||
207 | - * @remark | ||
208 | - * 支持单词以“-_”分隔 | ||
209 | - * @meta standard | ||
210 | - * | ||
211 | - * @returns {string} 驼峰化处理后的字符串 | ||
212 | - */ | ||
213 | - baidu.string.toCamelCase = function (source) { | ||
214 | - //提前判断,提高getStyle等的效率 thanks xianwei | ||
215 | - if (source.indexOf('-') < 0 && source.indexOf('_') < 0) { | ||
216 | - return source; | ||
217 | - } | ||
218 | - return source.replace(/[-_][^-_]/g, function (match) { | ||
219 | - return match.charAt(1).toUpperCase(); | ||
220 | - }); | ||
221 | - }; | ||
222 | - | ||
223 | - /** | ||
224 | - * 获取目标元素的样式值 | ||
225 | - * @name baidu.dom.getStyle | ||
226 | - * @function | ||
227 | - * @grammar baidu.dom.getStyle(element, key) | ||
228 | - * @param {HTMLElement|string} element 目标元素或目标元素的id | ||
229 | - * @param {string} key 要获取的样式名 | ||
230 | - * @remark | ||
231 | - * | ||
232 | - * 为了精简代码,本模块默认不对任何浏览器返回值进行归一化处理(如使用getStyle时,不同浏览器下可能返回rgb颜色或hex颜色),也不会修复浏览器的bug和差异性(如设置IE的float属性叫styleFloat,firefox则是cssFloat)。<br /> | ||
233 | - * baidu.dom._styleFixer和baidu.dom._styleFilter可以为本模块提供支持。<br /> | ||
234 | - * 其中_styleFilter能对颜色和px进行归一化处理,_styleFixer能对display,float,opacity,textOverflow的浏览器兼容性bug进行处理。 | ||
235 | - * @shortcut getStyle | ||
236 | - * @meta standard | ||
237 | - * @see baidu.dom.setStyle,baidu.dom.setStyles, baidu.dom.getComputedStyle | ||
238 | - * | ||
239 | - * @returns {string} 目标元素的样式值 | ||
240 | - */ | ||
241 | - baidu.dom.getStyle = function (element, key) { | ||
242 | - var dom = baidu.dom; | ||
243 | - | ||
244 | - element = dom.g(element); | ||
245 | - key = baidu.string.toCamelCase(key); | ||
246 | - //computed style, then cascaded style, then explicitly set style. | ||
247 | - var value = element.style[key] || | ||
248 | - (element.currentStyle ? element.currentStyle[key] : "") || | ||
249 | - dom.getComputedStyle(element, key); | ||
250 | - | ||
251 | - // 在取不到值的时候,用fixer进行修正 | ||
252 | - if (!value) { | ||
253 | - var fixer = dom._styleFixer[key]; | ||
254 | - if(fixer){ | ||
255 | - value = fixer.get ? fixer.get(element) : baidu.dom.getStyle(element, fixer); | ||
256 | - } | ||
257 | - } | ||
258 | - | ||
259 | - /* 检查结果过滤器 */ | ||
260 | - if (fixer = dom._styleFilter) { | ||
261 | - value = fixer.filter(key, value, 'get'); | ||
262 | - } | ||
263 | - | ||
264 | - return value; | ||
265 | - }; | ||
266 | - | ||
267 | - // 声明快捷方法 | ||
268 | - baidu.getStyle = baidu.dom.getStyle; | ||
269 | - | ||
270 | - | ||
271 | - if (/opera\/(\d+\.\d)/i.test(navigator.userAgent)) { | ||
272 | - /** | ||
273 | - * 判断是否为opera浏览器 | ||
274 | - * @property opera opera版本号 | ||
275 | - * @grammar baidu.browser.opera | ||
276 | - * @meta standard | ||
277 | - * @see baidu.browser.ie,baidu.browser.firefox,baidu.browser.safari,baidu.browser.chrome | ||
278 | - */ | ||
279 | - baidu.browser.opera = + RegExp['\x241']; | ||
280 | - } | ||
281 | - | ||
282 | - /** | ||
283 | - * 判断是否为webkit内核 | ||
284 | - * @property isWebkit | ||
285 | - * @grammar baidu.browser.isWebkit | ||
286 | - * @meta standard | ||
287 | - * @see baidu.browser.isGecko | ||
288 | - */ | ||
289 | - baidu.browser.isWebkit = /webkit/i.test(navigator.userAgent); | ||
290 | - | ||
291 | - /** | ||
292 | - * 判断是否为gecko内核 | ||
293 | - * @property isGecko | ||
294 | - * @grammar baidu.browser.isGecko | ||
295 | - * @meta standard | ||
296 | - * @see baidu.browser.isWebkit | ||
297 | - */ | ||
298 | - baidu.browser.isGecko = /gecko/i.test(navigator.userAgent) && !/like gecko/i.test(navigator.userAgent); | ||
299 | - | ||
300 | - /** | ||
301 | - * 判断是否严格标准的渲染模式 | ||
302 | - * @property isStrict | ||
303 | - * @grammar baidu.browser.isStrict | ||
304 | - * @meta standard | ||
305 | - */ | ||
306 | - baidu.browser.isStrict = document.compatMode == "CSS1Compat"; | ||
307 | - | ||
308 | - /** | ||
309 | - * 获取目标元素相对于整个文档左上角的位置 | ||
310 | - * @name baidu.dom.getPosition | ||
311 | - * @function | ||
312 | - * @grammar baidu.dom.getPosition(element) | ||
313 | - * @param {HTMLElement|string} element 目标元素或目标元素的id | ||
314 | - * @meta standard | ||
315 | - * | ||
316 | - * @returns {Object} 目标元素的位置,键值为top和left的Object。 | ||
317 | - */ | ||
318 | - baidu.dom.getPosition = function (element) { | ||
319 | - element = baidu.dom.g(element); | ||
320 | - var doc = baidu.dom.getDocument(element), | ||
321 | - browser = baidu.browser, | ||
322 | - getStyle = baidu.dom.getStyle, | ||
323 | - // Gecko 1.9版本以下用getBoxObjectFor计算位置 | ||
324 | - // 但是某些情况下是有bug的 | ||
325 | - // 对于这些有bug的情况 | ||
326 | - // 使用递归查找的方式 | ||
327 | - BUGGY_GECKO_BOX_OBJECT = browser.isGecko > 0 && | ||
328 | - doc.getBoxObjectFor && | ||
329 | - getStyle(element, 'position') == 'absolute' && | ||
330 | - (element.style.top === '' || element.style.left === ''), | ||
331 | - pos = {"left":0,"top":0}, | ||
332 | - viewport = (browser.ie && !browser.isStrict) ? doc.body : doc.documentElement, | ||
333 | - parent, | ||
334 | - box; | ||
335 | - | ||
336 | - if(element == viewport){ | ||
337 | - return pos; | ||
338 | - } | ||
339 | - | ||
340 | - if(element.getBoundingClientRect){ // IE and Gecko 1.9+ | ||
341 | - | ||
342 | - //当HTML或者BODY有border width时, 原生的getBoundingClientRect返回值是不符合预期的 | ||
343 | - //考虑到通常情况下 HTML和BODY的border只会设成0px,所以忽略该问题. | ||
344 | - box = element.getBoundingClientRect(); | ||
345 | - | ||
346 | - pos.left = Math.floor(box.left) + Math.max(doc.documentElement.scrollLeft, doc.body.scrollLeft); | ||
347 | - pos.top = Math.floor(box.top) + Math.max(doc.documentElement.scrollTop, doc.body.scrollTop); | ||
348 | - | ||
349 | - // IE会给HTML元素添加一个border,默认是medium(2px) | ||
350 | - // 但是在IE 6 7 的怪异模式下,可以被html { border: 0; } 这条css规则覆盖 | ||
351 | - // 在IE7的标准模式下,border永远是2px,这个值通过clientLeft 和 clientTop取得 | ||
352 | - // 但是。。。在IE 6 7的怪异模式,如果用户使用css覆盖了默认的medium | ||
353 | - // clientTop和clientLeft不会更新 | ||
354 | - pos.left -= doc.documentElement.clientLeft; | ||
355 | - pos.top -= doc.documentElement.clientTop; | ||
356 | - | ||
357 | - var htmlDom = doc.body, | ||
358 | - // 在这里,不使用element.style.borderLeftWidth,只有computedStyle是可信的 | ||
359 | - htmlBorderLeftWidth = parseInt(getStyle(htmlDom, 'borderLeftWidth')), | ||
360 | - htmlBorderTopWidth = parseInt(getStyle(htmlDom, 'borderTopWidth')); | ||
361 | - if(browser.ie && !browser.isStrict){ | ||
362 | - pos.left -= isNaN(htmlBorderLeftWidth) ? 2 : htmlBorderLeftWidth; | ||
363 | - pos.top -= isNaN(htmlBorderTopWidth) ? 2 : htmlBorderTopWidth; | ||
364 | - } | ||
365 | - } else { | ||
366 | - // safari/opera/firefox | ||
367 | - parent = element; | ||
368 | - | ||
369 | - do { | ||
370 | - pos.left += parent.offsetLeft; | ||
371 | - pos.top += parent.offsetTop; | ||
372 | - | ||
373 | - // safari里面,如果遍历到了一个fixed的元素,后面的offset都不准了 | ||
374 | - if (browser.isWebkit > 0 && getStyle(parent, 'position') == 'fixed') { | ||
375 | - pos.left += doc.body.scrollLeft; | ||
376 | - pos.top += doc.body.scrollTop; | ||
377 | - break; | ||
378 | - } | ||
379 | - | ||
380 | - parent = parent.offsetParent; | ||
381 | - } while (parent && parent != element); | ||
382 | - | ||
383 | - // 对body offsetTop的修正 | ||
384 | - if(browser.opera > 0 || (browser.isWebkit > 0 && getStyle(element, 'position') == 'absolute')){ | ||
385 | - pos.top -= doc.body.offsetTop; | ||
386 | - } | ||
387 | - | ||
388 | - // 计算除了body的scroll | ||
389 | - parent = element.offsetParent; | ||
390 | - while (parent && parent != doc.body) { | ||
391 | - pos.left -= parent.scrollLeft; | ||
392 | - // see https://bugs.opera.com/show_bug.cgi?id=249965 | ||
393 | - if (!browser.opera || parent.tagName != 'TR') { | ||
394 | - pos.top -= parent.scrollTop; | ||
395 | - } | ||
396 | - parent = parent.offsetParent; | ||
397 | - } | ||
398 | - } | ||
399 | - | ||
400 | - return pos; | ||
401 | - }; | ||
402 | - | ||
403 | - /** | ||
404 | - * @ignore | ||
405 | - * @namespace baidu.event 屏蔽浏览器差异性的事件封装。 | ||
406 | - * @property target 事件的触发元素 | ||
407 | - * @property pageX 鼠标事件的鼠标x坐标 | ||
408 | - * @property pageY 鼠标事件的鼠标y坐标 | ||
409 | - * @property keyCode 键盘事件的键值 | ||
410 | - */ | ||
411 | - baidu.event = baidu.event || {}; | ||
412 | - | ||
413 | - /** | ||
414 | - * 事件监听器的存储表 | ||
415 | - * @private | ||
416 | - * @meta standard | ||
417 | - */ | ||
418 | - baidu.event._listeners = baidu.event._listeners || []; | ||
419 | - | ||
420 | - /** | ||
421 | - * 为目标元素添加事件监听器 | ||
422 | - * @name baidu.event.on | ||
423 | - * @function | ||
424 | - * @grammar baidu.event.on(element, type, listener) | ||
425 | - * @param {HTMLElement|string|window} element 目标元素或目标元素id | ||
426 | - * @param {string} type 事件类型 | ||
427 | - * @param {Function} listener 需要添加的监听器 | ||
428 | - * @remark | ||
429 | - * | ||
430 | - 1. 不支持跨浏览器的鼠标滚轮事件监听器添加<br> | ||
431 | - 2. 改方法不为监听器灌入事件对象,以防止跨iframe事件挂载的事件对象获取失败 | ||
432 | - | ||
433 | - * @shortcut on | ||
434 | - * @meta standard | ||
435 | - * @see baidu.event.un | ||
436 | - * | ||
437 | - * @returns {HTMLElement|window} 目标元素 | ||
438 | - */ | ||
439 | - baidu.event.on = function (element, type, listener) { | ||
440 | - type = type.replace(/^on/i, ''); | ||
441 | - element = baidu.dom._g(element); | ||
442 | - | ||
443 | - var realListener = function (ev) { | ||
444 | - // 1. 这里不支持EventArgument, 原因是跨frame的事件挂载 | ||
445 | - // 2. element是为了修正this | ||
446 | - listener.call(element, ev); | ||
447 | - }, | ||
448 | - lis = baidu.event._listeners, | ||
449 | - filter = baidu.event._eventFilter, | ||
450 | - afterFilter, | ||
451 | - realType = type; | ||
452 | - type = type.toLowerCase(); | ||
453 | - // filter过滤 | ||
454 | - if(filter && filter[type]){ | ||
455 | - afterFilter = filter[type](element, type, realListener); | ||
456 | - realType = afterFilter.type; | ||
457 | - realListener = afterFilter.listener; | ||
458 | - } | ||
459 | - | ||
460 | - // 事件监听器挂载 | ||
461 | - if (element.addEventListener) { | ||
462 | - element.addEventListener(realType, realListener, false); | ||
463 | - } else if (element.attachEvent) { | ||
464 | - element.attachEvent('on' + realType, realListener); | ||
465 | - } | ||
466 | - | ||
467 | - // 将监听器存储到数组中 | ||
468 | - lis[lis.length] = [element, type, listener, realListener, realType]; | ||
469 | - return element; | ||
470 | - }; | ||
471 | - | ||
472 | - // 声明快捷方法 | ||
473 | - baidu.on = baidu.event.on; | ||
474 | - | ||
475 | - /** | ||
476 | - * 返回一个当前页面的唯一标识字符串。 | ||
477 | - * @name baidu.lang.guid | ||
478 | - * @function | ||
479 | - * @grammar baidu.lang.guid() | ||
480 | - * @version 1.1.1 | ||
481 | - * @meta standard | ||
482 | - * | ||
483 | - * @returns {String} 当前页面的唯一标识字符串 | ||
484 | - */ | ||
485 | - | ||
486 | - (function(){ | ||
487 | - //不直接使用window,可以提高3倍左右性能 | ||
488 | - var guid = window[baidu.guid]; | ||
489 | - | ||
490 | - baidu.lang.guid = function() { | ||
491 | - return "TANGRAM__" + (guid._counter ++).toString(36); | ||
492 | - }; | ||
493 | - | ||
494 | - guid._counter = guid._counter || 1; | ||
495 | - })(); | ||
496 | - | ||
497 | - /** | ||
498 | - * 所有类的实例的容器 | ||
499 | - * key为每个实例的guid | ||
500 | - * @meta standard | ||
501 | - */ | ||
502 | - | ||
503 | - window[baidu.guid]._instances = window[baidu.guid]._instances || {}; | ||
504 | - | ||
505 | - /** | ||
506 | - * 判断目标参数是否为function或Function实例 | ||
507 | - * @name baidu.lang.isFunction | ||
508 | - * @function | ||
509 | - * @grammar baidu.lang.isFunction(source) | ||
510 | - * @param {Any} source 目标参数 | ||
511 | - * @version 1.2 | ||
512 | - * @see baidu.lang.isString,baidu.lang.isObject,baidu.lang.isNumber,baidu.lang.isArray,baidu.lang.isElement,baidu.lang.isBoolean,baidu.lang.isDate | ||
513 | - * @meta standard | ||
514 | - * @returns {boolean} 类型判断结果 | ||
515 | - */ | ||
516 | - baidu.lang.isFunction = function (source) { | ||
517 | - // chrome下,'function' == typeof /a/ 为true. | ||
518 | - return '[object Function]' == Object.prototype.toString.call(source); | ||
519 | - }; | ||
520 | - | ||
521 | - /** | ||
522 | - * | ||
523 | - * @ignore | ||
524 | - * @class Tangram继承机制提供的一个基类,用户可以通过继承baidu.lang.Class来获取它的属性及方法。 | ||
525 | - * @name baidu.lang.Class | ||
526 | - * @grammar baidu.lang.Class(guid) | ||
527 | - * @param {string} guid 对象的唯一标识 | ||
528 | - * @meta standard | ||
529 | - * @remark baidu.lang.Class和它的子类的实例均包含一个全局唯一的标识guid。guid是在构造函数中生成的,因此,继承自baidu.lang.Class的类应该直接或者间接调用它的构造函数。<br>baidu.lang.Class的构造函数中产生guid的方式可以保证guid的唯一性,及每个实例都有一个全局唯一的guid。 | ||
530 | - * @meta standard | ||
531 | - * @see baidu.lang.inherits,baidu.lang.Event | ||
532 | - */ | ||
533 | - baidu.lang.Class = function(guid) { | ||
534 | - this.guid = guid || baidu.lang.guid(); | ||
535 | - window[baidu.guid]._instances[this.guid] = this; | ||
536 | - }; | ||
537 | - window[baidu.guid]._instances = window[baidu.guid]._instances || {}; | ||
538 | - | ||
539 | - /** | ||
540 | - * 释放对象所持有的资源,主要是自定义事件。 | ||
541 | - * @name dispose | ||
542 | - * @grammar obj.dispose() | ||
543 | - */ | ||
544 | - baidu.lang.Class.prototype.dispose = function(){ | ||
545 | - delete window[baidu.guid]._instances[this.guid]; | ||
546 | - | ||
547 | - for(var property in this){ | ||
548 | - if (!baidu.lang.isFunction(this[property])) { | ||
549 | - delete this[property]; | ||
550 | - } | ||
551 | - } | ||
552 | - this.disposed = true; | ||
553 | - }; | ||
554 | - | ||
555 | - /** | ||
556 | - * 重载了默认的toString方法,使得返回信息更加准确一些。 | ||
557 | - * @return {string} 对象的String表示形式 | ||
558 | - */ | ||
559 | - baidu.lang.Class.prototype.toString = function(){ | ||
560 | - return "[object " + (this._className || "Object" ) + "]"; | ||
561 | - }; | ||
562 | - | ||
563 | - /** | ||
564 | - * @ignore | ||
565 | - * @class 自定义的事件对象。 | ||
566 | - * @name baidu.lang.Event | ||
567 | - * @grammar baidu.lang.Event(type[, target]) | ||
568 | - * @param {string} type 事件类型名称。为了方便区分事件和一个普通的方法,事件类型名称必须以"on"(小写)开头。 | ||
569 | - * @param {Object} [target]触发事件的对象 | ||
570 | - * @meta standard | ||
571 | - * @remark 引入该模块,会自动为Class引入3个事件扩展方法:addEventListener、removeEventListener和dispatchEvent。 | ||
572 | - * @meta standard | ||
573 | - * @see baidu.lang.Class | ||
574 | - */ | ||
575 | - baidu.lang.Event = function (type, target) { | ||
576 | - this.type = type; | ||
577 | - this.returnValue = true; | ||
578 | - this.target = target || null; | ||
579 | - this.currentTarget = null; | ||
580 | - }; | ||
581 | - | ||
582 | - /** | ||
583 | - * 注册对象的事件监听器。引入baidu.lang.Event后,Class的子类实例才会获得该方法。 | ||
584 | - * @grammar obj.addEventListener(type, handler[, key]) | ||
585 | - * @param {string} type 自定义事件的名称 | ||
586 | - * @param {Function} handler 自定义事件被触发时应该调用的回调函数 | ||
587 | - * @param {string} [key] 为事件监听函数指定的名称,可在移除时使用。如果不提供,方法会默认为它生成一个全局唯一的key。 | ||
588 | - * @remark 事件类型区分大小写。如果自定义事件名称不是以小写"on"开头,该方法会给它加上"on"再进行判断,即"click"和"onclick"会被认为是同一种事件。 | ||
589 | - */ | ||
590 | - baidu.lang.Class.prototype.addEventListener = function (type, handler, key) { | ||
591 | - if (!baidu.lang.isFunction(handler)) { | ||
592 | - return; | ||
593 | - } | ||
594 | - | ||
595 | - !this.__listeners && (this.__listeners = {}); | ||
596 | - | ||
597 | - var t = this.__listeners, id; | ||
598 | - if (typeof key == "string" && key) { | ||
599 | - if (/[^\w\-]/.test(key)) { | ||
600 | - throw("nonstandard key:" + key); | ||
601 | - } else { | ||
602 | - handler.hashCode = key; | ||
603 | - id = key; | ||
604 | - } | ||
605 | - } | ||
606 | - type.indexOf("on") != 0 && (type = "on" + type); | ||
607 | - | ||
608 | - typeof t[type] != "object" && (t[type] = {}); | ||
609 | - id = id || baidu.lang.guid(); | ||
610 | - handler.hashCode = id; | ||
611 | - t[type][id] = handler; | ||
612 | - }; | ||
613 | - | ||
614 | - /** | ||
615 | - * 移除对象的事件监听器。引入baidu.lang.Event后,Class的子类实例才会获得该方法。 | ||
616 | - * @grammar obj.removeEventListener(type, handler) | ||
617 | - * @param {string} type 事件类型 | ||
618 | - * @param {Function|string} handler 要移除的事件监听函数或者监听函数的key | ||
619 | - * @remark 如果第二个参数handler没有被绑定到对应的自定义事件中,什么也不做。 | ||
620 | - */ | ||
621 | - baidu.lang.Class.prototype.removeEventListener = function (type, handler) { | ||
622 | - if (typeof handler != "undefined") { | ||
623 | - if ( (baidu.lang.isFunction(handler) && ! (handler = handler.hashCode)) | ||
624 | - || (! baidu.lang.isString(handler)) | ||
625 | - ){ | ||
626 | - return; | ||
627 | - } | ||
628 | - } | ||
629 | - | ||
630 | - !this.__listeners && (this.__listeners = {}); | ||
631 | - | ||
632 | - type.indexOf("on") != 0 && (type = "on" + type); | ||
633 | - | ||
634 | - var t = this.__listeners; | ||
635 | - if (!t[type]) { | ||
636 | - return; | ||
637 | - } | ||
638 | - if (typeof handler != "undefined") { | ||
639 | - t[type][handler] && delete t[type][handler]; | ||
640 | - } else { | ||
641 | - for(var guid in t[type]){ | ||
642 | - delete t[type][guid]; | ||
643 | - } | ||
644 | - } | ||
645 | - }; | ||
646 | - | ||
647 | - /** | ||
648 | - * 派发自定义事件,使得绑定到自定义事件上面的函数都会被执行。引入baidu.lang.Event后,Class的子类实例才会获得该方法。 | ||
649 | - * @grammar obj.dispatchEvent(event, options) | ||
650 | - * @param {baidu.lang.Event|String} event Event对象,或事件名称(1.1.1起支持) | ||
651 | - * @param {Object} options 扩展参数,所含属性键值会扩展到Event对象上(1.2起支持) | ||
652 | - * @remark 处理会调用通过addEventListenr绑定的自定义事件回调函数之外,还会调用直接绑定到对象上面的自定义事件。例如:<br> | ||
653 | - myobj.onMyEvent = function(){}<br> | ||
654 | - myobj.addEventListener("onMyEvent", function(){}); | ||
655 | - */ | ||
656 | - baidu.lang.Class.prototype.dispatchEvent = function (event, options) { | ||
657 | - if (baidu.lang.isString(event)) { | ||
658 | - event = new baidu.lang.Event(event); | ||
659 | - } | ||
660 | - !this.__listeners && (this.__listeners = {}); | ||
661 | - | ||
662 | - // 20100603 添加本方法的第二个参数,将 options extend到event中去传递 | ||
663 | - options = options || {}; | ||
664 | - for (var i in options) { | ||
665 | - event[i] = options[i]; | ||
666 | - } | ||
667 | - | ||
668 | - var i, t = this.__listeners, p = event.type; | ||
669 | - event.target = event.target || this; | ||
670 | - event.currentTarget = this; | ||
671 | - | ||
672 | - p.indexOf("on") != 0 && (p = "on" + p); | ||
673 | - | ||
674 | - baidu.lang.isFunction(this[p]) && this[p].apply(this, arguments); | ||
675 | - | ||
676 | - if (typeof t[p] == "object") { | ||
677 | - for (i in t[p]) { | ||
678 | - t[p][i].apply(this, arguments); | ||
679 | - } | ||
680 | - } | ||
681 | - return event.returnValue; | ||
682 | - }; | ||
683 | - | ||
684 | - | ||
685 | - baidu.lang.inherits = function (subClass, superClass, className) { | ||
686 | - var key, proto, | ||
687 | - selfProps = subClass.prototype, | ||
688 | - clazz = new Function(); | ||
689 | - | ||
690 | - clazz.prototype = superClass.prototype; | ||
691 | - proto = subClass.prototype = new clazz(); | ||
692 | - for (key in selfProps) { | ||
693 | - proto[key] = selfProps[key]; | ||
694 | - } | ||
695 | - subClass.prototype.constructor = subClass; | ||
696 | - subClass.superClass = superClass.prototype; | ||
697 | - | ||
698 | - // 类名标识,兼容Class的toString,基本没用 | ||
699 | - if ("string" == typeof className) { | ||
700 | - proto._className = className; | ||
701 | - } | ||
702 | - }; | ||
703 | - // 声明快捷方法 | ||
704 | - baidu.inherits = baidu.lang.inherits; | ||
705 | - })(); | ||
706 | - | ||
707 | - | ||
708 | - /** | ||
709 | - | ||
710 | - * 图片的路径 | ||
711 | - | ||
712 | - * @private | ||
713 | - * @type {String} | ||
714 | - | ||
715 | - */ | ||
716 | - var _IMAGE_PATH = 'http://api.map.baidu.com/library/TextIconOverlay/1.2/src/images/m'; | ||
717 | - | ||
718 | - /** | ||
719 | - | ||
720 | - * 图片的后缀名 | ||
721 | - | ||
722 | - * @private | ||
723 | - * @type {String} | ||
724 | - | ||
725 | - */ | ||
726 | - var _IMAGE_EXTENSION = 'png'; | ||
727 | - | ||
728 | - /** | ||
729 | - *@exports TextIconOverlay as BMapLib.TextIconOverlay | ||
730 | - */ | ||
731 | - var TextIconOverlay = | ||
732 | - /** | ||
733 | - * TextIconOverlay | ||
734 | - * @class 此类表示地图上的一个覆盖物,该覆盖物由文字和图标组成,从Overlay继承。文字通常是数字(0-9)或字母(A-Z ),而文字与图标之间有一定的映射关系。 | ||
735 | - *该覆盖物适用于以下类似的场景:需要在地图上添加一系列覆盖物,这些覆盖物之间用不同的图标和文字来区分,文字可能表示了该覆盖物的某一属性值,根据该文字和一定的映射关系,自动匹配相应颜色和大小的图标。 | ||
736 | - * | ||
737 | - *@constructor | ||
738 | - *@param {Point} position 表示一个经纬度坐标位置。 | ||
739 | - *@param {String} text 表示该覆盖物显示的文字信息。 | ||
740 | - *@param {Json Object} options 可选参数,可选项包括:<br /> | ||
741 | - *"<b>styles</b>":{Array<IconStyle>} 一组图标风格。单个图表风格包括以下几个属性:<br /> | ||
742 | - * url {String} 图片的url地址。(必选)<br /> | ||
743 | - * size {Size} 图片的大小。(必选)<br /> | ||
744 | - * anchor {Size} 图标定位在地图上的位置相对于图标左上角的偏移值,默认偏移值为图标的中心位置。(可选)<br /> | ||
745 | - * offset {Size} 图片相对于可视区域的偏移值,此功能的作用等同于CSS中的background-position属性。(可选)<br /> | ||
746 | - * textSize {Number} 文字的大小。(可选,默认10)<br /> | ||
747 | - * textColor {String} 文字的颜色。(可选,默认black)<br /> | ||
748 | - */ | ||
749 | - BMapLib.TextIconOverlay = function(position, text, options){ | ||
750 | - this._position = position; | ||
751 | - this._text = text; | ||
752 | - this._options = options || {}; | ||
753 | - this._styles = this._options['styles'] || []; | ||
754 | - (!this._styles.length) && this._setupDefaultStyles(); | ||
755 | - }; | ||
756 | - | ||
757 | - T.lang.inherits(TextIconOverlay, BMap.Overlay, "TextIconOverlay"); | ||
758 | - | ||
759 | - TextIconOverlay.prototype._setupDefaultStyles = function(){ | ||
760 | - var sizes = [53, 56, 66, 78, 90]; | ||
761 | - for(var i = 0, size; size = sizes[i]; i++){ | ||
762 | - this._styles.push({ | ||
763 | - url:_IMAGE_PATH + i + '.' + _IMAGE_EXTENSION, | ||
764 | - size: new BMap.Size(size, size) | ||
765 | - }); | ||
766 | - }//for循环的简洁写法 | ||
767 | - }; | ||
768 | - | ||
769 | - /** | ||
770 | - *继承Overlay的intialize方法,自定义覆盖物时必须。 | ||
771 | - *@param {Map} map BMap.Map的实例化对象。 | ||
772 | - *@return {HTMLElement} 返回覆盖物对应的HTML元素。 | ||
773 | - */ | ||
774 | - TextIconOverlay.prototype.initialize = function(map){ | ||
775 | - this._map = map; | ||
776 | - | ||
777 | - this._domElement = document.createElement('div'); | ||
778 | - this._updateCss(); | ||
779 | - this._updateText(); | ||
780 | - this._updatePosition(); | ||
781 | - | ||
782 | - this._bind(); | ||
783 | - | ||
784 | - this._map.getPanes().markerMouseTarget.appendChild(this._domElement); | ||
785 | - return this._domElement; | ||
786 | - }; | ||
787 | - | ||
788 | - /** | ||
789 | - *继承Overlay的draw方法,自定义覆盖物时必须。 | ||
790 | - *@return 无返回值。 | ||
791 | - */ | ||
792 | - TextIconOverlay.prototype.draw = function(){ | ||
793 | - this._map && this._updatePosition(); | ||
794 | - }; | ||
795 | - | ||
796 | - /** | ||
797 | - *获取该覆盖物上的文字。 | ||
798 | - *@return {String} 该覆盖物上的文字。 | ||
799 | - */ | ||
800 | - TextIconOverlay.prototype.getText = function(){ | ||
801 | - return this._text; | ||
802 | - }; | ||
803 | - | ||
804 | - /** | ||
805 | - *设置该覆盖物上的文字。 | ||
806 | - *@param {String} text 要设置的文字,通常是字母A-Z或数字0-9。 | ||
807 | - *@return 无返回值。 | ||
808 | - */ | ||
809 | - TextIconOverlay.prototype.setText = function(text){ | ||
810 | - if(text && (!this._text || (this._text.toString() != text.toString()))){ | ||
811 | - this._text = text; | ||
812 | - this._updateText(); | ||
813 | - this._updateCss(); | ||
814 | - this._updatePosition(); | ||
815 | - } | ||
816 | - }; | ||
817 | - | ||
818 | - /** | ||
819 | - *获取该覆盖物的位置。 | ||
820 | - *@return {Point} 该覆盖物的经纬度坐标。 | ||
821 | - */ | ||
822 | - TextIconOverlay.prototype.getPosition = function () { | ||
823 | - return this._position; | ||
824 | - }; | ||
825 | - | ||
826 | - /** | ||
827 | - *设置该覆盖物的位置。 | ||
828 | - *@param {Point} position 要设置的经纬度坐标。 | ||
829 | - *@return 无返回值。 | ||
830 | - */ | ||
831 | - TextIconOverlay.prototype.setPosition = function (position) { | ||
832 | - if(position && (!this._position || !this._position.equals(position))){ | ||
833 | - this._position = position; | ||
834 | - this._updatePosition(); | ||
835 | - } | ||
836 | - }; | ||
837 | - | ||
838 | - /** | ||
839 | - *由文字信息获取风格数组的对应索引值。 | ||
840 | - *内部默认的对应函数为文字转换为数字除以10的结果,比如文字8返回索引0,文字25返回索引2. | ||
841 | - *如果需要自定义映射关系,请覆盖该函数。 | ||
842 | - *@param {String} text 文字。 | ||
843 | - *@param {Array<IconStyle>} styles 一组图标风格。 | ||
844 | - *@return {Number} 对应的索引值。 | ||
845 | - */ | ||
846 | - TextIconOverlay.prototype.getStyleByText = function(text, styles){ | ||
847 | - var count = parseInt(text); | ||
848 | - if (count < 0) { | ||
849 | - count = 0; | ||
850 | - } | ||
851 | - var index = String(count).length; | ||
852 | - return styles[index - 1]; | ||
853 | - } | ||
854 | - | ||
855 | - /** | ||
856 | - *更新相应的CSS。 | ||
857 | - *@return 无返回值。 | ||
858 | - */ | ||
859 | - TextIconOverlay.prototype._updateCss = function(){ | ||
860 | - var style = this.getStyleByText(this._text, this._styles); | ||
861 | - this._domElement.style.cssText = this._buildCssText(style); | ||
862 | - }; | ||
863 | - | ||
864 | - /** | ||
865 | - *更新覆盖物的显示文字。 | ||
866 | - *@return 无返回值。 | ||
867 | - */ | ||
868 | - TextIconOverlay.prototype._updateText = function(){ | ||
869 | - if (this._domElement) { | ||
870 | - this._domElement.innerHTML = this._text; | ||
871 | - } | ||
872 | - }; | ||
873 | - | ||
874 | - /** | ||
875 | - *调整覆盖物在地图上的位置更新覆盖物的显示文字。 | ||
876 | - *@return 无返回值。 | ||
877 | - */ | ||
878 | - TextIconOverlay.prototype._updatePosition = function(){ | ||
879 | - if (this._domElement && this._position) { | ||
880 | - var style = this._domElement.style; | ||
881 | - var pixelPosition= this._map.pointToOverlayPixel(this._position); | ||
882 | - pixelPosition.x -= Math.ceil(parseInt(style.width) / 2); | ||
883 | - pixelPosition.y -= Math.ceil(parseInt(style.height) / 2); | ||
884 | - style.left = pixelPosition.x + "px"; | ||
885 | - style.top = pixelPosition.y + "px"; | ||
886 | - } | ||
887 | - }; | ||
888 | - | ||
889 | - /** | ||
890 | - * 为该覆盖物的HTML元素构建CSS | ||
891 | - * @param {IconStyle} 一个图标的风格。 | ||
892 | - * @return {String} 构建完成的CSSTEXT。 | ||
893 | - */ | ||
894 | - TextIconOverlay.prototype._buildCssText = function(style) { | ||
895 | - //根据style来确定一些默认值 | ||
896 | - var url = style['url']; | ||
897 | - var size = style['size']; | ||
898 | - var anchor = style['anchor']; | ||
899 | - var offset = style['offset']; | ||
900 | - var textColor = style['textColor'] || 'black'; | ||
901 | - var textSize = style['textSize'] || 10; | ||
902 | - | ||
903 | - var csstext = []; | ||
904 | - if (T.browser["ie"] < 7) { | ||
905 | - csstext.push('filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(' + | ||
906 | - 'sizingMethod=scale,src="' + url + '");'); | ||
907 | - } else { | ||
908 | - if(style['bgColor'] == '' || style['bgColor'] == undefined) { | ||
909 | - csstext.push('background-image:url(' + url + ');'); | ||
910 | - var backgroundPosition = '0 0'; | ||
911 | - (offset instanceof BMap.Size) && (backgroundPosition = offset.width + 'px' + ' ' + offset.height + 'px'); | ||
912 | - csstext.push('background-position:' + backgroundPosition + ';'); | ||
913 | - } else { | ||
914 | - var bgColor = style['bgColor']; | ||
915 | - csstext.push('background-color:' + bgColor + '; border-radius: 51%; box-shadow:1px 0 38px 3px'+ bgColor + ';'); | ||
916 | - } | ||
917 | - } | ||
918 | - | ||
919 | - if (size instanceof BMap.Size){ | ||
920 | - if (anchor instanceof BMap.Size) { | ||
921 | - if (anchor.height > 0 && anchor.height < size.height) { | ||
922 | - csstext.push('height:' + (size.height - anchor.height) + 'px; padding-top:' + anchor.height + 'px;'); | ||
923 | - } | ||
924 | - if(anchor.width > 0 && anchor.width < size.width){ | ||
925 | - csstext.push('width:' + (size.width - anchor.width) + 'px; padding-left:' + anchor.width + 'px;'); | ||
926 | - } | ||
927 | - } else { | ||
928 | - csstext.push('height:' + size.height + 'px; line-height:' + size.height + 'px;'); | ||
929 | - csstext.push('width:' + size.width + 'px; text-align:center;'); | ||
930 | - } | ||
931 | - } | ||
932 | - | ||
933 | - csstext.push('cursor:pointer; color:' + textColor + '; position:absolute; font-size:' + | ||
934 | - textSize + 'px; font-family:Arial,sans-serif; font-weight:bold'); | ||
935 | - return csstext.join(''); | ||
936 | - }; | ||
937 | - | ||
938 | - | ||
939 | - /** | ||
940 | - | ||
941 | - * 当鼠标点击该覆盖物时会触发该事件 | ||
942 | - | ||
943 | - * @name TextIconOverlay#click | ||
944 | - | ||
945 | - * @event | ||
946 | - | ||
947 | - * @param {Event Object} e 回调函数会返回event参数,包括以下返回值: | ||
948 | - | ||
949 | - * <br />"<b>type</b> : {String} 事件类型 | ||
950 | - | ||
951 | - * <br />"<b>target</b>:{BMapLib.TextIconOverlay} 事件目标 | ||
952 | - | ||
953 | - * | ||
954 | - | ||
955 | - */ | ||
956 | - | ||
957 | - /** | ||
958 | - | ||
959 | - * 当鼠标进入该覆盖物区域时会触发该事件 | ||
960 | - | ||
961 | - * @name TextIconOverlay#mouseover | ||
962 | - | ||
963 | - * @event | ||
964 | - * @param {Event Object} e 回调函数会返回event参数,包括以下返回值: | ||
965 | - | ||
966 | - * <br />"<b>type</b> : {String} 事件类型 | ||
967 | - | ||
968 | - * <br />"<b>target</b>:{BMapLib.TextIconOverlay} 事件目标 | ||
969 | - | ||
970 | - * <br />"<b>point</b> : {BMap.Point} 最新添加上的节点BMap.Point对象 | ||
971 | - | ||
972 | - * <br />"<b>pixel</b>:{BMap.pixel} 最新添加上的节点BMap.Pixel对象 | ||
973 | - | ||
974 | - * | ||
975 | - | ||
976 | - * @example <b>参考示例:</b><br /> | ||
977 | - | ||
978 | - * myTextIconOverlay.addEventListener("mouseover", function(e) { alert(e.point); }); | ||
979 | - | ||
980 | - */ | ||
981 | - | ||
982 | - /** | ||
983 | - | ||
984 | - * 当鼠标离开该覆盖物区域时会触发该事件 | ||
985 | - | ||
986 | - * @name TextIconOverlay#mouseout | ||
987 | - | ||
988 | - * @event | ||
989 | - | ||
990 | - * @param {Event Object} e 回调函数会返回event参数,包括以下返回值: | ||
991 | - | ||
992 | - * <br />"<b>type</b> : {String} 事件类型 | ||
993 | - | ||
994 | - * <br />"<b>target</b>:{BMapLib.TextIconOverlay} 事件目标 | ||
995 | - | ||
996 | - * <br />"<b>point</b> : {BMap.Point} 最新添加上的节点BMap.Point对象 | ||
997 | - | ||
998 | - * <br />"<b>pixel</b>:{BMap.pixel} 最新添加上的节点BMap.Pixel对象 | ||
999 | - | ||
1000 | - * | ||
1001 | - | ||
1002 | - * @example <b>参考示例:</b><br /> | ||
1003 | - | ||
1004 | - * myTextIconOverlay.addEventListener("mouseout", function(e) { alert(e.point); }); | ||
1005 | - | ||
1006 | - */ | ||
1007 | - | ||
1008 | - | ||
1009 | - /** | ||
1010 | - * 为该覆盖物绑定一系列事件 | ||
1011 | - * 当前支持click mouseover mouseout | ||
1012 | - * @return 无返回值。 | ||
1013 | - */ | ||
1014 | - TextIconOverlay.prototype._bind = function(){ | ||
1015 | - if (!this._domElement){ | ||
1016 | - return; | ||
1017 | - } | ||
1018 | - | ||
1019 | - var me = this; | ||
1020 | - var map = this._map; | ||
1021 | - | ||
1022 | - var BaseEvent = T.lang.Event; | ||
1023 | - function eventExtend(e, be){ | ||
1024 | - var elem = e.srcElement || e.target; | ||
1025 | - var x = e.clientX || e.pageX; | ||
1026 | - var y = e.clientY || e.pageY; | ||
1027 | - if (e && be && x && y && elem){ | ||
1028 | - var offset = T.dom.getPosition(map.getContainer()); | ||
1029 | - be.pixel = new BMap.Pixel(x - offset.left, y - offset.top); | ||
1030 | - be.point = map.pixelToPoint(be.pixel); | ||
1031 | - } | ||
1032 | - return be; | ||
1033 | - }//给事件参数增加pixel和point两个值 | ||
1034 | - | ||
1035 | - T.event.on(this._domElement,"mouseover", function(e){ | ||
1036 | - me.dispatchEvent(eventExtend(e, new BaseEvent("onmouseover"))); | ||
1037 | - }); | ||
1038 | - T.event.on(this._domElement,"mouseout", function(e){ | ||
1039 | - me.dispatchEvent(eventExtend(e, new BaseEvent("onmouseout"))); | ||
1040 | - }); | ||
1041 | - T.event.on(this._domElement,"click", function(e){ | ||
1042 | - me.dispatchEvent(eventExtend(e, new BaseEvent("onclick"))); | ||
1043 | - }); | ||
1044 | - }; | ||
1045 | - | ||
1046 | -})(); | ||
1047 | \ No newline at end of file | 0 | \ No newline at end of file |
app-ht/web/exts-src/dbr_wasm/dbr-6.3.0.1.wasm
No preview for this file type
app-ht/web/exts-src/dbr_wasm/js/dbr.js
@@ -1,46 +0,0 @@ | @@ -1,46 +0,0 @@ | ||
1 | -var dynamsoft = self.dynamsoft || {}; | ||
2 | -var reader; | ||
3 | -dynamsoft.dbrEnv = dynamsoft.dbrEnv || {}; | ||
4 | -dynamsoft.dbrEnv.resourcesPath = resourcesPath; | ||
5 | -dynamsoft.dbrEnv.licenseKey = "t0126lQMAABEMyEq5ZCNu4lHp3c1/VEMaWC2WbZJyJxnhsk2pJ9iVDyTo8PzWY8fS6s4m6NWkhssycNi/ERwBjhoAUR5TsuIrS3c5XDC7YHbB7ILZBXMI5hDMIZhDMIdgpmCmYKZgpmDOd82fyM1Cw7wxZE281b9pnda68wJay7Ge"; // 2019-09-21日过期 | ||
6 | -dynamsoft.dbrEnv.onAutoLoadWasmSuccess = function () { | ||
7 | - $(".read_barcode_before").hide(); | ||
8 | - $(".read_barcode").show(); | ||
9 | - reader = new dynamsoft.BarcodeReader(); | ||
10 | -}; | ||
11 | -dynamsoft.dbrEnv.onAutoLoadWasmError = function (error) { | ||
12 | - alert("加载失败: " + error); | ||
13 | -}; | ||
14 | - | ||
15 | -function readDynamsoftBarcode() { | ||
16 | - $(".show-barcode-name").empty(); | ||
17 | - var currentShowImage = $("#device_img_list").attr("src"); | ||
18 | - | ||
19 | - if (isDownloadImgToLocalServer == 1) { | ||
20 | - var index = currentShowImage .lastIndexOf("\/"); | ||
21 | - currentShowImage = currentShowImage .substring(index + 1, currentShowImage .length); | ||
22 | - | ||
23 | - // 可以传入图片域名url | ||
24 | - currentShowImage = baseUrl + "/tmp/barcode/" + currentShowImage; | ||
25 | - } | ||
26 | - | ||
27 | - reader.decodeFileInMemory(currentShowImage).then(function (results) { | ||
28 | - var txts = []; | ||
29 | - for (var i = 0; i < results.length; ++i) { | ||
30 | - txts.push(results[i].BarcodeText); | ||
31 | - } | ||
32 | - if (txts === undefined || txts.length == 0) { | ||
33 | - $(".show-barcode-name").append("很抱歉,该图片条码无法识别"); | ||
34 | - return; | ||
35 | - } | ||
36 | - $.each(txts, function (i, result) { | ||
37 | - item = "<a style='color: blue;' data-rel=" + result + ">" + "序列号" + (i+1) + ": " + result + " → 点击使用"; | ||
38 | - item += "<span style='display: none'>" + result + "</span></a><br>"; | ||
39 | - $(".show-barcode-name").append(item); | ||
40 | - }); | ||
41 | - $(".show-barcode-name a").bind('click', function () { | ||
42 | - var data_rel = $(this).find('span').html(); | ||
43 | - $("#serial_no").val(data_rel); | ||
44 | - }); | ||
45 | - }); | ||
46 | -} | ||
47 | \ No newline at end of file | 0 | \ No newline at end of file |
app-ht/web/exts-src/dbr_wasm/js/dynamsoft.barcodereader.min.js
@@ -1,235 +0,0 @@ | @@ -1,235 +0,0 @@ | ||
1 | -var $jscomp={scope:{}};$jscomp.defineProperty="function"==typeof Object.defineProperties?Object.defineProperty:function(f,t,d){if(d.get||d.set)throw new TypeError("ES3 does not support getters and setters.");f!=Array.prototype&&f!=Object.prototype&&(f[t]=d.value)};$jscomp.getGlobal=function(f){return"undefined"!=typeof window&&window===f?f:"undefined"!=typeof global&&null!=global?global:f};$jscomp.global=$jscomp.getGlobal(this);$jscomp.SYMBOL_PREFIX="jscomp_symbol_"; | ||
2 | -$jscomp.initSymbol=function(){$jscomp.initSymbol=function(){};$jscomp.global.Symbol||($jscomp.global.Symbol=$jscomp.Symbol)};$jscomp.symbolCounter_=0;$jscomp.Symbol=function(f){return $jscomp.SYMBOL_PREFIX+(f||"")+$jscomp.symbolCounter_++}; | ||
3 | -$jscomp.initSymbolIterator=function(){$jscomp.initSymbol();var f=$jscomp.global.Symbol.iterator;f||(f=$jscomp.global.Symbol.iterator=$jscomp.global.Symbol("iterator"));"function"!=typeof Array.prototype[f]&&$jscomp.defineProperty(Array.prototype,f,{configurable:!0,writable:!0,value:function(){return $jscomp.arrayIterator(this)}});$jscomp.initSymbolIterator=function(){}};$jscomp.arrayIterator=function(f){var t=0;return $jscomp.iteratorPrototype(function(){return t<f.length?{done:!1,value:f[t++]}:{done:!0}})}; | ||
4 | -$jscomp.iteratorPrototype=function(f){$jscomp.initSymbolIterator();f={next:f};f[$jscomp.global.Symbol.iterator]=function(){return this};return f};$jscomp.makeIterator=function(f){$jscomp.initSymbolIterator();var t=f[Symbol.iterator];return t?t.call(f):$jscomp.arrayIterator(f)}; | ||
5 | -$jscomp.polyfill=function(f,t,d,h){if(t){d=$jscomp.global;f=f.split(".");for(h=0;h<f.length-1;h++){var v=f[h];v in d||(d[v]={});d=d[v]}f=f[f.length-1];h=d[f];t=t(h);t!=h&&null!=t&&$jscomp.defineProperty(d,f,{configurable:!0,writable:!0,value:t})}};$jscomp.EXPOSE_ASYNC_EXECUTOR=!0;$jscomp.FORCE_POLYFILL_PROMISE=!1; | ||
6 | -$jscomp.polyfill("Promise",function(f){function t(){this.batch_=null}if(f&&!$jscomp.FORCE_POLYFILL_PROMISE)return f;t.prototype.asyncExecute=function(d){null==this.batch_&&(this.batch_=[],this.asyncExecuteBatch_());this.batch_.push(d);return this};t.prototype.asyncExecuteBatch_=function(){var d=this;this.asyncExecuteFunction(function(){d.executeBatch_()})};var d=$jscomp.global.setTimeout;t.prototype.asyncExecuteFunction=function(h){d(h,0)};t.prototype.executeBatch_=function(){for(;this.batch_&&this.batch_.length;){var d= | ||
7 | -this.batch_;this.batch_=[];for(var h=0;h<d.length;++h){var f=d[h];delete d[h];try{f()}catch(Cb){this.asyncThrow_(Cb)}}}this.batch_=null};t.prototype.asyncThrow_=function(d){this.asyncExecuteFunction(function(){throw d;})};var h=function(d){this.state_=0;this.result_=void 0;this.onSettledCallbacks_=[];var h=this.createResolveAndReject_();try{d(h.resolve,h.reject)}catch(C){h.reject(C)}};h.prototype.createResolveAndReject_=function(){function d(d){return function(r){f||(f=!0,d.call(h,r))}}var h=this, | ||
8 | -f=!1;return{resolve:d(this.resolveTo_),reject:d(this.reject_)}};h.prototype.resolveTo_=function(d){if(d===this)this.reject_(new TypeError("A Promise cannot resolve to itself"));else if(d instanceof h)this.settleSameAsPromise_(d);else{var f;a:switch(typeof d){case "object":f=null!=d;break a;case "function":f=!0;break a;default:f=!1}f?this.resolveToNonPromiseObj_(d):this.fulfill_(d)}};h.prototype.resolveToNonPromiseObj_=function(d){var h=void 0;try{h=d.then}catch(C){this.reject_(C);return}"function"== | ||
9 | -typeof h?this.settleSameAsThenable_(h,d):this.fulfill_(d)};h.prototype.reject_=function(d){this.settle_(2,d)};h.prototype.fulfill_=function(d){this.settle_(1,d)};h.prototype.settle_=function(d,h){if(0!=this.state_)throw Error("Cannot settle("+d+", "+h|"): Promise already settled in state"+this.state_);this.state_=d;this.result_=h;this.executeOnSettledCallbacks_()};h.prototype.executeOnSettledCallbacks_=function(){if(null!=this.onSettledCallbacks_){for(var d=this.onSettledCallbacks_,h=0;h<d.length;++h)d[h].call(), | ||
10 | -d[h]=null;this.onSettledCallbacks_=null}};var v=new t;h.prototype.settleSameAsPromise_=function(d){var h=this.createResolveAndReject_();d.callWhenSettled_(h.resolve,h.reject)};h.prototype.settleSameAsThenable_=function(d,h){var f=this.createResolveAndReject_();try{d.call(h,f.resolve,f.reject)}catch(Cb){f.reject(Cb)}};h.prototype.then=function(d,f){function r(d,h){return"function"==typeof d?function(h){try{t(d(h))}catch(wa){v(wa)}}:h}var t,v,K=new h(function(d,h){t=d;v=h});this.callWhenSettled_(r(d, | ||
11 | -t),r(f,v));return K};h.prototype["catch"]=function(d){return this.then(void 0,d)};h.prototype.callWhenSettled_=function(d,h){function f(){switch(r.state_){case 1:d(r.result_);break;case 2:h(r.result_);break;default:throw Error("Unexpected state: "+r.state_);}}var r=this;null==this.onSettledCallbacks_?v.asyncExecute(f):this.onSettledCallbacks_.push(function(){v.asyncExecute(f)})};h.resolve=function(d){return d instanceof h?d:new h(function(h,f){h(d)})};h.reject=function(d){return new h(function(h, | ||
12 | -f){f(d)})};h.race=function(d){return new h(function(f,r){for(var t=$jscomp.makeIterator(d),v=t.next();!v.done;v=t.next())h.resolve(v.value).callWhenSettled_(f,r)})};h.all=function(d){var f=$jscomp.makeIterator(d),r=f.next();return r.done?h.resolve([]):new h(function(d,t){function v(h){return function(f){C[h]=f;K--;0==K&&d(C)}}var C=[],K=0;do C.push(void 0),K++,h.resolve(r.value).callWhenSettled_(v(C.length-1),t),r=f.next();while(!r.done)})};$jscomp.EXPOSE_ASYNC_EXECUTOR&&(h.$jscomp$new$AsyncExecutor= | ||
13 | -function(){return new t});return h},"es6-impl","es3");$jscomp.array=$jscomp.array||{};$jscomp.iteratorFromArray=function(f,t){$jscomp.initSymbolIterator();f instanceof String&&(f+="");var d=0,h={next:function(){if(d<f.length){var v=d++;return{value:t(v,f[v]),done:!1}}h.next=function(){return{done:!0,value:void 0}};return h.next()}};h[Symbol.iterator]=function(){return h};return h}; | ||
14 | -$jscomp.polyfill("Array.prototype.keys",function(f){return f?f:function(){return $jscomp.iteratorFromArray(this,function(f){return f})}},"es6-impl","es3");var dynamsoft=self.dynamsoft||{}; | ||
15 | -dynamsoft.TaskQueue=dynamsoft.TaskQueue||function(){var f=function(){this._queue=[];this.isWorking=!1;this.timeout=100};f.prototype.push=function(f,d,h){this._queue.push({task:f,context:d,args:h});this.isWorking||this.next()};f.prototype.unshift=function(f,d,h){this._queue.unshift({task:f,context:d,args:h});this.isWorking||this.next()};f.prototype.next=function(){if(0==this._queue.length)this.isWorking=!1;else{this.isWorking=!0;var f=this._queue.shift(),d=f.task,h=f.context?f.context:self,v=f.args? | ||
16 | -f.args:[];setTimeout(function(){d.apply(h,v)},this.timeout)}};return f}();dynamsoft=self.dynamsoft||{};dynamsoft.dbrEnv=dynamsoft.dbrEnv||{};void 0==dynamsoft.dbrEnv.logLevel&&(dynamsoft.dbrEnv.logLevel=3); | ||
17 | -dynamsoft.BarcodeReader=dynamsoft.BarcodeReader||function(){var f=function(d){d=d||dynamsoft.dbrEnv.licenseKey||"";if(!("string"==typeof d||"object"==typeof d&&d instanceof String))throw TypeError("'Constructor BarcodeReader(licenseKey)': Type of 'licenseKey' should be 'String'.");this._licenseKey=d;this._instance=new dynamsoft.BarcodeReader._BarcodeReaderWasm(this._licenseKey);if(0==this._instance)throw new dynamsoft.BarcodeReader.BarcodeReaderException(dynamsoft.BarcodeReader.EnumErrorCode.DBR_NULL_REFERENCE, | ||
18 | -"Can't create BarcodeReader instance.");};f._jsVersion="6.3.0.1";f._jsEditVersion="20180802";f.version="loading...(JS "+f._jsVersion+"."+f._jsEditVersion+")";f.prototype.deleteInstance=function(){this._instance["delete"]()};f.prototype._decodeBlob=function(d,h){var f=this;return(new Promise(function(h,f){if(!(d instanceof Blob))throw TypeError("'_decodeBlob(blob, templateName)': Type of 'blob' should be 'Blob'.");var r=URL.createObjectURL(d),v=new Image;v.dbrObjUrl=r;v.src=r;v.onload=function(){h(v)}; | ||
19 | -v.onerror=function(){f(TypeError("'_decodeBlob(blob, templateName)': Can't convert the blob to image."))}})).then(function(d){return f._decodeImage(d)})};f.prototype._decodeArrayBuffer=function(d,h){var f=this;return(new Promise(function(f){if(!(d instanceof ArrayBuffer))throw TypeError("'_decodeBlob(arrayBuffer, templateName)': Type of 'arrayBuffer' should be 'ArrayBuffer'.");h=h||"";f()})).then(function(){return f._decodeBlob(new Blob(d),h)})};f.prototype._decodeUint8Array=function(d,h){var f=this; | ||
20 | -return(new Promise(function(f){if(!(d instanceof Uint8Array||self.Uint8ClampedArray&&d instanceof Uint8ClampedArray))throw TypeError("'_decodeBlob(uint8Array, templateName)': Type of 'uint8Array' should be 'Uint8Array'.");h=h||"";f(d)})).then(function(d){return f._decodeBlob(new Blob(d),h)})};f.prototype._decodeImage=function(d,h){var f=this;return(new Promise(function(f){if(!(d instanceof HTMLImageElement))throw TypeError("'_decodeImage(image, templateName)': Type of 'image' should be 'HTMLImageElement'."); | ||
21 | -if(d.crossOrigin&&"anonymous"!=d.crossOrigin)throw"cors";h=h||"";f()})).then(function(){var r=document.createElement("canvas");r.width=d.naturalWidth;r.height=d.naturalHeight;r.getContext("2d").drawImage(d,0,0);d.dbrObjUrl&&URL.revokeObjectURL(d.dbrObjUrl);return f._decodeCanvas(r,h)})};f.prototype._decodeCanvas=function(d,h){var f=this;return(new Promise(function(f){if(!(d instanceof HTMLCanvasElement))throw TypeError("'_decodeCanvas(canvas, templateName)': Type of 'canvas' should be 'HTMLCanvasElement'."); | ||
22 | -if(d.crossOrigin&&"anonymous"!=d.crossOrigin)throw"cors";h=h||"";var r=d.getContext("2d").getImageData(0,0,d.width,d.height).data;f(r)})).then(function(r){return f._decodeRawImageUint8Array(r,d.width,d.height,4*d.width,dynamsoft.BarcodeReader.EnumImagePixelFormat.IPF_ARGB_8888,h)})};f.prototype._decodeVideo=f.prototype.decodeVideo=function(d){var h=this,f,r=arguments;return(new Promise(function(h){if(!(d instanceof HTMLVideoElement))throw TypeError("'_decodeVideo(video [ [, sx, sy, sWidth, sHeight], dWidth, dHeight] [, templateName] )': Type of 'video' should be 'HTMLVideoElement'."); | ||
23 | -if(d.crossOrigin&&"anonymous"!=d.crossOrigin)throw"cors";var v,t,K,ka,N,W;2>=r.length?(v=t=0,K=N=d.videoWidth,ka=W=d.videoHeight):4>=r.length?(v=t=0,K=d.videoWidth,ka=d.videoHeight,N=r[1],W=r[2]):(v=r[1],t=r[2],K=r[3],ka=r[4],N=r[5],W=r[6]);f="string"==typeof r[r.length-1]?r[r.length-1]:"";var Z=document.createElement("canvas");Z.width=N;Z.height=W;Z.getContext("2d").drawImage(d,v,t,K,ka,0,0,N,W);h(Z)})).then(function(d){return h._decodeCanvas(d,f)})};f.prototype._decodeBase64=f.prototype.decodeBase64String= | ||
24 | -function(d,h){var f=this;return(new Promise(function(f){if(!("string"==typeof d||"object"==typeof d&&d instanceof String))throw TypeError("'decodeBase64(base64Str, templateName)': Type of 'base64Str' should be 'String'.");"data:image/"==d.substring(0,11)&&(d=d.substring(d.indexOf(",")+1));h=h||"";for(var r=atob(d),v=r.length,t=new Uint8Array(v);v--;)t[v]=r.charCodeAt(v);f(new Blob([t]))})).then(function(d){return f._decodeBlob(d,h)})};f.prototype._decodeUrl=function(d,h){var f=this;return(new Promise(function(f, | ||
25 | -v){if(!("string"==typeof d||"object"==typeof d&&d instanceof String))throw TypeError("'_decodeUrl(url, templateName)': Type of 'url' should be 'String'.");h=h||"";var r=new XMLHttpRequest;r.open("GET",d,!0);r.responseType="blob";r.send();r.onloadend=function(){f(this.response)};r.onerror=function(){v(r.error)}})).then(function(d){return f._decodeBlob(d,h)})};f.prototype._decodeRawImageBlob=function(d,f,v,r,t,C){var h=this;return(new Promise(function(f,h){if(!(d instanceof Blob))throw TypeError("'_decodeRawImageBlob(buffer, width, height, stride, enumImagePixelFormat, templateName)': Type of 'buffer' should be 'Blob'."); | ||
26 | -C=C||"";var r=new FileReader;r.readAsArrayBuffer(d);r.onload=function(){f(r.result)};r.onerror=function(){h(r.error)}})).then(function(d){return h._decodeRawImageUint8Array(new Uint8Array(d),f,v,r,t,C)})};f.prototype._decodeRawImageArrayBuffer=function(d,f,v,r,t,C){var h=this;return(new Promise(function(f){if(!(d instanceof ArrayBuffer))throw TypeError("'_decodeRawImageArrayBuffer(buffer, width, height, stride, enumImagePixelFormat, templateName)': Type of 'buffer' should be 'ArrayBuffer'.");C=C|| | ||
27 | -"";f()})).then(function(){return h._decodeRawImageUint8Array(new Uint8Array(d),f,v,r,t,C)})};f.prototype._decodeRawImageUint8Array=function(d,f,v,r,K,C){var h=this;return new Promise(function(O){if(!(d instanceof Uint8Array||self.Uint8ClampedArray&&d instanceof Uint8ClampedArray))throw TypeError("'_decodeRawImageUint8Array(buffer, width, height, stride, enumImagePixelFormat, templateName)': Type of 'buffer' should be 'Uint8Array'.");C=C||"";O(t(h._instance.DecodeBuffer(d,f,v,r,K,C)))})};f.prototype._decode= | ||
28 | -f.prototype.decodeFileInMemory=function(d,f){return Blob&&d instanceof Blob?this._decodeBlob(d,f):self.ArrayBuffer&&d instanceof ArrayBuffer?this._decodeArrayBuffer(d,f):self.Uint8Array&&d instanceof Uint8Array||self.Uint8ClampedArray&&d instanceof Uint8ClampedArray?this._decodeUint8Array(d,f):self.HTMLImageElement&&d instanceof HTMLImageElement?this._decodeImage(d,f):self.HTMLCanvasElement&&d instanceof HTMLCanvasElement?this._decodeCanvas(d,f):self.HTMLVideoElement&&d instanceof HTMLVideoElement? | ||
29 | -this._decodeVideo(d,f):"string"==typeof d||d instanceof String?"data:image/"==d.substring(0,11)?this._decodeBase64(d,f):this._decodeUrl(d,f):Promise.reject(TypeError("'_decode(source, templateName)': Type of 'source' should be 'Blob', 'ArrayBuffer', 'Uint8Array', 'HTMLImageElement', 'HTMLCanvasElement', 'HTMLVideoElement', 'String(base64 with image mime)' or 'String(url)'."))};f.prototype._decodeRawImage=f.prototype.decodeBuffer=function(d,f,t,r,K,C){return Blob&&d instanceof Blob?this._decodeRawImageBlob(d, | ||
30 | -f,t,r,K,C):ArrayBuffer&&d instanceof ArrayBuffer?this._decodeRawImageArrayBuffer(d,f,t,r,K,C):self.Uint8Array&&d instanceof Uint8Array||self.Uint8ClampedArray&&d instanceof Uint8ClampedArray?this._decodeRawImageUint8Array(d,f,t,r,K,C):Promise.reject(TypeError("'_decodeRawImage(source, width, height, stride, enumImagePixelFormat, templateName)': Type of 'source' should be 'Blob', 'ArrayBuffer' or 'Uint8Array'."))};var t=function(d){d="string"==typeof d||"object"==typeof d&&d instanceof String?JSON.parse(d): | ||
31 | -d;var h=f.EnumErrorCode;switch(d.exception){case h.DBR_SUCCESS:case h.DBR_LICENSE_INVALID:case h.DBR_1D_LICENSE_INVALID:case h.DBR_QR_LICENSE_INVALID:case h.DBR_PDF417_LICENSE_INVALID:case h.DBR_DATAMATRIX_LICENSE_INVALID:case h.DBR_DBRERR_AZTEC_LICENSE_INVALID:case h.DBR_RECOGNITION_TIMEOUT:if(d.textResult)for(h=0;h<d.textResult.length;++h){var t=d.textResult[h];try{t.BarcodeText=atob(t.BarcodeText)}catch(r){t.BarcodeText=""}}return d.textResult||d.localizationResultArray||d.Result||d.templateSettings|| | ||
32 | -d.settings||d.outputSettings||d;default:throw new f.BarcodeReaderException(d.exception,d.description);}};f.prototype.getAllLocalizationResults=function(){return t(this._instance.GetAllLocalizationResults())};f.prototype.getAllParameterTemplateNames=function(){return t(this._instance.GetAllParameterTemplateNames())};f.prototype.getRuntimeSettings=function(){return t(this._instance.GetRuntimeSettings())};f.prototype.updateRuntimeSettings=function(d){if(!("string"==typeof d||"object"==typeof d&&d instanceof | ||
33 | -String))if("object"==typeof d)d=JSON.stringify(d);else throw TypeError("'UpdateRuntimeSettings(settings)': Type of 'settings' should be 'String' or 'PlainObject'.");t(this._instance.UpdateRuntimeSettings(d))};f.prototype.resetRuntimeSettings=function(){t(this._instance.ResetRuntimeSettings())};f.prototype.outputSettingsToString=function(d){return t(this._instance.OutputSettingsToString(d||""))};f.prototype.initRuntimeSettingsWithString=function(d,f){if(!("string"==typeof d||"object"==typeof d&&d instanceof | ||
34 | -String))if("object"==typeof d)d=JSON.stringify(d);else throw TypeError("'initRuntimeSettingstWithString(template, enumComflictMode)': Type of 'template' should be 'String' or 'PlainObject'.");t(this._instance.InitRuntimeSettingstWithString(d,f?f:2))};f.prototype.appendTplStringToRuntimeSettings=function(d,f){if(!("string"==typeof d||"object"==typeof d&&d instanceof String))if("object"==typeof d)d=JSON.stringify(d);else throw TypeError("'appendTplStringToRuntimeSettings(template, enumComflictMode)': Type of 'template' should be 'String' or 'PlainObject'."); | ||
35 | -t(this._instance.AppendTplStringToRuntimeSettings(d,f?f:2))};return f}();dynamsoft.BarcodeReader.EnumBarcodeFormat=dynamsoft.BarcodeReader.EnumBarcodeFormat||function(){return{All:503317503,OneD:1023,CODE_39:1,CODE_128:2,CODE_93:4,CODABAR:8,ITF:16,EAN_13:32,EAN_8:64,UPC_A:128,UPC_E:256,INDUSTRIAL_25:512,PDF417:33554432,QR_CODE:67108864,DATAMATRIX:134217728,AZTEC:268435456}}(); | ||
36 | -dynamsoft.BarcodeReader.EnumErrorCode=dynamsoft.BarcodeReader.EnumErrorCode||function(){return{DBR_SYSTEM_EXCEPTION:1,DBR_SUCCESS:0,DBR_UNKNOWN:-1E4,DBR_NO_MEMORY:-10001,DBR_NULL_REFERENCE:-10002,DBR_LICENSE_INVALID:-10003,DBR_LICENSE_EXPIRED:-10004,DBR_FILE_NOT_FOUND:-10005,DBR_FILETYPE_NOT_SUPPORTED:-10006,DBR_BPP_NOT_SUPPORTED:-10007,DBR_INDEX_INVALID:-10008,DBR_BARCODE_FORMAT_INVALID:-10009,DBR_CUSTOM_REGION_INVALID:-10010,DBR_MAX_BARCODE_NUMBER_INVALID:-10011,DBR_IMAGE_READ_FAILED:-10012,DBR_TIFF_READ_FAILED:-10013, | ||
37 | -DBR_QR_LICENSE_INVALID:-10016,DBR_1D_LICENSE_INVALID:-10017,DBR_DIB_BUFFER_INVALID:-10018,DBR_PDF417_LICENSE_INVALID:10019,DBR_DATAMATRIX_LICENSE_INVALID:-10020,DBR_PDF_READ_FAILED:-10021,DBR_PDF_DLL_MISSING:-10022,DBR_PAGE_NUMBER_INVALID:-10023,DBR_CUSTOM_SIZE_INVALID:-10024,DBR_CUSTOM_MODULESIZE_INVALID:-10025,DBR_RECOGNITION_TIMEOUT:-10026,DBR_JSON_PARSE_FAILED:-10030,DBR_JSON_TYPE_INVALID:-10031,DBR_JSON_KEY_INVALID:-10032,DBR_JSON_VALUE_INVALID:-10033,DBR_JSON_NAME_KEY_MISSING:-10034,DBR_JSON_NAME_VALUE_DUPLICATED:-10035, | ||
38 | -DBR_TEMPLATE_NAME_INVALID:-10036,DBR_JSON_NAME_REFERENCE_INVALID:-10037,DBR_PARAMETER_VALUE_INVALID:-10038,DBR_DOMAIN_NOT_MATCHED:-10039,DBR_RESERVEDINFO_NOT_MATCHED:-10040,DBR_DBRERR_AZTEC_LICENSE_INVALID:-10041}}();dynamsoft.BarcodeReader.EnumImagePixelFormat=dynamsoft.BarcodeReader.EnumImagePixelFormat||function(){return{IPF_Binary:0,IPF_BinaryInverted:1,IPF_GrayScaled:2,IPF_NV21:3,IPF_RGB_565:4,IPF_RGB_555:5,IPF_RGB_888:6,IPF_ARGB_8888:7}}(); | ||
39 | -dynamsoft.BarcodeReader.EnumResultType=dynamsoft.BarcodeReader.EnumResultType||function(){return{EDT_StandardText:0,EDT_RawText:1,EDT_CandidateText:2,EDT_PartialText:3}}();dynamsoft.BarcodeReader.EnumTerminateStage=dynamsoft.BarcodeReader.EnumTerminateStage||function(){return{ETS_Prelocalized:0,ETS_Localized:1,ETS_Recognized:2}}();dynamsoft.BarcodeReader.EnumConflictMode=dynamsoft.BarcodeReader.EnumConflictMode||function(){return{ECM_Ignore:1,ECM_Overwrite:2}}(); | ||
40 | -dynamsoft.BarcodeReader.BarcodeReaderException=dynamsoft.BarcodeReader.BarcodeReaderException||function(){var f=function(d,f){var h=dynamsoft.BarcodeReader.EnumErrorCode.DBR_UNKNOWN;"number"==typeof d?(h=d,this.message=f):this.message=d;this.code=h},t=function(){};t.prototype=Error.prototype;f.prototype=new t;return f.prototype.constructor=f}(); | ||
41 | -dynamsoft.BarcodeReader.loadWasm=dynamsoft.BarcodeReader.loadWasm||function(){return new Promise(function(f,t){var d=dynamsoft.BarcodeReader;if("loaded"==d._loadWasmStatus)return f();d._loadWasmTaskQueue=d._loadWasmTaskQueue||function(){var d=new dynamsoft.TaskQueue;d.timeout=0;return d}();d._loadWasmTaskQueue.push(function(h){if("loaded"==d._loadWasmStatus)return d._loadWasmTaskQueue.next(),f();if(h)return d._loadWasmTaskQueue.next(),t(d._loadWasmStatus);d._loadWasmStatus="loading";return(new Promise(function(f, | ||
42 | -h){function r(a){O(!Db);var c=G;G=G+a+15&-16;return c}function t(a){O(aa);var c=p[aa>>2];a=c+a+15&-16;p[aa>>2]=a;return a>=H&&!qc()?(p[aa>>2]=c,0):c}function v(a){var c;c||(c=16);return Math.ceil(a/c)*c}function O(a,c){a||E("Assertion failed: "+c)}function ka(a,c){if("number"===typeof a)var b=!0,e=a;else b=!1,e=a.length;c=4==c?k:["function"===typeof da?da:r,ld,r,t][void 0===c?2:c](Math.max(e,1));if(b){var k=c;O(0==(c&3));for(a=c+(e&-4);k<a;k+=4)p[k>>2]=0;for(a=c+e;k<a;)P[k++>>0]=0;return c}a.subarray|| | ||
43 | -a.slice?I.set(a,c):I.set(new Uint8Array(a),c);return c}function N(a){var c;if(0===c||!a)return"";for(var b=0,e,k=0;;){e=I[a+k>>0];b|=e;if(0==e&&!c)break;k++;if(c&&k==c)break}c||(c=k);e="";if(128>b){for(;0<c;)b=String.fromCharCode.apply(String,I.subarray(a,a+Math.min(c,1024))),e=e?e+b:b,a+=1024,c-=1024;return e}return W(I,a)}function W(a,c){for(var b=c;a[b];)++b;if(16<b-c&&a.subarray&&rc)return rc.decode(a.subarray(c,b));for(b="";;){var e=a[c++];if(!e)return b;if(e&128){var k=a[c++]&63;if(192==(e& | ||
44 | -224))b+=String.fromCharCode((e&31)<<6|k);else{var l=a[c++]&63;if(224==(e&240))e=(e&15)<<12|k<<6|l;else{var d=a[c++]&63;if(240==(e&248))e=(e&7)<<18|k<<12|l<<6|d;else{var f=a[c++]&63;if(248==(e&252))e=(e&3)<<24|k<<18|l<<12|d<<6|f;else var h=a[c++]&63,e=(e&1)<<30|k<<24|l<<18|d<<12|f<<6|h}}65536>e?b+=String.fromCharCode(e):(e-=65536,b+=String.fromCharCode(55296|e>>10,56320|e&1023))}}else b+=String.fromCharCode(e)}}function Z(a,c,b,e){if(!(0<e))return 0;var g=b;e=b+e-1;for(var l=0;l<a.length;++l){var d= | ||
45 | -a.charCodeAt(l);55296<=d&&57343>=d&&(d=65536+((d&1023)<<10)|a.charCodeAt(++l)&1023);if(127>=d){if(b>=e)break;c[b++]=d}else{if(2047>=d){if(b+1>=e)break;c[b++]=192|d>>6}else{if(65535>=d){if(b+2>=e)break;c[b++]=224|d>>12}else{if(2097151>=d){if(b+3>=e)break;c[b++]=240|d>>18}else{if(67108863>=d){if(b+4>=e)break;c[b++]=248|d>>24}else{if(b+5>=e)break;c[b++]=252|d>>30;c[b++]=128|d>>24&63}c[b++]=128|d>>18&63}c[b++]=128|d>>12&63}c[b++]=128|d>>6&63}c[b++]=128|d&63}}c[b]=0;return b-g}function wa(a){for(var c= | ||
46 | -0,b=0;b<a.length;++b){var e=a.charCodeAt(b);55296<=e&&57343>=e&&(e=65536+((e&1023)<<10)|a.charCodeAt(++b)&1023);127>=e?++c:c=2047>=e?c+2:65535>=e?c+3:2097151>=e?c+4:67108863>=e?c+5:c+6}return c}function Eb(a,c){0<a%c&&(a+=c-a%c);return a}function Fb(){b.HEAP8=P=new Int8Array(L);b.HEAP16=Ha=new Int16Array(L);b.HEAP32=p=new Int32Array(L);b.HEAPU8=I=new Uint8Array(L);b.HEAPU16=Gb=new Uint16Array(L);b.HEAPU32=ea=new Uint32Array(L);b.HEAPF32=sc=new Float32Array(L);b.HEAPF64=tc=new Float64Array(L)}function qc(){var a= | ||
47 | -b.usingWasm?Hb:uc,c=2147483648-a;if(p[aa>>2]>c)return!1;var g=H;for(H=Math.max(H,md);H<p[aa>>2];)536870912>=H?H=Eb(2*H,a):H=Math.min(Eb((3*H+2147483648)/4,a),c);a=b.reallocBuffer(H);if(!a||a.byteLength!=H)return H=g,!1;b.buffer=L=a;Fb();return!0}function Ia(a){for(;0<a.length;){var c=a.shift();if("function"==typeof c)c();else{var g=c.b;"number"===typeof g?void 0===c.ua?b.dynCall_v(g):b.dynCall_vi(g,c.ua):g(void 0===c.ua?null:c.ua)}}}function nd(){var a=b.preRun.shift();vc.unshift(a)}function $a(a){return String.prototype.startsWith? | ||
48 | -a.startsWith("data:application/octet-stream;base64,"):0===a.indexOf("data:application/octet-stream;base64,")}function xa(){return!!xa.u}function wc(a){if(!a||X[a])return a;for(var c in X)if(X[c].Ia===a)return c;return a}function xc(a){try{return R(a)}catch(c){}}function Ib(){var a=ya;if(!a)return(ab(0),0)|0;var c=X[a],g=c.type;if(!g)return(ab(0),a)|0;var e=Array.prototype.slice.call(arguments);b.___cxa_is_pointer_type(g);bb||(bb=da(4));p[bb>>2]=a;for(var a=bb,k=0;k<e.length;k++)if(e[k]&&b.___cxa_can_catch(e[k], | ||
49 | -g,a))return a=p[a>>2],c.Ia=a,(ab(e[k]),a)|0;a=p[a>>2];return(ab(g),a)|0}function Jb(a){b.___errno_location&&(p[b.___errno_location()>>2]=a);return a}function Kb(a,c){for(var b=0,e=a.length-1;0<=e;e--){var k=a[e];"."===k?a.splice(e,1):".."===k?(a.splice(e,1),b++):b&&(a.splice(e,1),b--)}if(c)for(;b;b--)a.unshift("..");return a}function Lb(a){var c="/"===a.charAt(0),b="/"===a.substr(-1);(a=Kb(a.split("/").filter(function(a){return!!a}),!c).join("/"))||c||(a=".");a&&b&&(a+="/");return(c?"/":"")+a}function od(a){var c= | ||
50 | -/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/.exec(a).slice(1);a=c[0];c=c[1];if(!a&&!c)return".";c&&(c=c.substr(0,c.length-1));return a+c}function yc(a){if("/"===a)return"/";var c=a.lastIndexOf("/");return-1===c?a:a.substr(c+1)}function pd(){var a=Array.prototype.slice.call(arguments,0);return Lb(a.join("/"))}function qa(a,c){return Lb(a+"/"+c)}function cb(){for(var a="",c=!1,b=arguments.length-1;-1<=b&&!c;b--){c=0<=b?arguments[b]:"/";if("string"!==typeof c)throw new TypeError("Arguments to path.resolve must be strings"); | ||
51 | -if(!c)return"";a=c+"/"+a;c="/"===c.charAt(0)}a=Kb(a.split("/").filter(function(a){return!!a}),!c).join("/");return(c?"/":"")+a||"."}function zc(a,c){Ac[a]={input:[],output:[],W:c};Mb(a,qd)}function ra(a,c){a=cb("/",a);c=c||{};if(!a)return{path:"",node:null};var b={Qa:!0,Ba:0},e;for(e in b)void 0===c[e]&&(c[e]=b[e]);if(8<c.Ba)throw new q(m.sa);a=Kb(a.split("/").filter(function(a){return!!a}),!1);var k=Nb,b="/";for(e=0;e<a.length;e++){var l=e===a.length-1;if(l&&c.parent)break;k=db(k,a[e]);b=qa(b,a[e]); | ||
52 | -k.ma&&(!l||l&&c.Qa)&&(k=k.ma.root);if(!l||c.Pa)for(l=0;40960===(k.mode&61440);)if(k=Bc(b),b=cb(od(b),k),k=ra(b,{Ba:c.Ba}).node,40<l++)throw new q(m.sa);}return{path:b,node:k}}function Cc(a){for(var c;;){if(a===a.parent)return a=a.v.Ua,c?"/"!==a[a.length-1]?a+"/"+c:a+c:a;c=c?a.name+"/"+c:a.name;a=a.parent}}function Dc(a,c){for(var b=0,e=0;e<c.length;e++)b=(b<<5)-b+c.charCodeAt(e)|0;return(a+b>>>0)%Ja.length}function rd(a){var c=Dc(a.parent.id,a.name);a.lb=Ja[c];Ja[c]=a}function db(a,c){var b;if(b= | ||
53 | -(b=eb(a,"x"))?b:a.h.lookup?0:m.ra)throw new q(b,a);for(b=Ja[Dc(a.id,c)];b;b=b.lb){var e=b.name;if(b.parent.id===a.id&&e===c)return b}return a.h.lookup(a,c)}function Ob(a,c,b,e){Ka||(Ka=function(a,c,b,g){a||(a=this);this.parent=a;this.v=a.v;this.ma=null;this.id=sd++;this.name=c;this.mode=b;this.h={};this.g={};this.rdev=g},Ka.prototype={},Object.defineProperties(Ka.prototype,{read:{get:function(){return 365===(this.mode&365)},set:function(a){a?this.mode|=365:this.mode&=-366}},write:{get:function(){return 146=== | ||
54 | -(this.mode&146)},set:function(a){a?this.mode|=146:this.mode&=-147}}}));a=new Ka(a,c,b,e);rd(a);return a}function Ec(a){var c=["r","w","rw"][a&3];a&512&&(c+="w");return c}function eb(a,c){if(Fc)return 0;if(-1===c.indexOf("r")||a.mode&292){if(-1!==c.indexOf("w")&&!(a.mode&146)||-1!==c.indexOf("x")&&!(a.mode&73))return m.ra}else return m.ra;return 0}function Gc(a,c){try{return db(a,c),m.Ea}catch(g){}return eb(a,"wx")}function td(a){for(a=a||0;4096>=a;a++)if(!la[a])return a;throw new q(m.Xa);}function ud(a, | ||
55 | -c){La||(La=function(){},La.prototype={},Object.defineProperties(La.prototype,{object:{get:function(){return this.node},set:function(a){this.node=a}}}));var b=new La,e;for(e in a)b[e]=a[e];a=b;c=td(c);a.fd=c;return la[c]=a}function Mb(a,c){Hc[a]={g:c}}function Ic(a,c){var b="/"===c,e=!c;if(b&&Nb)throw new q(m.Da);if(!b&&!e){var k=ra(c,{Qa:!1});c=k.path;k=k.node;if(k.ma)throw new q(m.Da);if(16384!==(k.mode&61440))throw new q(m.Fa);}c={type:a,za:{},Ua:c,kb:[]};a=a.v(c);a.v=c;c.root=a;b?Nb=a:k&&(k.ma= | ||
56 | -c,k.v&&k.v.kb.push(c))}function Pb(a,c,b){var g=ra(a,{parent:!0}).node;a=yc(a);if(!a||"."===a||".."===a)throw new q(m.m);var k=Gc(g,a);if(k)throw new q(k);if(!g.h.$)throw new q(m.Y);return g.h.$(g,a,c,b)}function fa(a){Pb(a,16895,0)}function fb(a,c,b){"undefined"===typeof b&&(b=c,c=438);Pb(a,c|8192,b)}function Qb(a,c){if(!cb(a))throw new q(m.L);var b=ra(c,{parent:!0}).node;if(!b)throw new q(m.L);c=yc(c);var e=Gc(b,c);if(e)throw new q(e);if(!b.h.symlink)throw new q(m.Y);b.h.symlink(b,c,a)}function Bc(a){a= | ||
57 | -ra(a).node;if(!a)throw new q(m.L);if(!a.h.readlink)throw new q(m.m);return cb(Cc(a.parent),a.h.readlink(a))}function Ma(a,c,g,e){if(""===a)throw new q(m.L);if("string"===typeof c){var k=vd[c];if("undefined"===typeof k)throw Error("Unknown file open mode: "+c);c=k}g=c&64?("undefined"===typeof g?438:g)&4095|32768:0;if("object"===typeof a)var l=a;else{a=Lb(a);try{l=ra(a,{Pa:!(c&131072)}).node}catch(n){}}k=!1;if(c&64)if(l){if(c&128)throw new q(m.Ea);}else l=Pb(a,g,0),k=!0;if(!l)throw new q(m.L);8192=== | ||
58 | -(l.mode&61440)&&(c&=-513);if(c&65536&&16384!==(l.mode&61440))throw new q(m.Fa);if(!k&&(g=l?40960===(l.mode&61440)?m.sa:16384===(l.mode&61440)&&("r"!==Ec(c)||c&512)?m.ga:eb(l,Ec(c)):m.L))throw new q(g);if(c&512){g=l;var d;"string"===typeof g?d=ra(g,{Pa:!0}).node:d=g;if(!d.h.C)throw new q(m.Y);if(16384===(d.mode&61440))throw new q(m.ga);if(32768!==(d.mode&61440))throw new q(m.m);if(g=eb(d,"w"))throw new q(g);d.h.C(d,{size:0,timestamp:Date.now()})}c&=-641;e=ud({node:l,path:Cc(l),flags:c,seekable:!0, | ||
59 | -position:0,g:l.g,zb:[],error:!1},e);e.g.open&&e.g.open(e);!b.logReadFiles||c&1||(gb||(gb={}),a in gb||(gb[a]=1,b.printErr("read file: "+a)));try{hb.onOpenFile&&(l=0,1!==(c&2097155)&&(l|=1),0!==(c&2097155)&&(l|=2),hb.onOpenFile(a,l))}catch(n){console.log("FS.trackingDelegate['onOpenFile']('"+a+"', flags) threw an exception: "+n.message)}return e}function Jc(a){a.wa&&(a.wa=null);try{a.g.close&&a.g.close(a)}catch(c){throw c;}finally{la[a.fd]=null}}function Kc(a,c,b){if(!a.seekable||!a.g.M)throw new q(m.ha); | ||
60 | -a.position=a.g.M(a,c,b);a.zb=[]}function Lc(){q||(q=function(a,c){this.node=c;this.rb=function(a){this.J=a;for(var c in m)if(m[c]===a){this.code=c;break}};this.rb(a);this.message=wd[a];this.stack&&Object.defineProperty(this,"stack",{value:Error().stack,writable:!0})},q.prototype=Error(),q.prototype.constructor=q,[m.L].forEach(function(a){Rb[a]=new q(a);Rb[a].stack="<generic error, no stack>"}))}function xd(a,c){var b=0;a&&(b|=365);c&&(b|=146);return b}function Na(a,c,b){a=qa("/dev",a);var g=xd(!!c, | ||
61 | -!!b);Sb||(Sb=64);var k=Sb++<<8|0;Mb(k,{open:function(a){a.seekable=!1},close:function(){b&&b.buffer&&b.buffer.length&&b(10)},read:function(a,b,g,e){for(var k=0,l=0;l<e;l++){try{var d=c()}catch(ma){throw new q(m.fa);}if(void 0===d&&0===k)throw new q(m.Ca);if(null===d||void 0===d)break;k++;b[g+l]=d}k&&(a.node.timestamp=Date.now());return k},write:function(a,c,g,e){for(var k=0;k<e;k++)try{b(c[g+k])}catch(w){throw new q(m.fa);}e&&(a.node.timestamp=Date.now());return k}});fb(a,g,k)}function D(){S+=4;return p[S- | ||
62 | -4>>2]}function za(){var a=la[D()];if(!a)throw new q(m.ea);return a}function Tb(a){switch(a){case 1:return 0;case 2:return 1;case 4:return 2;case 8:return 3;default:throw new TypeError("Unknown type size: "+a);}}function T(a){for(var c="";I[a];)c+=Mc[I[a++]];return c}function Ub(a){if(void 0===a)return"_unknown";a=a.replace(/[^a-zA-Z0-9_]/g,"$");var c=a.charCodeAt(0);return 48<=c&&57>=c?"_"+a:a}function Vb(a,c){a=Ub(a);return(new Function("body","return function "+a+'() {\n "use strict"; return body.apply(this, arguments);\n};\n'))(c)} | ||
63 | -function Wb(a){var c=Error,b=Vb(a,function(c){this.name=a;this.message=c;c=Error(c).stack;void 0!==c&&(this.stack=this.toString()+"\n"+c.replace(/^Error(:[^\n]*)?\n/,""))});b.prototype=Object.create(c.prototype);b.prototype.constructor=b;b.prototype.toString=function(){return void 0===this.message?this.name:this.name+": "+this.message};return b}function A(a){throw new Aa(a);}function ib(a){throw new Nc(a);}function Oa(a,c,b){function g(c){c=b(c);c.length!==a.length&&ib("Mismatched type converter count"); | ||
64 | -for(var g=0;g<a.length;++g)ga(a[g],c[g])}a.forEach(function(a){jb[a]=c});var k=Array(c.length),d=[],x=0;c.forEach(function(a,c){Ba.hasOwnProperty(a)?k[c]=Ba[a]:(d.push(a),Ca.hasOwnProperty(a)||(Ca[a]=[]),Ca[a].push(function(){k[c]=Ba[a];++x;x===d.length&&g(k)}))});0===d.length&&g(k)}function ga(a,c,b){b=b||{};if(!("argPackAdvance"in c))throw new TypeError("registerType registeredInstance requires argPackAdvance");var g=c.name;a||A('type "'+g+'" must have a positive integer typeid pointer');if(Ba.hasOwnProperty(a)){if(b.ib)return; | ||
65 | -A("Cannot register type '"+g+"' twice")}Ba[a]=c;delete jb[a];Ca.hasOwnProperty(a)&&(c=Ca[a],delete Ca[a],c.forEach(function(a){a()}))}function Xb(a){A(a.c.o.i.name+" instance already deleted")}function Yb(){for(;Pa.length;){var a=Pa.pop();a.c.U=!1;a["delete"]()}}function na(){}function Oc(a,c,b){if(void 0===a[c].H){var g=a[c];a[c]=function(){a[c].H.hasOwnProperty(arguments.length)||A("Function '"+b+"' called with an invalid number of arguments ("+arguments.length+") - expects one of ("+a[c].H+")!"); | ||
66 | -return a[c].H[arguments.length].apply(this,arguments)};a[c].H=[];a[c].H[g.ia]=g}}function yd(a,c){b.hasOwnProperty(a)?(A("Cannot register public name '"+a+"' twice"),Oc(b,a,a),b.hasOwnProperty(void 0)&&A("Cannot register multiple overloads of a function with the same number of arguments (undefined)!"),b[a].H[void 0]=c):b[a]=c}function zd(a,c,b,e,k,d,x,f){this.name=a;this.constructor=c;this.V=b;this.R=e;this.F=k;this.fb=d;this.da=x;this.cb=f;this.nb=[]}function Zb(a,c,b){for(;c!==b;)c.da||A("Expected null or instance of "+ | ||
67 | -b.name+", got an instance of "+c.name),a=c.da(a),c=c.F;return a}function Ad(a,c){if(null===c)return this.ya&&A("null is not a valid "+this.name),0;c.c||A('Cannot pass "'+Da(c)+'" as a '+this.name);c.c.j||A("Cannot pass deleted object as a pointer of type "+this.name);return Zb(c.c.j,c.c.o.i,this.i)}function Bd(a,c){if(null===c){this.ya&&A("null is not a valid "+this.name);if(this.ka){var b=this.ob();null!==a&&a.push(this.R,b);return b}return 0}c.c||A('Cannot pass "'+Da(c)+'" as a '+this.name);c.c.j|| | ||
68 | -A("Cannot pass deleted object as a pointer of type "+this.name);!this.ja&&c.c.o.ja&&A("Cannot convert argument of type "+(c.c.D?c.c.D.name:c.c.o.name)+" to parameter type "+this.name);b=Zb(c.c.j,c.c.o.i,this.i);if(this.ka)switch(void 0===c.c.B&&A("Passing raw pointer to smart pointer is illegal"),this.sb){case 0:c.c.D===this?b=c.c.B:A("Cannot convert argument of type "+(c.c.D?c.c.D.name:c.c.o.name)+" to parameter type "+this.name);break;case 1:b=c.c.B;break;case 2:if(c.c.D===this)b=c.c.B;else{var e= | ||
69 | -c.clone(),b=this.pb(b,Pc(function(){e["delete"]()}));null!==a&&a.push(this.R,b)}break;default:A("Unsupporting sharing policy")}return b}function Cd(a,c){if(null===c)return this.ya&&A("null is not a valid "+this.name),0;c.c||A('Cannot pass "'+Da(c)+'" as a '+this.name);c.c.j||A("Cannot pass deleted object as a pointer of type "+this.name);c.c.o.ja&&A("Cannot convert argument of type "+c.c.o.name+" to parameter type "+this.name);return Zb(c.c.j,c.c.o.i,this.i)}function kb(a){return this.fromWireType(ea[a>> | ||
70 | -2])}function Qc(a,c,b){if(c===b)return a;if(void 0===b.F)return null;a=Qc(a,c,b.F);return null===a?null:b.cb(a)}function Dd(a,c){for(void 0===c&&A("ptr should not be undefined");a.F;)c=a.da(c),a=a.F;return Qa[c]}function lb(a,c){c.o&&c.j||ib("makeClassHandle requires ptr and ptrType");!!c.D!==!!c.B&&ib("Both smartPtrType and smartPtr must be specified");c.count={value:1};return Object.create(a,{c:{value:c}})}function ha(a,c,b,e,k,d,x,f,h,u,w){this.name=a;this.i=c;this.ya=b;this.ja=e;this.ka=k;this.mb= | ||
71 | -d;this.sb=x;this.Va=f;this.ob=h;this.pb=u;this.R=w;k||void 0!==c.F?this.toWireType=Bd:(this.toWireType=e?Ad:Cd,this.I=null)}function Ed(a,c){b.hasOwnProperty(a)||ib("Replacing nonexistant public symbol");b[a]=c;b[a].ia=void 0}function Ea(a,c){a=T(a);if(void 0!==b["FUNCTION_TABLE_"+a])var g=b["FUNCTION_TABLE_"+a][c];else if("undefined"!==typeof FUNCTION_TABLE)g=FUNCTION_TABLE[c];else{g=b.asm["dynCall_"+a];void 0===g&&(g=b.asm["dynCall_"+a.replace(/f/g,"d")],void 0===g&&A("No dynCall invoker for signature: "+ | ||
72 | -a));for(var e=[],k=1;k<a.length;++k)e.push("a"+k);k="return function "+("dynCall_"+a+"_"+c)+"("+e.join(", ")+") {\n";k+=" return dynCall(rawFunction"+(e.length?", ":"")+e.join(", ")+");\n";g=(new Function("dynCall","rawFunction",k+"};\n"))(g,c)}"function"!==typeof g&&A("unknown function pointer with signature "+a+": "+c);return g}function Fd(a){a=Gd(a);var c=T(a);R(a);return c}function $b(a,c){function b(a){k[a]||Ba[a]||(jb[a]?jb[a].forEach(b):(e.push(a),k[a]=!0))}var e=[],k={};c.forEach(b);throw new Rc(a+ | ||
73 | -": "+e.map(Fd).join([", "]));}function Sc(a,c){for(var b=[],e=0;e<a;e++)b.push(p[(c>>2)+e]);return b}function Tc(a){for(;a.length;){var c=a.pop();a.pop()(c)}}function Hd(a){var c=Function;if(!(c instanceof Function))throw new TypeError("new_ called with constructor type "+typeof c+" which is not a function");var b=Vb(c.name||"unknownFunctionName",function(){});b.prototype=c.prototype;b=new b;a=c.apply(b,a);return a instanceof Object?a:b}function Pc(a){switch(a){case void 0:return 1;case null:return 2; | ||
74 | -case !0:return 3;case !1:return 4;default:var c=ac.length?ac.pop():ba.length;ba[c]={X:1,value:a};return c}}function Da(a){if(null===a)return"null";var c=typeof a;return"object"===c||"array"===c||"function"===c?a.toString():""+a}function Id(a,c){switch(c){case 2:return function(a){return this.fromWireType(sc[a>>2])};case 3:return function(a){return this.fromWireType(tc[a>>3])};default:throw new TypeError("Unknown float type: "+a);}}function Jd(a,c,b){switch(c){case 0:return b?function(a){return P[a]}: | ||
75 | -function(a){return I[a]};case 1:return b?function(a){return Ha[a>>1]}:function(a){return Gb[a>>1]};case 2:return b?function(a){return p[a>>2]}:function(a){return ea[a>>2]};default:throw new TypeError("Unknown integer type: "+a);}}function Uc(){function a(a){return(a=a.toTimeString().match(/\(([A-Za-z ]+)\)$/))?a[1]:"GMT"}if(!Vc){Vc=!0;p[Kd>>2]=60*(new Date).getTimezoneOffset();var c=new Date(2E3,0,1),b=new Date(2E3,6,1);p[Ld>>2]=Number(c.getTimezoneOffset()!=b.getTimezoneOffset());var e=a(c),k=a(b), | ||
76 | -e=ka(Ra(e),0),k=ka(Ra(k),0);b.getTimezoneOffset()<c.getTimezoneOffset()?(p[Sa>>2]=e,p[Sa+4>>2]=k):(p[Sa>>2]=k,p[Sa+4>>2]=e)}}function mb(){void 0===mb.start&&(mb.start=Date.now());return 1E3*(Date.now()-mb.start)|0}function Y(a){a=eval(N(a))+"";var c=wa(a);if(!Y.u||Y.u<c+1)Y.u&&R(Y.buffer),Y.u=c+1,Y.buffer=da(Y.u);Z(a,I,Y.buffer,Y.u);return Y.buffer}function Ta(a){if(0===a)return 0;a=N(a);if(!U.hasOwnProperty(a))return 0;Ta.va&&R(Ta.va);a=U[a];var c=wa(a)+1,b=da(c);b&&Z(a,P,b,c);Ta.va=b;return Ta.va} | ||
77 | -function Md(a){return Math.pow(2,a)}function Wc(a){a/=1E3;if((sa||oa)&&self.performance&&self.performance.now)for(var c=self.performance.now();self.performance.now()-c<a;);else for(c=Date.now();Date.now()-c<a;);return 0}function Ua(a,c){Ua.u||(Ua.u={});a in Ua.u||(b.dynCall_v(c),Ua.u[a]=1)}function nb(a){return 0===a%4&&(0!==a%100||0===a%400)}function bc(a,c){for(var b=0,e=0;e<=c;b+=a[e++]);return b}function ob(a,c){for(a=new Date(a.getTime());0<c;){var b=a.getMonth(),e=(nb(a.getFullYear())?pb:qb)[b]; | ||
78 | -if(c>e-a.getDate())c-=e-a.getDate()+1,a.setDate(1),11>b?a.setMonth(b+1):(a.setMonth(0),a.setFullYear(a.getFullYear()+1));else{a.setDate(a.getDate()+c);break}}return a}function Xc(a,c,b,e){function g(a,c,b){for(a="number"===typeof a?a.toString():a||"";a.length<c;)a=b[0]+a;return a}function d(a,c){return g(a,c,"0")}function f(a,c){function b(a){return 0>a?-1:0<a?1:0}var e;0===(e=b(a.getFullYear()-c.getFullYear()))&&0===(e=b(a.getMonth()-c.getMonth()))&&(e=b(a.getDate()-c.getDate()));return e}function n(a){switch(a.getDay()){case 0:return new Date(a.getFullYear()- | ||
79 | -1,11,29);case 1:return a;case 2:return new Date(a.getFullYear(),0,3);case 3:return new Date(a.getFullYear(),0,2);case 4:return new Date(a.getFullYear(),0,1);case 5:return new Date(a.getFullYear()-1,11,31);case 6:return new Date(a.getFullYear()-1,11,30)}}function h(a){a=ob(new Date(a.s+1900,0,1),a.qa);var c=n(new Date(a.getFullYear()+1,0,4));return 0>=f(n(new Date(a.getFullYear(),0,4)),a)?0>=f(c,a)?a.getFullYear()+1:a.getFullYear():a.getFullYear()-1}var u=p[e+40>>2];e={wb:p[e>>2],vb:p[e+4>>2],pa:p[e+ | ||
80 | -8>>2],S:p[e+12>>2],N:p[e+16>>2],s:p[e+20>>2],Wa:p[e+24>>2],qa:p[e+28>>2],Dd:p[e+32>>2],ub:p[e+36>>2],xb:u?N(u):""};b=N(b);var u={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S"},w;for(w in u)b=b.replace(new RegExp(w,"g"),u[w]);var J="Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),m="January February March April May June July August September October November December".split(" "), | ||
81 | -u={"%a":function(a){return J[a.Wa].substring(0,3)},"%A":function(a){return J[a.Wa]},"%b":function(a){return m[a.N].substring(0,3)},"%B":function(a){return m[a.N]},"%C":function(a){return d((a.s+1900)/100|0,2)},"%d":function(a){return d(a.S,2)},"%e":function(a){return g(a.S,2," ")},"%g":function(a){return h(a).toString().substring(2)},"%G":function(a){return h(a)},"%H":function(a){return d(a.pa,2)},"%I":function(a){a=a.pa;0==a?a=12:12<a&&(a-=12);return d(a,2)},"%j":function(a){return d(a.S+bc(nb(a.s+ | ||
82 | -1900)?pb:qb,a.N-1),3)},"%m":function(a){return d(a.N+1,2)},"%M":function(a){return d(a.vb,2)},"%n":function(){return"\n"},"%p":function(a){return 0<=a.pa&&12>a.pa?"AM":"PM"},"%S":function(a){return d(a.wb,2)},"%t":function(){return"\t"},"%u":function(a){return(new Date(a.s+1900,a.N+1,a.S,0,0,0,0)).getDay()||7},"%U":function(a){var c=new Date(a.s+1900,0,1),b=0===c.getDay()?c:ob(c,7-c.getDay());a=new Date(a.s+1900,a.N,a.S);return 0>f(b,a)?d(Math.ceil((31-b.getDate()+(bc(nb(a.getFullYear())?pb:qb,a.getMonth()- | ||
83 | -1)-31)+a.getDate())/7),2):0===f(b,c)?"01":"00"},"%V":function(a){var c=n(new Date(a.s+1900,0,4)),b=n(new Date(a.s+1901,0,4)),e=ob(new Date(a.s+1900,0,1),a.qa);return 0>f(e,c)?"53":0>=f(b,e)?"01":d(Math.ceil((c.getFullYear()<a.s+1900?a.qa+32-c.getDate():a.qa+1-c.getDate())/7),2)},"%w":function(a){return(new Date(a.s+1900,a.N+1,a.S,0,0,0,0)).getDay()},"%W":function(a){var c=new Date(a.s,0,1),b=1===c.getDay()?c:ob(c,0===c.getDay()?1:7-c.getDay()+1);a=new Date(a.s+1900,a.N,a.S);return 0>f(b,a)?d(Math.ceil((31- | ||
84 | -b.getDate()+(bc(nb(a.getFullYear())?pb:qb,a.getMonth()-1)-31)+a.getDate())/7),2):0===f(b,c)?"01":"00"},"%y":function(a){return(a.s+1900).toString().substring(2)},"%Y":function(a){return a.s+1900},"%z":function(a){a=a.ub;var c=0<=a;a=Math.abs(a)/60;return(c?"+":"-")+String("0000"+(a/60*100+a%60)).slice(-4)},"%Z":function(a){return a.xb},"%%":function(){return"%"}};for(w in u)0<=b.indexOf(w)&&(b=b.replace(new RegExp(w,"g"),u[w](e)));w=Ra(b,!1);if(w.length>c)return 0;P.set(w,a);return w.length-1}function Ra(a, | ||
85 | -c){var b=Array(wa(a)+1);a=Z(a,b,0,b.length);c&&(b.length=a);return b}function Va(a){this.name="ExitStatus";this.message="Program terminated with exit("+a+")";this.status=a}function dc(){function a(){if(!b.calledRun&&(b.calledRun=!0,!Wa)){Yc||(Yc=!0,Ia(rb));Ia(Zc);if(b.onRuntimeInitialized)b.onRuntimeInitialized();if(b.postRun)for("function"==typeof b.postRun&&(b.postRun=[b.postRun]);b.postRun.length;){var a=b.postRun.shift();$c.unshift(a)}Ia($c)}}if(!(0<ta)){if(b.preRun)for("function"==typeof b.preRun&& | ||
86 | -(b.preRun=[b.preRun]);b.preRun.length;)nd();Ia(vc);0<ta||b.calledRun||(b.setStatus?(b.setStatus("Running..."),setTimeout(function(){setTimeout(function(){b.setStatus("")},1);a()},1)):a())}}function E(a){if(b.onAbort)b.onAbort(a);void 0!==a?(b.print(a),b.printErr(a),a=JSON.stringify(a)):a="";Wa=!0;throw"abort("+a+"). Build with -s ASSERTIONS=1 for more info.";}d._BarcodeReaderWasm=function(){throw Error("'Constructor BarcodeReader(licenseKey)': The wasm hasn't finish loading.");};if(!self.WebAssembly|| | ||
87 | -/Safari/.test(navigator.userAgent)&&!/Chrome/.test(navigator.userAgent)&&/\(.+\s11_2_([2-6]).*\)/.test(navigator.userAgent))return h("'Constructor BarcodeReader(licenseKey)': The browser doesn't support Webassembly.");var Nd=function(a,c,b){self.kConsoleLog&&kConsoleLog("start handle dbr wasm, version: "+a);var e=(new Date).getTime(),g="dbr-"+a,d=function(a){return new Promise(function(c,b){var e=a.transaction(["wasm"]).objectStore("wasm").get("bSupportStoreModuleInDb"),g=function(){var e=a.transaction(["wasm"], | ||
88 | -"readwrite").objectStore("wasm"),g=new Uint8Array([0,97,115,109,1,0,0,0,1,7,1,96,2,127,127,1,127,3,2,1,0,7,7,1,3,88,79,82,0,0,10,9,1,7,0,32,0,32,1,115,11,0,26,4,110,97,109,101,1,10,10,0,7,87,97,115,109,88,79,82,2,7,1,0,2,0,0,1,0]);try{var k=e.put(new WebAssembly.Module(g.buffer),"testStoreModule");k.onsuccess=function(){var a=e.put(!0,"bSupportStoreModuleInDb");a.onsuccess=function(){c("set bSupportStoreModuleInDb = true success")};a.onerror=function(){b("set bSupportStoreModuleInDb = true fail")}}; | ||
89 | -k.onerror=function(){b("Failed to store [testStoreModule] in wasm cache, bSupportStoreModuleInDb == false: "+(k.error.message||k.error))}}catch(M){return b("Failed to store [testStoreModule] in wasm cache, bSupportStoreModuleInDb == false: "+(M.message||M))}};e.onsuccess=function(){e.result?c("bSupportStoreModuleInDb == true"):g()};e.onerror=g})},f=function(a){return new Promise(function(c,b){var e=a.transaction(["wasm"]).objectStore("wasm").get(g);e.onerror=b.bind(null,"Error getting wasm "+g);e.onsuccess= | ||
90 | -function(){e.result?c(e.result):b(g+" was not found in wasm cache")}})},n=function(a,c){return new Promise(function(b,e){var k=a.transaction(["wasm"],"readwrite").objectStore("wasm").put(c,g);k.onerror=function(){e("Failed to store "+g+" in wasm cache: "+(k.error.message||k.error))};k.onsuccess=function(){b("Successfully stored "+g+" in wasm cache")}})};return function(){return new Promise(function(a,c){var b=indexedDB.open("dynamsoft",1);b.onupgradeneeded=function(){b.result.createObjectStore("wasm")}; | ||
91 | -b.onsuccess=function(){a(b.result)};b.onerror=function(){var e=b.error.message||b.error;-1!=e.indexOf("version")?(b=indexedDB.deleteDatabase("dynamsoft"),b.onsuccess=function(){var b=indexedDB.open("dynamsoft",1);b.onupgradeneeded=function(){b.result.createObjectStore("wasm")};b.onsuccess=function(){a(b.result)};b.onerror=function(){c("open db [dynamsoft] fail")}},b.onerror=function(){c("delete db [dynamsoft] fail")}):c("open db [dynamsoft] fail: "+e)}})}().then(function(a){self.kConsoleLog&&kConsoleLog("open db success"); | ||
92 | -return d(a).then(function(c){self.kConsoleLog&&kConsoleLog(c);return Promise.resolve([a,!0])})["catch"](function(c){self.kConsoleLog&&kConsoleLog(c.message||c);return Promise.resolve([a,!1])})}).then(function(a){var g=a[0],k=a[1],d=(new Date).getTime();return f(g).then(function(a){if(a instanceof WebAssembly.Module){self.kConsoleLog&&kConsoleLog("get a wasm module from db, timecost:"+((new Date).getTime()-d));var c=(new Date).getTime();return WebAssembly.instantiate(a,b).then(function(b){self.kConsoleLog&& | ||
93 | -kConsoleLog("build instance from module timecost: "+((new Date).getTime()-c));self.kConsoleLog&&kConsoleLog("finish handle dbr wasm, total timecost: "+((new Date).getTime()-e));return Promise.resolve({module:a,instance:b})})}self.kConsoleLog&&kConsoleLog("get a wasm binary from db, timecost:"+((new Date).getTime()-d));var l=(new Date).getTime();return WebAssembly.instantiate(a,b).then(function(a){self.kConsoleLog&&kConsoleLog("build instance from binary timecost: "+((new Date).getTime()-l));if(k){var c= | ||
94 | -(new Date).getTime();return n(g,a.module).then(function(b){self.kConsoleLog&&kConsoleLog(b+", timecost: "+((new Date).getTime()-c));self.kConsoleLog&&kConsoleLog("finish handle dbr wasm, total timecost: "+((new Date).getTime()-e));return Promise.resolve(a)})}self.kConsoleLog&&kConsoleLog("finish handle dbr wasm, total timecost: "+((new Date).getTime()-e));return Promise.resolve(a)})},function(a){self.kConsoleLog&&kConsoleLog(a.message||a);var d=(new Date).getTime();return k?WebAssembly.instantiateStreaming(fetch(c), | ||
95 | -b).then(function(a){self.kConsoleLog&&kConsoleLog("download with build timecost: "+((new Date).getTime()-d));var c=(new Date).getTime();return n(g,a.module).then(function(b){self.kConsoleLog&&kConsoleLog(b+", timecost: "+((new Date).getTime()-c));self.kConsoleLog&&kConsoleLog("finish handle dbr wasm, total timecost: "+((new Date).getTime()-e));return Promise.resolve(a)})}):fetch(c).then(function(a){self.kConsoleLog&&kConsoleLog("download timecost: "+((new Date).getTime()-d));return a.arrayBuffer()}).then(function(a){var c= | ||
96 | -(new Date).getTime();return n(g,a).then(function(b){self.kConsoleLog&&kConsoleLog(b+", timecost: "+((new Date).getTime()-c));return Promise.resolve(a)})}).then(function(a){var c=(new Date).getTime();return WebAssembly.instantiate(a,b).then(function(a){self.kConsoleLog&&kConsoleLog("build instance from binary timecost: "+((new Date).getTime()-c));self.kConsoleLog&&kConsoleLog("finish handle dbr wasm, total timecost: "+((new Date).getTime()-e));return Promise.resolve(a)})})})})["catch"](function(a){self.kConsoleLog&& | ||
97 | -kConsoleLog(a.message||a);return WebAssembly.instantiateStreaming?WebAssembly.instantiateStreaming(fetch(c),b).then(function(a){self.kConsoleLog&&kConsoleLog("finish handle dbr wasm, total timecost: "+((new Date).getTime()-e));return Promise.resolve(a)}):fetch(c).then(function(a){return a.arrayBuffer()}).then(function(a){return WebAssembly.instantiate(a,b).then(function(a){self.kConsoleLog&&kConsoleLog("finish handle dbr wasm, total timecost: "+((new Date).getTime()-e));return Promise.resolve(a)})})})}, | ||
98 | -Fa={locateFile:function(){var a="dbr-"+d._jsVersion+".wasm";if(dynamsoft.dbrEnv.resourcesPath){var c=dynamsoft.dbrEnv.resourcesPath;"/"!=c.charAt(c.length-1)&&(c+="/");return c+a}return a},onRuntimeInitialized:function(){d._BarcodeReaderWasm=Fa.BarcodeReaderWasm;d._loadWasmStatus="loaded";d.version=(new Fa.BarcodeReaderWasm("")).GetVersion()+"(JS "+d._jsVersion+"."+d._jsEditVersion+")";f()}};Fa.onExit=Fa.onAbort=function(a){d._BarcodeReaderWasm=function(){throw Error("'Constructor BarcodeReader(licenseKey)': The wasm load failed. Status: "+ | ||
99 | -a);};h(a)};var b;b||(b="undefined"!==typeof Fa?Fa:{});var Xa={},pa;for(pa in b)b.hasOwnProperty(pa)&&(Xa[pa]=b[pa]);b.arguments=[];b.thisProgram="./this.program";b.quit=function(a,c){throw c;};b.preRun=[];b.postRun=[];var sa=!1,oa=!1,ia=!1,ec=!1;if(b.ENVIRONMENT)if("WEB"===b.ENVIRONMENT)sa=!0;else if("WORKER"===b.ENVIRONMENT)oa=!0;else if("NODE"===b.ENVIRONMENT)ia=!0;else if("SHELL"===b.ENVIRONMENT)ec=!0;else throw Error("Module['ENVIRONMENT'] value is not valid. must be one of: WEB|WORKER|NODE|SHELL."); | ||
100 | -else sa="object"===typeof window,oa="function"===typeof importScripts,ia="object"===typeof process&&"function"===typeof require&&!sa&&!oa,ec=!sa&&!ia&&!oa;if(ia){var fc,gc;b.read=function(a,c){fc||(fc=require("fs"));gc||(gc=require("path"));a=gc.normalize(a);a=fc.readFileSync(a);return c?a:a.toString()};b.readBinary=function(a){a=b.read(a,!0);a.buffer||(a=new Uint8Array(a));O(a.buffer);return a};1<process.argv.length&&(b.thisProgram=process.argv[1].replace(/\\/g,"/"));b.arguments=process.argv.slice(2); | ||
101 | -"undefined"!==typeof module&&(module.exports=b);process.on("uncaughtException",function(a){if(!(a instanceof Va))throw a;});process.on("unhandledRejection",function(){process.exit(1)});b.inspect=function(){return"[Emscripten Module object]"}}else if(ec)"undefined"!=typeof read&&(b.read=function(a){return read(a)}),b.readBinary=function(a){if("function"===typeof readbuffer)return new Uint8Array(readbuffer(a));a=read(a,"binary");O("object"===typeof a);return a},"undefined"!=typeof scriptArgs?b.arguments= | ||
102 | -scriptArgs:"undefined"!=typeof arguments&&(b.arguments=arguments),"function"===typeof quit&&(b.quit=function(a){quit(a)});else if(sa||oa)b.read=function(a){var c=new XMLHttpRequest;c.open("GET",a,!1);c.send(null);return c.responseText},oa&&(b.readBinary=function(a){var c=new XMLHttpRequest;c.open("GET",a,!1);c.responseType="arraybuffer";c.send(null);return new Uint8Array(c.response)}),b.readAsync=function(a,c,b){var e=new XMLHttpRequest;e.open("GET",a,!0);e.responseType="arraybuffer";e.onload=function(){200== | ||
103 | -e.status||0==e.status&&e.response?c(e.response):b()};e.onerror=b;e.send(null)},b.setWindowTitle=function(a){document.title=a};b.print="undefined"!==typeof console?console.log.bind(console):"undefined"!==typeof print?print:null;b.printErr="undefined"!==typeof printErr?printErr:"undefined"!==typeof console&&console.warn.bind(console)||b.print;b.print=b.print;b.printErr=b.printErr;for(pa in Xa)Xa.hasOwnProperty(pa)&&(b[pa]=Xa[pa]);var Xa=void 0,Wa=0,rc="undefined"!==typeof TextDecoder?new TextDecoder("utf8"): | ||
104 | -void 0;"undefined"!==typeof TextDecoder&&new TextDecoder("utf-16le");var Hb=65536,uc=16777216,md=16777216,L,P,I,Ha,Gb,p,ea,sc,tc,sb,G,Db,hc,tb,ic,jc,aa;sb=G=hc=tb=ic=jc=aa=0;Db=!1;b.reallocBuffer||(b.reallocBuffer=function(a){try{if(ArrayBuffer.yb)var c=ArrayBuffer.yb(L,a);else{var b=P,c=new ArrayBuffer(a);(new Int8Array(c)).set(b)}}catch(e){return!1}return Od(c)?c:!1});var kc;try{kc=Function.prototype.call.bind(Object.getOwnPropertyDescriptor(ArrayBuffer.prototype,"byteLength").get),kc(new ArrayBuffer(4))}catch(a){kc= | ||
105 | -function(a){return a.byteLength}}var lc=b.TOTAL_STACK||5242880,H=b.TOTAL_MEMORY||16777216;H<lc&&b.printErr("TOTAL_MEMORY should be larger than TOTAL_STACK, was "+H+"! (TOTAL_STACK="+lc+")");b.buffer?L=b.buffer:("object"===typeof WebAssembly&&"function"===typeof WebAssembly.Memory?(b.wasmMemory=new WebAssembly.Memory({initial:H/Hb}),L=b.wasmMemory.buffer):L=new ArrayBuffer(H),b.buffer=L);Fb();p[0]=1668509029;Ha[1]=25459;if(115!==I[2]||99!==I[3])throw"Runtime error: expected the system to be little-endian!"; | ||
106 | -var vc=[],rb=[],Zc=[],mc=[],$c=[],Yc=!1,ta=0,nc=null,Ya=null;b.preloadedImages={};b.preloadedAudios={};(function(){function a(){try{if(b.wasmBinary)return new Uint8Array(b.wasmBinary);if(b.readBinary)return b.readBinary(k);throw"on the web, we need the wasm binary to be preloaded and set on Module['wasmBinary']. emcc.py will do that for you when generating HTML (but not JS)";}catch(w){E(w)}}function c(){return b.wasmBinary||!sa&&!oa||"function"!==typeof fetch?new Promise(function(c){c(a())}):fetch(k, | ||
107 | -{credentials:"same-origin"}).then(function(a){if(!a.ok)throw"failed to load wasm binary file at '"+k+"'";return a.arrayBuffer()})["catch"](function(){return a()})}function g(a){function e(a){n=a.exports;if(n.memory){a=n.memory;var c=b.buffer;a.byteLength<c.byteLength&&b.printErr("the new buffer in mergeMemory is smaller than the previous one. in native wasm, we should grow memory here");c=new Int8Array(c);(new Int8Array(a)).set(c);b.buffer=L=a;Fb()}b.asm=n;b.usingWasm=!0;ta--;b.monitorRunDependencies&& | ||
108 | -b.monitorRunDependencies(ta);0==ta&&(null!==nc&&(clearInterval(nc),nc=null),Ya&&(a=Ya,Ya=null,a()))}function g(a){e(a.instance)}function l(a){c().then(function(a){return WebAssembly.instantiate(a,f)}).then(a)["catch"](function(a){b.printErr("failed to asynchronously prepare wasm: "+a);E(a)})}if("object"!==typeof WebAssembly)return b.printErr("no native wasm support detected"),!1;if(!(b.wasmMemory instanceof WebAssembly.Memory))return b.printErr("no native wasm Memory in use"),!1;a.memory=b.wasmMemory; | ||
109 | -f.global={NaN:NaN,Infinity:Infinity};f["global.Math"]=Math;f.env=a;ta++;b.monitorRunDependencies&&b.monitorRunDependencies(ta);if(b.instantiateWasm)try{return b.instantiateWasm(f,e)}catch(Q){return b.printErr("Module.instantiateWasm callback failed with error: "+Q),!1}b.wasmBinary||$a(k)||"function"!==typeof fetch?l(g):Nd(d._jsVersion,k,f).then(g)["catch"](function(a){b.printErr("wasm streaming compile failed: "+a);b.printErr("falling back to ArrayBuffer instantiation");l(g)});return{}}var e="dbr.min.wast", | ||
110 | -k="dbr.min.wasm",l="dbr.min.temp.asm.js";"function"===typeof b.locateFile&&($a(e)||(e=b.locateFile(e)),$a(k)||(k=b.locateFile(k)),$a(l)||(l=b.locateFile(l)));var f={global:null,env:null,asm2wasm:{"f64-rem":function(a,c){return a%c},"debugger":function(){debugger}},parent:b},n=null;b.asmPreload=b.asm;var h=b.reallocBuffer;b.reallocBuffer=function(a){if("asmjs"===u)var c=h(a);else a:{a=Eb(a,b.usingWasm?Hb:uc);var e=b.buffer.byteLength;if(b.usingWasm)try{c=-1!==b.wasmMemory.grow((a-e)/65536)?b.buffer= | ||
111 | -b.wasmMemory.buffer:null;break a}catch(ca){c=null;break a}c=void 0}return c};var u="";b.asm=function(a,c){if(!c.table){a=b.wasmTableSize;void 0===a&&(a=1024);var e=b.wasmMaxTableSize;c.table="object"===typeof WebAssembly&&"function"===typeof WebAssembly.Table?void 0!==e?new WebAssembly.Table({initial:a,maximum:e,element:"anyfunc"}):new WebAssembly.Table({initial:a,element:"anyfunc"}):Array(a);b.wasmTable=c.table}c.memoryBase||(c.memoryBase=b.STATIC_BASE);c.tableBase||(c.tableBase=0);(c=g(c))||E("no binaryen method succeeded. consider enabling more options, like interpreting, if you want that: https://github.com/kripken/emscripten/wiki/WebAssembly#binaryen-methods"); | ||
112 | -return c}})();sb=1024;G=sb+897344;rb.push({b:function(){Pd()}},{b:function(){Qd()}},{b:function(){Rd()}},{b:function(){Sd()}},{b:function(){Td()}},{b:function(){Ud()}},{b:function(){Vd()}},{b:function(){Wd()}},{b:function(){Xd()}},{b:function(){Yd()}},{b:function(){Zd()}},{b:function(){$d()}},{b:function(){ae()}},{b:function(){be()}},{b:function(){ce()}},{b:function(){de()}},{b:function(){ee()}},{b:function(){fe()}},{b:function(){ge()}},{b:function(){he()}},{b:function(){ie()}},{b:function(){je()}}, | ||
113 | -{b:function(){ke()}},{b:function(){le()}},{b:function(){me()}},{b:function(){ne()}},{b:function(){oe()}},{b:function(){pe()}},{b:function(){qe()}},{b:function(){re()}},{b:function(){se()}},{b:function(){te()}},{b:function(){ue()}},{b:function(){ve()}},{b:function(){we()}},{b:function(){xe()}},{b:function(){ye()}},{b:function(){ze()}},{b:function(){Ae()}},{b:function(){Be()}},{b:function(){Ce()}},{b:function(){De()}},{b:function(){Ee()}},{b:function(){Fe()}},{b:function(){Ge()}},{b:function(){He()}}, | ||
114 | -{b:function(){Ie()}},{b:function(){Je()}},{b:function(){Ke()}},{b:function(){Le()}},{b:function(){Me()}},{b:function(){Ne()}},{b:function(){Oe()}},{b:function(){Pe()}},{b:function(){Qe()}},{b:function(){Re()}},{b:function(){Se()}},{b:function(){Te()}},{b:function(){Ue()}},{b:function(){Ve()}},{b:function(){We()}},{b:function(){Xe()}},{b:function(){Ye()}},{b:function(){Ze()}},{b:function(){$e()}},{b:function(){af()}},{b:function(){bf()}},{b:function(){cf()}},{b:function(){df()}},{b:function(){ef()}}, | ||
115 | -{b:function(){ff()}},{b:function(){gf()}},{b:function(){hf()}});b.STATIC_BASE=sb;b.STATIC_BUMP=897344;G+=16;var ya=0,ub=[],X={},bb,m={Y:1,L:2,md:3,hc:4,fa:5,Ha:6,Ab:7,Fc:8,ea:9,Ob:10,Ca:11,wd:11,Ya:12,ra:13,$b:14,Rc:15,Da:16,Ea:17,xd:18,ta:19,Fa:20,ga:21,m:22,Ac:23,Xa:24,T:25,td:26,ac:27,Nc:28,ha:29,jd:30,tc:31,ad:32,Xb:33,ed:34,Jc:42,dc:43,Pb:44,kc:45,lc:46,mc:47,sc:48,ud:49,Dc:50,jc:51,Ub:35,Gc:37,Gb:52,Jb:53,yd:54,Bc:55,Kb:56,Lb:57,Vb:35,Mb:59,Pc:60,Ec:61,qd:62,Oc:63,Kc:64,Lc:65,hd:66,Hc:67,Db:68, | ||
116 | -nd:69,Qb:70,bd:71,vc:72,Yb:73,Ib:74,Wc:76,Hb:77,gd:78,nc:79,oc:80,rc:81,qc:82,pc:83,Qc:38,Ga:39,wc:36,sa:40,Xc:95,$c:96,Tb:104,Cc:105,Eb:97,dd:91,Uc:88,Mc:92,kd:108,Sb:111,Bb:98,Rb:103,zc:101,xc:100,rd:110,bc:112,cc:113,fc:115,Fb:114,Wb:89,uc:90,cd:93,ld:94,Cb:99,yc:102,ic:106,Sc:107,sd:109,vd:87,Zb:122,od:116,Vc:95,Ic:123,ec:84,Yc:75,Nb:125,Tc:131,Zc:130,pd:86},wd={0:"Success",1:"Not super-user",2:"No such file or directory",3:"No such process",4:"Interrupted system call",5:"I/O error",6:"No such device or address", | ||
117 | -7:"Arg list too long",8:"Exec format error",9:"Bad file number",10:"No children",11:"No more processes",12:"Not enough core",13:"Permission denied",14:"Bad address",15:"Block device required",16:"Mount device busy",17:"File exists",18:"Cross-device link",19:"No such device",20:"Not a directory",21:"Is a directory",22:"Invalid argument",23:"Too many open files in system",24:"Too many open files",25:"Not a typewriter",26:"Text file busy",27:"File too large",28:"No space left on device",29:"Illegal seek", | ||
118 | -30:"Read only file system",31:"Too many links",32:"Broken pipe",33:"Math arg out of domain of func",34:"Math result not representable",35:"File locking deadlock error",36:"File or path name too long",37:"No record locks available",38:"Function not implemented",39:"Directory not empty",40:"Too many symbolic links",42:"No message of desired type",43:"Identifier removed",44:"Channel number out of range",45:"Level 2 not synchronized",46:"Level 3 halted",47:"Level 3 reset",48:"Link number out of range", | ||
119 | -49:"Protocol driver not attached",50:"No CSI structure available",51:"Level 2 halted",52:"Invalid exchange",53:"Invalid request descriptor",54:"Exchange full",55:"No anode",56:"Invalid request code",57:"Invalid slot",59:"Bad font file fmt",60:"Device not a stream",61:"No data (for no delay io)",62:"Timer expired",63:"Out of streams resources",64:"Machine is not on the network",65:"Package not installed",66:"The object is remote",67:"The link has been severed",68:"Advertise error",69:"Srmount error", | ||
120 | -70:"Communication error on send",71:"Protocol error",72:"Multihop attempted",73:"Cross mount point (not really error)",74:"Trying to read unreadable message",75:"Value too large for defined data type",76:"Given log. name not unique",77:"f.d. invalid for this operation",78:"Remote address changed",79:"Can access a needed shared lib",80:"Accessing a corrupted shared lib",81:".lib section in a.out corrupted",82:"Attempting to link in too many libs",83:"Attempting to exec a shared library",84:"Illegal byte sequence", | ||
121 | -86:"Streams pipe error",87:"Too many users",88:"Socket operation on non-socket",89:"Destination address required",90:"Message too long",91:"Protocol wrong type for socket",92:"Protocol not available",93:"Unknown protocol",94:"Socket type not supported",95:"Not supported",96:"Protocol family not supported",97:"Address family not supported by protocol family",98:"Address already in use",99:"Address not available",100:"Network interface is not configured",101:"Network is unreachable",102:"Connection reset by network", | ||
122 | -103:"Connection aborted",104:"Connection reset by peer",105:"No buffer space available",106:"Socket is already connected",107:"Socket is not connected",108:"Can't send after socket shutdown",109:"Too many references",110:"Connection timed out",111:"Connection refused",112:"Host is down",113:"Host is unreachable",114:"Socket already connected",115:"Connection already in progress",116:"Stale file handle",122:"Quota exceeded",123:"No medium (in tape drive)",125:"Operation canceled",130:"Previous owner died", | ||
123 | -131:"State not recoverable"},Ac=[],qd={open:function(a){var c=Ac[a.node.rdev];if(!c)throw new q(m.ta);a.tty=c;a.seekable=!1},close:function(a){a.tty.W.flush(a.tty)},flush:function(a){a.tty.W.flush(a.tty)},read:function(a,c,b,e){if(!a.tty||!a.tty.W.Sa)throw new q(m.Ha);for(var g=0,d=0;d<e;d++){try{var f=a.tty.W.Sa(a.tty)}catch(n){throw new q(m.fa);}if(void 0===f&&0===g)throw new q(m.Ca);if(null===f||void 0===f)break;g++;c[b+d]=f}g&&(a.node.timestamp=Date.now());return g},write:function(a,c,b,e){if(!a.tty|| | ||
124 | -!a.tty.W.Aa)throw new q(m.Ha);for(var g=0;g<e;g++)try{a.tty.W.Aa(a.tty,c[b+g])}catch(l){throw new q(m.fa);}e&&(a.node.timestamp=Date.now());return g}},jf={Sa:function(a){if(!a.input.length){var c=null;if(ia){var b=new Buffer(256),e=0,k=process.stdin.fd;if("win32"!=process.platform){var d=!1;try{k=F.openSync("/dev/stdin","r"),d=!0}catch(x){}}try{e=F.readSync(k,b,0,256,null)}catch(x){if(-1!=x.toString().indexOf("EOF"))e=0;else throw x;}d&&F.closeSync(k);0<e?c=b.slice(0,e).toString("utf-8"):c=null}else"undefined"!= | ||
125 | -typeof window&&"function"==typeof window.prompt?(c=window.prompt("Input: "),null!==c&&(c+="\n")):"function"==typeof readline&&(c=readline(),null!==c&&(c+="\n"));if(!c)return null;a.input=Ra(c,!0)}return a.input.shift()},Aa:function(a,c){null===c||10===c?(b.print(W(a.output,0)),a.output=[]):0!=c&&a.output.push(c)},flush:function(a){a.output&&0<a.output.length&&(b.print(W(a.output,0)),a.output=[])}},kf={Aa:function(a,c){null===c||10===c?(b.printErr(W(a.output,0)),a.output=[]):0!=c&&a.output.push(c)}, | ||
126 | -flush:function(a){a.output&&0<a.output.length&&(b.printErr(W(a.output,0)),a.output=[])}},y={G:null,v:function(){return y.createNode(null,"/",16895,0)},createNode:function(a,c,b,e){if(24576===(b&61440)||4096===(b&61440))throw new q(m.Y);y.G||(y.G={dir:{node:{K:y.h.K,C:y.h.C,lookup:y.h.lookup,$:y.h.$,rename:y.h.rename,unlink:y.h.unlink,rmdir:y.h.rmdir,readdir:y.h.readdir,symlink:y.h.symlink},stream:{M:y.g.M}},file:{node:{K:y.h.K,C:y.h.C},stream:{M:y.g.M,read:y.g.read,write:y.g.write,Ja:y.g.Ja,Ta:y.g.Ta, | ||
127 | -na:y.g.na}},link:{node:{K:y.h.K,C:y.h.C,readlink:y.h.readlink},stream:{}},Ma:{node:{K:y.h.K,C:y.h.C},stream:lf}});b=Ob(a,c,b,e);16384===(b.mode&61440)?(b.h=y.G.dir.node,b.g=y.G.dir.stream,b.f={}):32768===(b.mode&61440)?(b.h=y.G.file.node,b.g=y.G.file.stream,b.l=0,b.f=null):40960===(b.mode&61440)?(b.h=y.G.link.node,b.g=y.G.link.stream):8192===(b.mode&61440)&&(b.h=y.G.Ma.node,b.g=y.G.Ma.stream);b.timestamp=Date.now();a&&(a.f[c]=b);return b},gb:function(a){if(a.f&&a.f.subarray){for(var c=[],b=0;b<a.l;++b)c.push(a.f[b]); | ||
128 | -return c}return a.f},zd:function(a){return a.f?a.f.subarray?a.f.subarray(0,a.l):new Uint8Array(a.f):new Uint8Array},Na:function(a,c){a.f&&a.f.subarray&&c>a.f.length&&(a.f=y.gb(a),a.l=a.f.length);if(!a.f||a.f.subarray){var b=a.f?a.f.length:0;b>=c||(c=Math.max(c,b*(1048576>b?2:1.125)|0),0!=b&&(c=Math.max(c,256)),b=a.f,a.f=new Uint8Array(c),0<a.l&&a.f.set(b.subarray(0,a.l),0))}else for(!a.f&&0<c&&(a.f=[]);a.f.length<c;)a.f.push(0)},qb:function(a,c){if(a.l!=c)if(0==c)a.f=null,a.l=0;else{if(!a.f||a.f.subarray){var b= | ||
129 | -a.f;a.f=new Uint8Array(new ArrayBuffer(c));b&&a.f.set(b.subarray(0,Math.min(c,a.l)))}else if(a.f||(a.f=[]),a.f.length>c)a.f.length=c;else for(;a.f.length<c;)a.f.push(0);a.l=c}},h:{K:function(a){var c={};c.dev=8192===(a.mode&61440)?a.id:1;c.ino=a.id;c.mode=a.mode;c.nlink=1;c.uid=0;c.gid=0;c.rdev=a.rdev;16384===(a.mode&61440)?c.size=4096:32768===(a.mode&61440)?c.size=a.l:40960===(a.mode&61440)?c.size=a.link.length:c.size=0;c.atime=new Date(a.timestamp);c.mtime=new Date(a.timestamp);c.ctime=new Date(a.timestamp); | ||
130 | -c.O=4096;c.blocks=Math.ceil(c.size/c.O);return c},C:function(a,c){void 0!==c.mode&&(a.mode=c.mode);void 0!==c.timestamp&&(a.timestamp=c.timestamp);void 0!==c.size&&y.qb(a,c.size)},lookup:function(){throw Rb[m.L];},$:function(a,c,b,e){return y.createNode(a,c,b,e)},rename:function(a,c,b){if(16384===(a.mode&61440)){try{var e=db(c,b)}catch(l){}if(e)for(var g in e.f)throw new q(m.Ga);}delete a.parent.f[a.name];a.name=b;c.f[b]=a;a.parent=c},unlink:function(a,c){delete a.f[c]},rmdir:function(a,c){var b= | ||
131 | -db(a,c),e;for(e in b.f)throw new q(m.Ga);delete a.f[c]},readdir:function(a){var c=[".",".."],b;for(b in a.f)a.f.hasOwnProperty(b)&&c.push(b);return c},symlink:function(a,c,b){a=y.createNode(a,c,41471,0);a.link=b;return a},readlink:function(a){if(40960!==(a.mode&61440))throw new q(m.m);return a.link}},g:{read:function(a,c,b,e,k){var g=a.node.f;if(k>=a.node.l)return 0;a=Math.min(a.node.l-k,e);O(0<=a);if(8<a&&g.subarray)c.set(g.subarray(k,k+a),b);else for(e=0;e<a;e++)c[b+e]=g[k+e];return a},write:function(a, | ||
132 | -c,b,e,k,d){if(!e)return 0;a=a.node;a.timestamp=Date.now();if(c.subarray&&(!a.f||a.f.subarray)){if(d)return a.f=c.subarray(b,b+e),a.l=e;if(0===a.l&&0===k)return a.f=new Uint8Array(c.subarray(b,b+e)),a.l=e;if(k+e<=a.l)return a.f.set(c.subarray(b,b+e),k),e}y.Na(a,k+e);if(a.f.subarray&&c.subarray)a.f.set(c.subarray(b,b+e),k);else for(d=0;d<e;d++)a.f[k+d]=c[b+d];a.l=Math.max(a.l,k+e);return e},M:function(a,c,b){1===b?c+=a.position:2===b&&32768===(a.node.mode&61440)&&(c+=a.node.l);if(0>c)throw new q(m.m); | ||
133 | -return c},Ja:function(a,c,b){y.Na(a.node,c+b);a.node.l=Math.max(a.node.l,c+b)},Ta:function(a,c,b,e,k,d,f){if(32768!==(a.node.mode&61440))throw new q(m.ta);b=a.node.f;if(f&2||b.buffer!==c&&b.buffer!==c.buffer){if(0<k||k+e<a.node.l)b.subarray?b=b.subarray(k,k+e):b=Array.prototype.slice.call(b,k,k+e);a=!0;e=da(e);if(!e)throw new q(m.Ya);c.set(b,e)}else a=!1,e=b.byteOffset;return{j:e,Za:a}},na:function(a,b,g,e,d){if(32768!==(a.node.mode&61440))throw new q(m.ta);if(d&2)return 0;y.g.write(a,b,0,e,g,!1); | ||
134 | -return 0}}},B={la:!1,tb:function(){B.la=!!process.platform.match(/^win/);var a=process.binding("constants");a.fs&&(a=a.fs);B.Oa={1024:a.O_APPEND,64:a.O_CREAT,128:a.O_EXCL,0:a.O_RDONLY,2:a.O_RDWR,4096:a.O_SYNC,512:a.O_TRUNC,1:a.O_WRONLY}},Ka:function(a){return Buffer.u?Buffer.from(a):new Buffer(a)},v:function(a){O(ia);return B.createNode(null,"/",B.Ra(a.za.root),0)},createNode:function(a,b,g){if(16384!==(g&61440)&&32768!==(g&61440)&&40960!==(g&61440))throw new q(m.m);a=Ob(a,b,g);a.h=B.h;a.g=B.g;return a}, | ||
135 | -Ra:function(a){try{var b=F.lstatSync(a);B.la&&(b.mode|=(b.mode&292)>>2)}catch(g){if(!g.code)throw g;throw new q(m[g.code]);}return b.mode},A:function(a){for(var b=[];a.parent!==a;)b.push(a.name),a=a.parent;b.push(a.v.za.root);b.reverse();return pd.apply(null,b)},eb:function(a){a&=-2656257;var b=0,g;for(g in B.Oa)a&g&&(b|=B.Oa[g],a^=g);if(a)throw new q(m.m);return b},h:{K:function(a){a=B.A(a);try{var b=F.lstatSync(a)}catch(g){if(!g.code)throw g;throw new q(m[g.code]);}B.la&&!b.O&&(b.O=4096);B.la&& | ||
136 | -!b.blocks&&(b.blocks=(b.size+b.O-1)/b.O|0);return{dev:b.dev,ino:b.ino,mode:b.mode,nlink:b.nlink,uid:b.uid,gid:b.gid,rdev:b.rdev,size:b.size,atime:b.atime,mtime:b.mtime,ctime:b.ctime,O:b.O,blocks:b.blocks}},C:function(a,b){var c=B.A(a);try{void 0!==b.mode&&(F.chmodSync(c,b.mode),a.mode=b.mode),void 0!==b.size&&F.truncateSync(c,b.size)}catch(e){if(!e.code)throw e;throw new q(m[e.code]);}},lookup:function(a,b){var c=qa(B.A(a),b),c=B.Ra(c);return B.createNode(a,b,c)},$:function(a,b,g,e){a=B.createNode(a, | ||
137 | -b,g,e);b=B.A(a);try{16384===(a.mode&61440)?F.mkdirSync(b,a.mode):F.writeFileSync(b,"",{mode:a.mode})}catch(k){if(!k.code)throw k;throw new q(m[k.code]);}return a},rename:function(a,b,g){a=B.A(a);b=qa(B.A(b),g);try{F.renameSync(a,b)}catch(e){if(!e.code)throw e;throw new q(m[e.code]);}},unlink:function(a,b){a=qa(B.A(a),b);try{F.unlinkSync(a)}catch(g){if(!g.code)throw g;throw new q(m[g.code]);}},rmdir:function(a,b){a=qa(B.A(a),b);try{F.rmdirSync(a)}catch(g){if(!g.code)throw g;throw new q(m[g.code]); | ||
138 | -}},readdir:function(a){a=B.A(a);try{return F.readdirSync(a)}catch(c){if(!c.code)throw c;throw new q(m[c.code]);}},symlink:function(a,b,g){a=qa(B.A(a),b);try{F.symlinkSync(g,a)}catch(e){if(!e.code)throw e;throw new q(m[e.code]);}},readlink:function(a){var b=B.A(a);try{return b=F.readlinkSync(b),ad.relative(ad.resolve(a.v.za.root),b)}catch(g){if(!g.code)throw g;throw new q(m[g.code]);}}},g:{open:function(a){var b=B.A(a.node);try{32768===(a.node.mode&61440)&&(a.aa=F.openSync(b,B.eb(a.flags)))}catch(g){if(!g.code)throw g; | ||
139 | -throw new q(m[g.code]);}},close:function(a){try{32768===(a.node.mode&61440)&&a.aa&&F.closeSync(a.aa)}catch(c){if(!c.code)throw c;throw new q(m[c.code]);}},read:function(a,b,g,e,d){if(0===e)return 0;try{return F.readSync(a.aa,B.Ka(b.buffer),g,e,d)}catch(l){throw new q(m[l.code]);}},write:function(a,b,g,e,d){try{return F.writeSync(a.aa,B.Ka(b.buffer),g,e,d)}catch(l){throw new q(m[l.code]);}},M:function(a,b,g){if(1===g)b+=a.position;else if(2===g&&32768===(a.node.mode&61440))try{b+=F.fstatSync(a.aa).size}catch(e){throw new q(m[e.code]); | ||
140 | -}if(0>b)throw new q(m.m);return b}}};G+=16;G+=16;G+=16;var Nb=null,Hc={},la=[],sd=1,Ja=null,Fc=!0,hb={},q=null,Rb={},vd={r:0,rs:1052672,"r+":2,w:577,wx:705,xw:705,"w+":578,"wx+":706,"xw+":706,a:1089,ax:1217,xa:1217,"a+":1090,"ax+":1218,"xa+":1218},lf={open:function(a){a.g=Hc[a.node.rdev].g;a.g.open&&a.g.open(a)},M:function(){throw new q(m.ha);}},vb,Sb,ja={},Ka,La,gb,bd={},S=0,Mc=void 0,Ca={},Ba={},jb={},Aa=void 0,Nc=void 0,Za=void 0,Pa=[],cd={},Qa={},Rc=void 0,ac=[],ba=[{},{value:void 0},{value:null}, | ||
141 | -{value:!0},{value:!1}],dd=G,Sa=G+=48,Ld=G+=16,Kd=G+=16;G+=16;var Vc,ed=G;G+=16;var fd,U={},V=G;G+=48;ka(Ra("GMT"),2);var wb={},oc=1,pb=[31,29,31,30,31,30,31,31,30,31,30,31],qb=[31,28,31,30,31,30,31,31,30,31,30,31];Lc();Ja=Array(4096);Ic(y,"/");fa("/tmp");fa("/home");fa("/home/web_user");(function(){fa("/dev");Mb(259,{read:function(){return 0},write:function(a,b,c,d){return d}});fb("/dev/null",259);zc(1280,jf);zc(1536,kf);fb("/dev/tty",1280);fb("/dev/tty1",1536);if("undefined"!==typeof crypto)var a= | ||
142 | -new Uint8Array(1),b=function(){crypto.getRandomValues(a);return a[0]};else b=ia?function(){return require("crypto").randomBytes(1)[0]}:function(){return 256*Math.random()|0};Na("random",b);Na("urandom",b);fa("/dev/shm");fa("/dev/shm/tmp")})();fa("/proc");fa("/proc/self");fa("/proc/self/fd");Ic({v:function(){var a=Ob("/proc/self","fd",16895,73);a.h={lookup:function(a,b){var c=la[+b];if(!c)throw new q(m.ea);a={parent:null,v:{Ua:"fake"},h:{readlink:function(){return c.path}}};return a.parent=a}};return a}}, | ||
143 | -"/proc/self/fd");rb.unshift(function(){if(!b.noFSInit&&!vb){O(!vb,"FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)");vb=!0;Lc();b.stdin=b.stdin;b.stdout=b.stdout;b.stderr=b.stderr;b.stdin?Na("stdin",b.stdin):Qb("/dev/tty","/dev/stdin");b.stdout?Na("stdout",null,b.stdout):Qb("/dev/tty","/dev/stdout");b.stderr?Na("stderr",null,b.stderr):Qb("/dev/tty1","/dev/stderr");var a=Ma("/dev/stdin", | ||
144 | -"r");O(0===a.fd,"invalid handle for stdin ("+a.fd+")");a=Ma("/dev/stdout","w");O(1===a.fd,"invalid handle for stdout ("+a.fd+")");a=Ma("/dev/stderr","w");O(2===a.fd,"invalid handle for stderr ("+a.fd+")")}});Zc.push(function(){Fc=!1});mc.push(function(){vb=!1;var a=b._fflush;a&&a(0);for(a=0;a<la.length;a++){var c=la[a];c&&Jc(c)}});rb.unshift(function(){});mc.push(function(){});if(ia){var F=require("fs"),ad=require("path");B.tb()}for(var gd=Array(256),xb=0;256>xb;++xb)gd[xb]=String.fromCharCode(xb); | ||
145 | -Mc=gd;Aa=b.BindingError=Wb("BindingError");Nc=b.InternalError=Wb("InternalError");na.prototype.isAliasOf=function(a){if(!(this instanceof na&&a instanceof na))return!1;var b=this.c.o.i,g=this.c.j,e=a.c.o.i;for(a=a.c.j;b.F;)g=b.da(g),b=b.F;for(;e.F;)a=e.da(a),e=e.F;return b===e&&g===a};na.prototype.clone=function(){this.c.j||Xb(this);if(this.c.ba)return this.c.count.value+=1,this;var a=this.c,a=Object.create(Object.getPrototypeOf(this),{c:{value:{count:a.count,U:a.U,ba:a.ba,j:a.j,o:a.o,B:a.B,D:a.D}}}); | ||
146 | -a.c.count.value+=1;a.c.U=!1;return a};na.prototype["delete"]=function(){this.c.j||Xb(this);this.c.U&&!this.c.ba&&A("Object already scheduled for deletion");--this.c.count.value;if(0===this.c.count.value){var a=this.c;a.B?a.D.R(a.B):a.o.i.R(a.j)}this.c.ba||(this.c.B=void 0,this.c.j=void 0)};na.prototype.isDeleted=function(){return!this.c.j};na.prototype.deleteLater=function(){this.c.j||Xb(this);this.c.U&&!this.c.ba&&A("Object already scheduled for deletion");Pa.push(this);1===Pa.length&&Za&&Za(Yb); | ||
147 | -this.c.U=!0;return this};ha.prototype.hb=function(a){this.Va&&(a=this.Va(a));return a};ha.prototype.Z=function(a){this.R&&this.R(a)};ha.prototype.argPackAdvance=8;ha.prototype.readValueFromPointer=kb;ha.prototype.deleteObject=function(a){if(null!==a)a["delete"]()};ha.prototype.fromWireType=function(a){function b(){return this.ka?lb(this.i.V,{o:this.mb,j:g,D:this,B:a}):lb(this.i.V,{o:this,j:a})}var g=this.hb(a);if(!g)return this.Z(a),null;var e=Dd(this.i,g);if(void 0!==e){if(0===e.c.count.value)return e.c.j= | ||
148 | -g,e.c.B=a,e.clone();e=e.clone();this.Z(a);return e}e=this.i.fb(g);e=cd[e];if(!e)return b.call(this);var e=this.ja?e.bb:e.pointerType,d=Qc(g,this.i,e.i);return null===d?b.call(this):this.ka?lb(e.i.V,{o:e,j:d,D:this,B:a}):lb(e.i.V,{o:e,j:d})};b.getInheritedInstanceCount=function(){return Object.keys(Qa).length};b.getLiveInheritedInstances=function(){var a=[],b;for(b in Qa)Qa.hasOwnProperty(b)&&a.push(Qa[b]);return a};b.flushPendingDeletes=Yb;b.setDelayFunction=function(a){Za=a;Pa.length&&Za&&Za(Yb)}; | ||
149 | -Rc=b.UnboundTypeError=Wb("UnboundTypeError");b.count_emval_handles=function(){for(var a=0,b=5;b<ba.length;++b)void 0!==ba[b]&&++a;return a};b.get_first_emval=function(){for(var a=5;a<ba.length;++a)if(void 0!==ba[a])return ba[a];return null};var Ga,ua;fd?(ua=p[ed>>2],Ga=p[ua>>2]):(fd=!0,U.USER=U.LOGNAME="web_user",U.PATH="/",U.PWD="/",U.HOME="/home/web_user",U.LANG="C.UTF-8",U._=b.thisProgram,Ga=r(1024),ua=r(256),p[ua>>2]=Ga,p[ed>>2]=ua);var yb=[],hd=0,zb;for(zb in U)if("string"===typeof U[zb]){var Ab= | ||
150 | -zb+"="+U[zb];yb.push(Ab);hd+=Ab.length}if(1024<hd)throw Error("Environment size exceeded TOTAL_ENV_SIZE!");for(var Bb=0;Bb<yb.length;Bb++){for(var id=Ab=yb[Bb],jd=Ga,pc=0;pc<id.length;++pc)P[jd++>>0]=id.charCodeAt(pc);P[jd>>0]=0;p[ua+4*Bb>>2]=Ga;Ga+=Ab.length+1}p[ua+4*yb.length>>2]=0;aa=r(4);hc=tb=v(G);ic=hc+lc;jc=v(ic);p[aa>>2]=jc;Db=!0;b.wasmTableSize=3583;b.wasmMaxTableSize=3583;b.$a={};b.ab={abort:E,enlargeMemory:qc,getTotalMemory:function(){return H},abortOnCannotGrowMemory:function(){E("Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value "+ | ||
151 | -H+", (2) compile with -s ALLOW_MEMORY_GROWTH=1 which allows increasing the size at runtime, or (3) if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 ")},invoke_di:function(a,c){try{return b.dynCall_di(a,c)}catch(g){if("number"!==typeof g&&"longjmp"!==g)throw g;b.setThrew(1,0)}},invoke_dii:function(a,c,g){try{return b.dynCall_dii(a,c,g)}catch(e){if("number"!==typeof e&&"longjmp"!==e)throw e;b.setThrew(1,0)}},invoke_diiii:function(a,c,g,e,d){try{return b.dynCall_diiii(a, | ||
152 | -c,g,e,d)}catch(l){if("number"!==typeof l&&"longjmp"!==l)throw l;b.setThrew(1,0)}},invoke_fi:function(a,c){try{return b.dynCall_fi(a,c)}catch(g){if("number"!==typeof g&&"longjmp"!==g)throw g;b.setThrew(1,0)}},invoke_fii:function(a,c,g){try{return b.dynCall_fii(a,c,g)}catch(e){if("number"!==typeof e&&"longjmp"!==e)throw e;b.setThrew(1,0)}},invoke_fiifffi:function(a,c,g,e,d,l,f){try{return b.dynCall_fiifffi(a,c,g,e,d,l,f)}catch(n){if("number"!==typeof n&&"longjmp"!==n)throw n;b.setThrew(1,0)}},invoke_fiii:function(a, | ||
153 | -c,g,e){try{return b.dynCall_fiii(a,c,g,e)}catch(k){if("number"!==typeof k&&"longjmp"!==k)throw k;b.setThrew(1,0)}},invoke_i:function(a){try{return b.dynCall_i(a)}catch(c){if("number"!==typeof c&&"longjmp"!==c)throw c;b.setThrew(1,0)}},invoke_ii:function(a,c){try{return b.dynCall_ii(a,c)}catch(g){if("number"!==typeof g&&"longjmp"!==g)throw g;b.setThrew(1,0)}},invoke_iid:function(a,c,g){try{return b.dynCall_iid(a,c,g)}catch(e){if("number"!==typeof e&&"longjmp"!==e)throw e;b.setThrew(1,0)}},invoke_iififi:function(a, | ||
154 | -c,g,e,d,l){try{return b.dynCall_iififi(a,c,g,e,d,l)}catch(x){if("number"!==typeof x&&"longjmp"!==x)throw x;b.setThrew(1,0)}},invoke_iii:function(a,c,g){try{return b.dynCall_iii(a,c,g)}catch(e){if("number"!==typeof e&&"longjmp"!==e)throw e;b.setThrew(1,0)}},invoke_iiifii:function(a,c,g,e,d,l){try{return b.dynCall_iiifii(a,c,g,e,d,l)}catch(x){if("number"!==typeof x&&"longjmp"!==x)throw x;b.setThrew(1,0)}},invoke_iiifiiiiiii:function(a,c,g,e,d,l,f,n,h,u,w){try{return b.dynCall_iiifiiiiiii(a,c,g,e,d, | ||
155 | -l,f,n,h,u,w)}catch(J){if("number"!==typeof J&&"longjmp"!==J)throw J;b.setThrew(1,0)}},invoke_iiii:function(a,c,g,e){try{return b.dynCall_iiii(a,c,g,e)}catch(k){if("number"!==typeof k&&"longjmp"!==k)throw k;b.setThrew(1,0)}},invoke_iiiidi:function(a,c,g,e,d,l){try{return b.dynCall_iiiidi(a,c,g,e,d,l)}catch(x){if("number"!==typeof x&&"longjmp"!==x)throw x;b.setThrew(1,0)}},invoke_iiiii:function(a,c,g,e,d){try{return b.dynCall_iiiii(a,c,g,e,d)}catch(l){if("number"!==typeof l&&"longjmp"!==l)throw l;b.setThrew(1, | ||
156 | -0)}},invoke_iiiiifi:function(a,c,g,e,d,l,f){try{return b.dynCall_iiiiifi(a,c,g,e,d,l,f)}catch(n){if("number"!==typeof n&&"longjmp"!==n)throw n;b.setThrew(1,0)}},invoke_iiiiii:function(a,c,g,e,d,l){try{return b.dynCall_iiiiii(a,c,g,e,d,l)}catch(x){if("number"!==typeof x&&"longjmp"!==x)throw x;b.setThrew(1,0)}},invoke_iiiiiii:function(a,c,g,e,d,l,f){try{return b.dynCall_iiiiiii(a,c,g,e,d,l,f)}catch(n){if("number"!==typeof n&&"longjmp"!==n)throw n;b.setThrew(1,0)}},invoke_iiiiiiii:function(a,c,g,e,d, | ||
157 | -l,f,h){try{return b.dynCall_iiiiiiii(a,c,g,e,d,l,f,h)}catch(z){if("number"!==typeof z&&"longjmp"!==z)throw z;b.setThrew(1,0)}},invoke_iiiiiiiif:function(a,c,g,e,d,l,f,h,z){try{return b.dynCall_iiiiiiiif(a,c,g,e,d,l,f,h,z)}catch(u){if("number"!==typeof u&&"longjmp"!==u)throw u;b.setThrew(1,0)}},invoke_iiiiiiiii:function(a,c,g,e,d,l,f,h,z){try{return b.dynCall_iiiiiiiii(a,c,g,e,d,l,f,h,z)}catch(u){if("number"!==typeof u&&"longjmp"!==u)throw u;b.setThrew(1,0)}},invoke_iiiiiiiiii:function(a,c,g,e,d,l, | ||
158 | -f,h,z,u){try{return b.dynCall_iiiiiiiiii(a,c,g,e,d,l,f,h,z,u)}catch(w){if("number"!==typeof w&&"longjmp"!==w)throw w;b.setThrew(1,0)}},invoke_iiiiiiiiiiii:function(a,c,g,e,d,l,f,h,z,u,w,m){try{return b.dynCall_iiiiiiiiiiii(a,c,g,e,d,l,f,h,z,u,w,m)}catch(ma){if("number"!==typeof ma&&"longjmp"!==ma)throw ma;b.setThrew(1,0)}},invoke_iiiiiiiiiiiiiiii:function(a,c,g,e,d,l,f,h,m,u,w,q,p,r,t,v){try{return b.dynCall_iiiiiiiiiiiiiiii(a,c,g,e,d,l,f,h,m,u,w,q,p,r,t,v)}catch(M){if("number"!==typeof M&&"longjmp"!== | ||
159 | -M)throw M;b.setThrew(1,0)}},invoke_iiiiiiiiiiiiiiiiii:function(a,c,g,e,d,l,f,h,m,u,w,q,p,r,t,v,M,y){try{return b.dynCall_iiiiiiiiiiiiiiiiii(a,c,g,e,d,l,f,h,m,u,w,q,p,r,t,v,M,y)}catch(va){if("number"!==typeof va&&"longjmp"!==va)throw va;b.setThrew(1,0)}},invoke_v:function(a){try{b.dynCall_v(a)}catch(c){if("number"!==typeof c&&"longjmp"!==c)throw c;b.setThrew(1,0)}},invoke_vi:function(a,c){try{b.dynCall_vi(a,c)}catch(g){if("number"!==typeof g&&"longjmp"!==g)throw g;b.setThrew(1,0)}},invoke_vidii:function(a, | ||
160 | -c,g,e,d){try{b.dynCall_vidii(a,c,g,e,d)}catch(l){if("number"!==typeof l&&"longjmp"!==l)throw l;b.setThrew(1,0)}},invoke_vif:function(a,c,g){try{b.dynCall_vif(a,c,g)}catch(e){if("number"!==typeof e&&"longjmp"!==e)throw e;b.setThrew(1,0)}},invoke_viffffffff:function(a,c,g,e,d,l,f,h,m,u){try{b.dynCall_viffffffff(a,c,g,e,d,l,f,h,m,u)}catch(w){if("number"!==typeof w&&"longjmp"!==w)throw w;b.setThrew(1,0)}},invoke_viffffffffffffffff:function(a,c,g,e,d,l,f,h,m,u,w,q,p,r,t,v,M,y){try{b.dynCall_viffffffffffffffff(a, | ||
161 | -c,g,e,d,l,f,h,m,u,w,q,p,r,t,v,M,y)}catch(va){if("number"!==typeof va&&"longjmp"!==va)throw va;b.setThrew(1,0)}},invoke_vii:function(a,c,g){try{b.dynCall_vii(a,c,g)}catch(e){if("number"!==typeof e&&"longjmp"!==e)throw e;b.setThrew(1,0)}},invoke_viid:function(a,c,g,e){try{b.dynCall_viid(a,c,g,e)}catch(k){if("number"!==typeof k&&"longjmp"!==k)throw k;b.setThrew(1,0)}},invoke_viiddi:function(a,c,g,e,d,l){try{b.dynCall_viiddi(a,c,g,e,d,l)}catch(x){if("number"!==typeof x&&"longjmp"!==x)throw x;b.setThrew(1, | ||
162 | -0)}},invoke_viidi:function(a,c,g,e,d){try{b.dynCall_viidi(a,c,g,e,d)}catch(l){if("number"!==typeof l&&"longjmp"!==l)throw l;b.setThrew(1,0)}},invoke_viididii:function(a,c,g,e,d,l,f,h){try{b.dynCall_viididii(a,c,g,e,d,l,f,h)}catch(z){if("number"!==typeof z&&"longjmp"!==z)throw z;b.setThrew(1,0)}},invoke_viif:function(a,c,g,e){try{b.dynCall_viif(a,c,g,e)}catch(k){if("number"!==typeof k&&"longjmp"!==k)throw k;b.setThrew(1,0)}},invoke_viiffff:function(a,c,g,e,d,f,h){try{b.dynCall_viiffff(a,c,g,e,d,f, | ||
163 | -h)}catch(n){if("number"!==typeof n&&"longjmp"!==n)throw n;b.setThrew(1,0)}},invoke_viifi:function(a,c,g,e,d){try{b.dynCall_viifi(a,c,g,e,d)}catch(l){if("number"!==typeof l&&"longjmp"!==l)throw l;b.setThrew(1,0)}},invoke_viifii:function(a,c,g,e,d,f){try{b.dynCall_viifii(a,c,g,e,d,f)}catch(x){if("number"!==typeof x&&"longjmp"!==x)throw x;b.setThrew(1,0)}},invoke_viifiif:function(a,c,g,e,d,f,h){try{b.dynCall_viifiif(a,c,g,e,d,f,h)}catch(n){if("number"!==typeof n&&"longjmp"!==n)throw n;b.setThrew(1,0)}}, | ||
164 | -invoke_viii:function(a,c,d,e){try{b.dynCall_viii(a,c,d,e)}catch(k){if("number"!==typeof k&&"longjmp"!==k)throw k;b.setThrew(1,0)}},invoke_viiid:function(a,c,d,e,k){try{b.dynCall_viiid(a,c,d,e,k)}catch(l){if("number"!==typeof l&&"longjmp"!==l)throw l;b.setThrew(1,0)}},invoke_viiidd:function(a,c,d,e,k,f){try{b.dynCall_viiidd(a,c,d,e,k,f)}catch(x){if("number"!==typeof x&&"longjmp"!==x)throw x;b.setThrew(1,0)}},invoke_viiiddi:function(a,c,d,e,k,f,h){try{b.dynCall_viiiddi(a,c,d,e,k,f,h)}catch(n){if("number"!== | ||
165 | -typeof n&&"longjmp"!==n)throw n;b.setThrew(1,0)}},invoke_viiidi:function(a,c,d,e,k,f){try{b.dynCall_viiidi(a,c,d,e,k,f)}catch(x){if("number"!==typeof x&&"longjmp"!==x)throw x;b.setThrew(1,0)}},invoke_viiidii:function(a,c,d,e,k,f,h){try{b.dynCall_viiidii(a,c,d,e,k,f,h)}catch(n){if("number"!==typeof n&&"longjmp"!==n)throw n;b.setThrew(1,0)}},invoke_viiif:function(a,c,d,e,k){try{b.dynCall_viiif(a,c,d,e,k)}catch(l){if("number"!==typeof l&&"longjmp"!==l)throw l;b.setThrew(1,0)}},invoke_viiifiii:function(a, | ||
166 | -c,d,e,k,f,h,n){try{b.dynCall_viiifiii(a,c,d,e,k,f,h,n)}catch(z){if("number"!==typeof z&&"longjmp"!==z)throw z;b.setThrew(1,0)}},invoke_viiii:function(a,c,d,e,k){try{b.dynCall_viiii(a,c,d,e,k)}catch(l){if("number"!==typeof l&&"longjmp"!==l)throw l;b.setThrew(1,0)}},invoke_viiiid:function(a,c,d,e,k,f){try{b.dynCall_viiiid(a,c,d,e,k,f)}catch(x){if("number"!==typeof x&&"longjmp"!==x)throw x;b.setThrew(1,0)}},invoke_viiiidi:function(a,c,d,e,k,f,h){try{b.dynCall_viiiidi(a,c,d,e,k,f,h)}catch(n){if("number"!== | ||
167 | -typeof n&&"longjmp"!==n)throw n;b.setThrew(1,0)}},invoke_viiiidiii:function(a,c,d,e,k,f,h,n,m){try{b.dynCall_viiiidiii(a,c,d,e,k,f,h,n,m)}catch(u){if("number"!==typeof u&&"longjmp"!==u)throw u;b.setThrew(1,0)}},invoke_viiiii:function(a,c,d,e,k,f){try{b.dynCall_viiiii(a,c,d,e,k,f)}catch(x){if("number"!==typeof x&&"longjmp"!==x)throw x;b.setThrew(1,0)}},invoke_viiiiidi:function(a,c,d,e,k,f,h,n){try{b.dynCall_viiiiidi(a,c,d,e,k,f,h,n)}catch(z){if("number"!==typeof z&&"longjmp"!==z)throw z;b.setThrew(1, | ||
168 | -0)}},invoke_viiiiifi:function(a,c,d,e,k,f,h,n){try{b.dynCall_viiiiifi(a,c,d,e,k,f,h,n)}catch(z){if("number"!==typeof z&&"longjmp"!==z)throw z;b.setThrew(1,0)}},invoke_viiiiii:function(a,c,d,e,k,f,h){try{b.dynCall_viiiiii(a,c,d,e,k,f,h)}catch(n){if("number"!==typeof n&&"longjmp"!==n)throw n;b.setThrew(1,0)}},invoke_viiiiiiddi:function(a,c,d,e,f,l,h,n,m,u){try{b.dynCall_viiiiiiddi(a,c,d,e,f,l,h,n,m,u)}catch(w){if("number"!==typeof w&&"longjmp"!==w)throw w;b.setThrew(1,0)}},invoke_viiiiiidi:function(a, | ||
169 | -c,d,e,f,l,h,n,m){try{b.dynCall_viiiiiidi(a,c,d,e,f,l,h,n,m)}catch(u){if("number"!==typeof u&&"longjmp"!==u)throw u;b.setThrew(1,0)}},invoke_viiiiiii:function(a,c,d,e,f,l,h,n){try{b.dynCall_viiiiiii(a,c,d,e,f,l,h,n)}catch(z){if("number"!==typeof z&&"longjmp"!==z)throw z;b.setThrew(1,0)}},invoke_viiiiiiiddi:function(a,c,d,e,f,l,h,n,m,u,w){try{b.dynCall_viiiiiiiddi(a,c,d,e,f,l,h,n,m,u,w)}catch(J){if("number"!==typeof J&&"longjmp"!==J)throw J;b.setThrew(1,0)}},invoke_viiiiiiii:function(a,c,d,e,f,l,h, | ||
170 | -n,m){try{b.dynCall_viiiiiiii(a,c,d,e,f,l,h,n,m)}catch(u){if("number"!==typeof u&&"longjmp"!==u)throw u;b.setThrew(1,0)}},invoke_viiiiiiiifi:function(a,c,d,e,f,l,h,n,m,u,w){try{b.dynCall_viiiiiiiifi(a,c,d,e,f,l,h,n,m,u,w)}catch(J){if("number"!==typeof J&&"longjmp"!==J)throw J;b.setThrew(1,0)}},invoke_viiiiiiiii:function(a,c,d,e,f,l,h,n,m,u){try{b.dynCall_viiiiiiiii(a,c,d,e,f,l,h,n,m,u)}catch(w){if("number"!==typeof w&&"longjmp"!==w)throw w;b.setThrew(1,0)}},invoke_viiiiiiiiii:function(a,c,d,e,f,l, | ||
171 | -h,n,m,u,w){try{b.dynCall_viiiiiiiiii(a,c,d,e,f,l,h,n,m,u,w)}catch(J){if("number"!==typeof J&&"longjmp"!==J)throw J;b.setThrew(1,0)}},invoke_viiiiiiiiiiddi:function(a,c,d,e,f,l,h,n,m,u,w,q,p,r){try{b.dynCall_viiiiiiiiiiddi(a,c,d,e,f,l,h,n,m,u,w,q,p,r)}catch(Q){if("number"!==typeof Q&&"longjmp"!==Q)throw Q;b.setThrew(1,0)}},invoke_viiiiiiiiiii:function(a,c,d,e,f,l,h,n,m,u,w,q){try{b.dynCall_viiiiiiiiiii(a,c,d,e,f,l,h,n,m,u,w,q)}catch(ma){if("number"!==typeof ma&&"longjmp"!==ma)throw ma;b.setThrew(1, | ||
172 | -0)}},invoke_viiiiiiiiiiii:function(a,c,d,e,f,l,h,n,m,u,w,q,p){try{b.dynCall_viiiiiiiiiiii(a,c,d,e,f,l,h,n,m,u,w,q,p)}catch(ca){if("number"!==typeof ca&&"longjmp"!==ca)throw ca;b.setThrew(1,0)}},invoke_viiiiiiiiiiiii:function(a,c,d,e,f,l,h,n,m,u,w,q,p,r){try{b.dynCall_viiiiiiiiiiiii(a,c,d,e,f,l,h,n,m,u,w,q,p,r)}catch(Q){if("number"!==typeof Q&&"longjmp"!==Q)throw Q;b.setThrew(1,0)}},invoke_viiiiiiiiiiiiiii:function(a,c,d,e,f,l,h,n,m,u,q,p,r,t,v,y){try{b.dynCall_viiiiiiiiiiiiiii(a,c,d,e,f,l,h,n,m,u, | ||
173 | -q,p,r,t,v,y)}catch(M){if("number"!==typeof M&&"longjmp"!==M)throw M;b.setThrew(1,0)}},invoke_viiiiiiiiiiiiiiii:function(a,c,d,e,f,l,h,n,m,u,q,p,r,t,v,y,M){try{b.dynCall_viiiiiiiiiiiiiiii(a,c,d,e,f,l,h,n,m,u,q,p,r,t,v,y,M)}catch(cc){if("number"!==typeof cc&&"longjmp"!==cc)throw cc;b.setThrew(1,0)}},invoke_vij:function(a,c,d,e){try{b.dynCall_vij(a,c,d,e)}catch(k){if("number"!==typeof k&&"longjmp"!==k)throw k;b.setThrew(1,0)}},_DMImage_Save:function(){b.printErr("missing function: DMImage_Save");E(-1)}, | ||
174 | -__ZSt18uncaught_exceptionv:xa,___assert_fail:function(a,b,d,e){E("Assertion failed: "+N(a)+", at: "+[b?N(b):"unknown filename",d,e?N(e):"unknown function"])},___cxa_allocate_exception:function(a){return da(a)},___cxa_begin_catch:function(a){var b=X[a];b&&!b.La&&(b.La=!0,xa.u--);b&&(b.oa=!1);ub.push(a);(b=wc(a))&&X[b].X++;return a},___cxa_call_unexpected:function(a){b.printErr("Unexpected exception thrown, this is not properly supported - aborting");Wa=!0;throw a;},___cxa_end_catch:function(){b.setThrew(0); | ||
175 | -var a=ub.pop();if(a){if(a=wc(a)){var c=X[a];O(0<c.X);c.X--;0!==c.X||c.oa||(c.Z&&b.dynCall_vi(c.Z,a),delete X[a],xc(a))}ya=0}},___cxa_find_matching_catch_2:function(){return Ib.apply(null,arguments)},___cxa_find_matching_catch_3:function(){return Ib.apply(null,arguments)},___cxa_find_matching_catch_4:function(){return Ib.apply(null,arguments)},___cxa_free_exception:xc,___cxa_get_exception_ptr:function(a){return a},___cxa_pure_virtual:function(){Wa=!0;throw"Pure virtual function called!";},___cxa_rethrow:function(){var a= | ||
176 | -ub.pop();X[a].oa||(ub.push(a),X[a].oa=!0);ya=a;throw a;},___cxa_throw:function(a,b,d){X[a]={j:a,Ia:a,type:b,Z:d,X:0,La:!1,oa:!1};ya=a;"uncaught_exception"in xa?xa.u++:xa.u=1;throw a;},___lock:function(){},___map_file:function(){Jb(m.Y);return-1},___resumeException:function(a){ya||(ya=a);throw a;},___setErrNo:Jb,___syscall140:function(a,b){S=b;try{var c=za();D();var e=D(),d=D(),f=D();Kc(c,e,f);p[d>>2]=c.position;c.wa&&0===e&&0===f&&(c.wa=null);return 0}catch(x){return"undefined"!==typeof ja&&x instanceof | ||
177 | -q||E(x),-x.J}},___syscall145:function(a,b){S=b;try{var c=za(),e=D();a:{var d=D();for(b=a=0;b<d;b++){var f=p[e+(8*b+4)>>2],h=c,n=p[e+8*b>>2],r=f,u=void 0,w=P;if(0>r||0>u)throw new q(m.m);if(1===(h.flags&2097155))throw new q(m.ea);if(16384===(h.node.mode&61440))throw new q(m.ga);if(!h.g.read)throw new q(m.m);var t="undefined"!==typeof u;if(!t)u=h.position;else if(!h.seekable)throw new q(m.ha);var v=h.g.read(h,w,n,r,u);t||(h.position+=v);h=v;if(0>h){var y=-1;break a}a+=h;if(h<f)break}y=a}return y}catch(Q){return"undefined"!== | ||
178 | -typeof ja&&Q instanceof q||E(Q),-Q.J}},___syscall146:function(a,b){S=b;try{var c=za(),e=D();a:{var d=D();for(b=a=0;b<d;b++){var f=c,h=p[e+8*b>>2],n=p[e+(8*b+4)>>2],r=P,u=void 0;if(0>n||0>u)throw new q(m.m);if(0===(f.flags&2097155))throw new q(m.ea);if(16384===(f.node.mode&61440))throw new q(m.ga);if(!f.g.write)throw new q(m.m);f.flags&1024&&Kc(f,0,2);var w="undefined"!==typeof u;if(!w)u=f.position;else if(!f.seekable)throw new q(m.ha);var t=f.g.write(f,r,h,n,u,void 0);w||(f.position+=t);try{if(f.path&& | ||
179 | -hb.onWriteToFile)hb.onWriteToFile(f.path)}catch(ca){console.log("FS.trackingDelegate['onWriteToFile']('"+path+"') threw an exception: "+ca.message)}f=t;if(0>f){var v=-1;break a}a+=f}v=a}return v}catch(ca){return"undefined"!==typeof ja&&ca instanceof q||E(ca),-ca.J}},___syscall20:function(a,b){S=b;return 42},___syscall221:function(a,b){S=b;try{var c=za();switch(D()){case 0:var e=D();return 0>e?-m.m:Ma(c.path,c.flags,0,e).fd;case 1:case 2:return 0;case 3:return c.flags;case 4:return e=D(),c.flags|= | ||
180 | -e,0;case 12:case 12:return e=D(),Ha[e+0>>1]=2,0;case 13:case 14:case 13:case 14:return 0;case 16:case 8:return-m.m;case 9:return Jb(m.m),-1;default:return-m.m}}catch(k){return"undefined"!==typeof ja&&k instanceof q||E(k),-k.J}},___syscall5:function(a,b){S=b;try{var c=N(D()),e=D(),d=D();return Ma(c,e,d).fd}catch(l){return"undefined"!==typeof ja&&l instanceof q||E(l),-l.J}},___syscall54:function(a,b){S=b;try{var c=za(),e=D();switch(e){case 21509:case 21505:return c.tty?0:-m.T;case 21510:case 21511:case 21512:case 21506:case 21507:case 21508:return c.tty? | ||
181 | -0:-m.T;case 21519:if(!c.tty)return-m.T;var d=D();return p[d>>2]=0;case 21520:return c.tty?-m.m:-m.T;case 21531:a=D();if(!c.g.jb)throw new q(m.T);return c.g.jb(c,e,a);case 21523:return c.tty?0:-m.T;default:E("bad ioctl syscall "+e)}}catch(l){return"undefined"!==typeof ja&&l instanceof q||E(l),-l.J}},___syscall6:function(a,b){S=b;try{var c=za();Jc(c);return 0}catch(e){return"undefined"!==typeof ja&&e instanceof q||E(e),-e.J}},___syscall85:function(a,b){S=b;try{var c=N(D()),e=D(),d=D();if(0>=d)var f= | ||
182 | --m.m;else{var h=Bc(c),n=Math.min(d,wa(h)),p=P[e+n];Z(h,I,e,d+1);P[e+n]=p;f=n}return f}catch(u){return"undefined"!==typeof ja&&u instanceof q||E(u),-u.J}},___syscall91:function(a,b){S=b;try{var c=D(),e=D(),d=bd[c];if(!d)return 0;if(e===d.Bd){var f=la[d.fd],h=d.flags,n=new Uint8Array(I.subarray(c,c+e));f&&f.g.na&&f.g.na(f,n,0,e,h);bd[c]=null;d.Za&&R(d.Cd)}return 0}catch(z){return"undefined"!==typeof ja&&z instanceof q||E(z),-z.J}},___unlock:function(){},__embind_register_bool:function(a,b,d,e,f){var c= | ||
183 | -Tb(d);b=T(b);ga(a,{name:b,fromWireType:function(a){return!!a},toWireType:function(a,b){return b?e:f},argPackAdvance:8,readValueFromPointer:function(a){if(1===d)var e=P;else if(2===d)e=Ha;else if(4===d)e=p;else throw new TypeError("Unknown boolean type size: "+b);return this.fromWireType(e[a>>c])},I:null})},__embind_register_class:function(a,b,d,e,f,h,m,n,q,u,p,r,t){p=T(p);h=Ea(f,h);n&&(n=Ea(m,n));u&&(u=Ea(q,u));t=Ea(r,t);var c=Ub(p);yd(c,function(){$b("Cannot construct "+p+" due to unbound types", | ||
184 | -[e])});Oa([a,b,d],e?[e]:[],function(b){b=b[0];if(e)var d=b.i,f=d.V;else f=na.prototype;b=Vb(c,function(){if(Object.getPrototypeOf(this)!==g)throw new Aa("Use 'new' to construct "+p);if(void 0===k.P)throw new Aa(p+" has no accessible constructor");var a=k.P[arguments.length];if(void 0===a)throw new Aa("Tried to invoke ctor of "+p+" with invalid number of parameters ("+arguments.length+") - expected ("+Object.keys(k.P).toString()+") parameters instead!");return a.apply(this,arguments)});var g=Object.create(f, | ||
185 | -{constructor:{value:b}});b.prototype=g;var k=new zd(p,b,g,t,d,h,n,u),d=new ha(p,k,!0,!1,!1),f=new ha(p+"*",k,!1,!1,!1),l=new ha(p+" const*",k,!1,!0,!1);cd[a]={pointerType:f,bb:l};Ed(c,b);return[d,f,l]})},__embind_register_class_constructor:function(a,b,d,e,f,h){var c=Sc(b,d);f=Ea(e,f);Oa([],[a],function(a){a=a[0];var e="constructor "+a.name;void 0===a.i.P&&(a.i.P=[]);if(void 0!==a.i.P[b-1])throw new Aa("Cannot register multiple constructors with identical number of parameters ("+(b-1)+") for class '"+ | ||
186 | -a.name+"'! Overload resolution is currently only performed using the parameter count, not actual type info!");a.i.P[b-1]=function(){$b("Cannot construct "+a.name+" due to unbound types",c)};Oa([],c,function(c){a.i.P[b-1]=function(){arguments.length!==b-1&&A(e+" called with "+arguments.length+" arguments, expected "+(b-1));var a=[],d=Array(b);d[0]=h;for(var g=1;g<b;++g)d[g]=c[g].toWireType(a,arguments[g-1]);d=f.apply(null,d);Tc(a);return c[0].fromWireType(d)};return[]});return[]})},__embind_register_class_function:function(a, | ||
187 | -b,d,e,f,h,m,n){var c=Sc(d,e);b=T(b);h=Ea(f,h);Oa([],[a],function(a){function e(){$b("Cannot call "+f+" due to unbound types",c)}a=a[0];var f=a.name+"."+b;n&&a.i.nb.push(b);var g=a.i.V,k=g[b];void 0===k||void 0===k.H&&k.className!==a.name&&k.ia===d-2?(e.ia=d-2,e.className=a.name,g[b]=e):(Oc(g,b,f),g[b].H[d-2]=e);Oa([],c,function(c){var e=f,k=a,l=h,n=c.length;2>n&&A("argTypes array size mismatch! Must at least get return value and 'this' types!");for(var p=null!==c[1]&&null!==k,q=!1,k=1;k<c.length;++k)if(null!== | ||
188 | -c[k]&&void 0===c[k].I){q=!0;break}for(var u="void"!==c[0].name,r="",t="",k=0;k<n-2;++k)r+=(0!==k?", ":"")+"arg"+k,t+=(0!==k?", ":"")+"arg"+k+"Wired";e="return function "+Ub(e)+"("+r+") {\nif (arguments.length !== "+(n-2)+") {\nthrowBindingError('function "+e+" called with ' + arguments.length + ' arguments, expected "+(n-2)+" args!');\n}\n";q&&(e+="var destructors = [];\n");var w=q?"destructors":"null",r="throwBindingError invoker fn runDestructors retType classParam".split(" "),l=[A,l,m,Tc,c[0], | ||
189 | -c[1]];p&&(e+="var thisWired = classParam.toWireType("+w+", this);\n");for(k=0;k<n-2;++k)e+="var arg"+k+"Wired = argType"+k+".toWireType("+w+", arg"+k+"); // "+c[k+2].name+"\n",r.push("argType"+k),l.push(c[k+2]);p&&(t="thisWired"+(0<t.length?", ":"")+t);e+=(u?"var rv = ":"")+"invoker(fn"+(0<t.length?", ":"")+t+");\n";if(q)e+="runDestructors(destructors);\n";else for(k=p?1:2;k<c.length;++k)n=1===k?"thisWired":"arg"+(k-2)+"Wired",null!==c[k].I&&(e+=n+"_dtor("+n+"); // "+c[k].name+"\n",r.push(n+"_dtor"), | ||
190 | -l.push(c[k].I));u&&(e+="var ret = retType.fromWireType(rv);\nreturn ret;\n");r.push(e+"}\n");c=Hd(r).apply(null,l);void 0===g[b].H?(c.ia=d-2,g[b]=c):g[b].H[d-2]=c;return[]});return[]})},__embind_register_emval:function(a,b){b=T(b);ga(a,{name:b,fromWireType:function(a){var b=ba[a].value;4<a&&0===--ba[a].X&&(ba[a]=void 0,ac.push(a));return b},toWireType:function(a,b){return Pc(b)},argPackAdvance:8,readValueFromPointer:kb,I:null})},__embind_register_float:function(a,b,d){d=Tb(d);b=T(b);ga(a,{name:b, | ||
191 | -fromWireType:function(a){return a},toWireType:function(a,b){if("number"!==typeof b&&"boolean"!==typeof b)throw new TypeError('Cannot convert "'+Da(b)+'" to '+this.name);return b},argPackAdvance:8,readValueFromPointer:Id(b,d),I:null})},__embind_register_integer:function(a,b,d,e,f){function c(a){return a}b=T(b);-1===f&&(f=4294967295);var g=Tb(d);if(0===e)var k=32-8*d,c=function(a){return a<<k>>>k};var h=-1!=b.indexOf("unsigned");ga(a,{name:b,fromWireType:c,toWireType:function(a,c){if("number"!==typeof c&& | ||
192 | -"boolean"!==typeof c)throw new TypeError('Cannot convert "'+Da(c)+'" to '+this.name);if(c<e||c>f)throw new TypeError('Passing a number "'+Da(c)+'" from JS side to C/C++ side to an argument of type "'+b+'", which is outside the valid range ['+e+", "+f+"]!");return h?c>>>0:c|0},argPackAdvance:8,readValueFromPointer:Jd(b,g,0!==e),I:null})},__embind_register_memory_view:function(a,b,d){function c(a){a>>=2;var b=ea;return new f(b.buffer,b[a+1],b[a])}var f=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array, | ||
193 | -Uint32Array,Float32Array,Float64Array][b];d=T(d);ga(a,{name:d,fromWireType:c,argPackAdvance:8,readValueFromPointer:c},{ib:!0})},__embind_register_std_string:function(a,b){b=T(b);ga(a,{name:b,fromWireType:function(a){for(var b=ea[a>>2],c=Array(b),d=0;d<b;++d)c[d]=String.fromCharCode(I[a+4+d]);R(a);return c.join("")},toWireType:function(a,b){function c(a,b){return a[b]}function d(a,b){return a.charCodeAt(b)}b instanceof ArrayBuffer&&(b=new Uint8Array(b));var e;b instanceof Uint8Array?e=c:b instanceof | ||
194 | -Uint8ClampedArray?e=c:b instanceof Int8Array?e=c:"string"===typeof b?e=d:A("Cannot pass non-string to std::string");var f=b.length,g=da(4+f);ea[g>>2]=f;for(var h=0;h<f;++h){var m=e(b,h);255<m&&(R(g),A("String has UTF-16 code units that do not fit in 8 bits"));I[g+4+h]=m}null!==a&&a.push(R,g);return g},argPackAdvance:8,readValueFromPointer:kb,I:function(a){R(a)}})},__embind_register_std_wstring:function(a,b,d){d=T(d);if(2===b)var c=function(){return Gb},f=1;else 4===b&&(c=function(){return ea},f=2); | ||
195 | -ga(a,{name:d,fromWireType:function(a){for(var b=c(),d=ea[a>>2],e=Array(d),g=a+4>>f,h=0;h<d;++h)e[h]=String.fromCharCode(b[g+h]);R(a);return e.join("")},toWireType:function(a,d){var e=c(),g=d.length,h=da(4+g*b);ea[h>>2]=g;for(var k=h+4>>f,l=0;l<g;++l)e[k+l]=d.charCodeAt(l);null!==a&&a.push(R,h);return h},argPackAdvance:8,readValueFromPointer:kb,I:function(a){R(a)}})},__embind_register_void:function(a,b){b=T(b);ga(a,{Ad:!0,name:b,argPackAdvance:0,fromWireType:function(){},toWireType:function(){}})}, | ||
196 | -_abort:function(){b.abort()},_asctime:function(a){var b=p[a>>2],d=p[a+4>>2],e=p[a+8>>2],f=p[a+12>>2];Z("Sun Mon Tue Wed Thu Fri Sat".split(" ")[p[a+24>>2]]+" "+"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" ")[p[a+16>>2]]+(10>f?" ":" ")+f+(10>e?" 0":" ")+e+(10>d?":0":":")+d+(10>b?":0":":")+b+" "+(1900+p[a+20>>2])+"\n",I,dd,26);return dd},_clock:mb,_emscripten_memcpy_big:function(a,b,d){I.set(I.subarray(b,b+d),a);return a},_emscripten_run_script_string:Y,_getenv:Ta,_llvm_eh_typeid_for:function(a){return a}, | ||
197 | -_llvm_exp2_f64:function(){return Md.apply(null,arguments)},_llvm_trap:function(){E("trap!")},_localtime:function(a){Uc();a=new Date(1E3*p[a>>2]);p[V>>2]=a.getSeconds();p[V+4>>2]=a.getMinutes();p[V+8>>2]=a.getHours();p[V+12>>2]=a.getDate();p[V+16>>2]=a.getMonth();p[V+20>>2]=a.getFullYear()-1900;p[V+24>>2]=a.getDay();var b=new Date(a.getFullYear(),0,1);p[V+28>>2]=(a.getTime()-b.getTime())/864E5|0;p[V+36>>2]=-(60*a.getTimezoneOffset());var d=(new Date(2E3,6,1)).getTimezoneOffset(),b=b.getTimezoneOffset(); | ||
198 | -a=(d!=b&&a.getTimezoneOffset()==Math.min(b,d))|0;p[V+32>>2]=a;p[V+40>>2]=p[Sa+(a?4:0)>>2];return V},_mktime:function(a){Uc();var b=new Date(p[a+20>>2]+1900,p[a+16>>2],p[a+12>>2],p[a+8>>2],p[a+4>>2],p[a>>2],0),d=p[a+32>>2],e=b.getTimezoneOffset(),f=new Date(b.getFullYear(),0,1),h=(new Date(2E3,6,1)).getTimezoneOffset(),m=f.getTimezoneOffset(),n=Math.min(m,h);0>d?p[a+32>>2]=Number(h!=m&&n==e):0<d!=(n==e)&&(h=Math.max(m,h),b.setTime(b.getTime()+6E4*((0<d?n:h)-e)));p[a+24>>2]=b.getDay();p[a+28>>2]=(b.getTime()- | ||
199 | -f.getTime())/864E5|0;return b.getTime()/1E3|0},_nanosleep:function(a,b){var c=p[a>>2];a=p[a+4>>2];0!==b&&(p[b>>2]=0,p[b+4>>2]=0);return Wc(1E6*c+a/1E3)},_pthread_cond_wait:function(){return 0},_pthread_detach:function(){},_pthread_getspecific:function(a){return wb[a]||0},_pthread_key_create:function(a){if(0==a)return m.m;p[a>>2]=oc;wb[oc]=0;oc++;return 0},_pthread_mutex_destroy:function(){},_pthread_mutex_init:function(){},_pthread_mutexattr_destroy:function(){},_pthread_mutexattr_init:function(){}, | ||
200 | -_pthread_mutexattr_settype:function(){},_pthread_once:Ua,_pthread_setspecific:function(a,b){if(!(a in wb))return m.m;wb[a]=b;return 0},_pthread_spin_destroy:function(){return 0},_pthread_spin_init:function(){return 0},_pthread_spin_lock:function(){return 0},_pthread_spin_unlock:function(){return 0},_sem_close:function(){b.printErr("missing function: sem_close");E(-1)},_sem_destroy:function(){},_sem_open:function(){b.printErr("missing function: sem_open");E(-1)},_sem_post:function(){},_sem_trywait:function(){}, | ||
201 | -_sem_unlink:function(){b.printErr("missing function: sem_unlink");E(-1)},_strftime:Xc,_strftime_l:function(a,b,d,e){return Xc(a,b,d,e)},_time:function(a){var b=Date.now()/1E3|0;a&&(p[a>>2]=b);return b},_usleep:Wc,DYNAMICTOP_PTR:aa,STACKTOP:tb};var kd=b.asm(b.$a,b.ab,L);b.asm=kd;var Pd=b.__GLOBAL__I_000101=function(){return b.asm.__GLOBAL__I_000101.apply(null,arguments)},Ke=b.__GLOBAL__sub_I_AztecReader_cpp=function(){return b.asm.__GLOBAL__sub_I_AztecReader_cpp.apply(null,arguments)},Qe=b.__GLOBAL__sub_I_BarcodeLocationOnSite_cpp= | ||
202 | -function(){return b.asm.__GLOBAL__sub_I_BarcodeLocationOnSite_cpp.apply(null,arguments)},$e=b.__GLOBAL__sub_I_BarcodeLocation_cpp=function(){return b.asm.__GLOBAL__sub_I_BarcodeLocation_cpp.apply(null,arguments)},Rd=b.__GLOBAL__sub_I_BarcodeReaderCore_cpp=function(){return b.asm.__GLOBAL__sub_I_BarcodeReaderCore_cpp.apply(null,arguments)},Td=b.__GLOBAL__sub_I_BarcodeReaderInner_cpp=function(){return b.asm.__GLOBAL__sub_I_BarcodeReaderInner_cpp.apply(null,arguments)},af=b.__GLOBAL__sub_I_CharacterSetECI_cpp= | ||
203 | -function(){return b.asm.__GLOBAL__sub_I_CharacterSetECI_cpp.apply(null,arguments)},Ge=b.__GLOBAL__sub_I_CodaBarReader_cpp=function(){return b.asm.__GLOBAL__sub_I_CodaBarReader_cpp.apply(null,arguments)},Fe=b.__GLOBAL__sub_I_Code128Reader_cpp=function(){return b.asm.__GLOBAL__sub_I_Code128Reader_cpp.apply(null,arguments)},Ee=b.__GLOBAL__sub_I_Code39Reader_cpp=function(){return b.asm.__GLOBAL__sub_I_Code39Reader_cpp.apply(null,arguments)},De=b.__GLOBAL__sub_I_Code93Reader_cpp=function(){return b.asm.__GLOBAL__sub_I_Code93Reader_cpp.apply(null, | ||
204 | -arguments)},ee=b.__GLOBAL__sub_I_Common_cpp=function(){return b.asm.__GLOBAL__sub_I_Common_cpp.apply(null,arguments)},Pe=b.__GLOBAL__sub_I_CropImage_cpp=function(){return b.asm.__GLOBAL__sub_I_CropImage_cpp.apply(null,arguments)},Sd=b.__GLOBAL__sub_I_DMBarcodeDecoder_cpp=function(){return b.asm.__GLOBAL__sub_I_DMBarcodeDecoder_cpp.apply(null,arguments)},Wd=b.__GLOBAL__sub_I_DMFindlineByContours_cpp=function(){return b.asm.__GLOBAL__sub_I_DMFindlineByContours_cpp.apply(null,arguments)},Xd=b.__GLOBAL__sub_I_DMFindline_cpp= | ||
205 | -function(){return b.asm.__GLOBAL__sub_I_DMFindline_cpp.apply(null,arguments)},de=b.__GLOBAL__sub_I_DMLicenseInfo_cpp=function(){return b.asm.__GLOBAL__sub_I_DMLicenseInfo_cpp.apply(null,arguments)},se=b.__GLOBAL__sub_I_DMLog_cpp=function(){return b.asm.__GLOBAL__sub_I_DMLog_cpp.apply(null,arguments)},Ye=b.__GLOBAL__sub_I_DMVersion_cpp=function(){return b.asm.__GLOBAL__sub_I_DMVersion_cpp.apply(null,arguments)},Se=b.__GLOBAL__sub_I_DataMask_cpp=function(){return b.asm.__GLOBAL__sub_I_DataMask_cpp.apply(null, | ||
206 | -arguments)},Ze=b.__GLOBAL__sub_I_DataMatrixReader_cpp=function(){return b.asm.__GLOBAL__sub_I_DataMatrixReader_cpp.apply(null,arguments)},Je=b.__GLOBAL__sub_I_Deblur_cpp=function(){return b.asm.__GLOBAL__sub_I_Deblur_cpp.apply(null,arguments)},Vd=b.__GLOBAL__sub_I_DecodeInner_cpp=function(){return b.asm.__GLOBAL__sub_I_DecodeInner_cpp.apply(null,arguments)},ke=b.__GLOBAL__sub_I_DynamsoftBarcodeReader_wasm_cpp=function(){return b.asm.__GLOBAL__sub_I_DynamsoftBarcodeReader_wasm_cpp.apply(null,arguments)}, | ||
207 | -Ce=b.__GLOBAL__sub_I_EAN13Reader_cpp=function(){return b.asm.__GLOBAL__sub_I_EAN13Reader_cpp.apply(null,arguments)},Be=b.__GLOBAL__sub_I_EAN8Reader_cpp=function(){return b.asm.__GLOBAL__sub_I_EAN8Reader_cpp.apply(null,arguments)},ye=b.__GLOBAL__sub_I_ErrorCorrectionLevel_cpp=function(){return b.asm.__GLOBAL__sub_I_ErrorCorrectionLevel_cpp.apply(null,arguments)},Oe=b.__GLOBAL__sub_I_FindBound_cpp=function(){return b.asm.__GLOBAL__sub_I_FindBound_cpp.apply(null,arguments)},Ne=b.__GLOBAL__sub_I_Fluctuation_cpp= | ||
208 | -function(){return b.asm.__GLOBAL__sub_I_Fluctuation_cpp.apply(null,arguments)},ce=b.__GLOBAL__sub_I_FormatParameters_cpp=function(){return b.asm.__GLOBAL__sub_I_FormatParameters_cpp.apply(null,arguments)},Re=b.__GLOBAL__sub_I_GenericGF_cpp=function(){return b.asm.__GLOBAL__sub_I_GenericGF_cpp.apply(null,arguments)},be=b.__GLOBAL__sub_I_GlobalParameters_cpp=function(){return b.asm.__GLOBAL__sub_I_GlobalParameters_cpp.apply(null,arguments)},Ae=b.__GLOBAL__sub_I_ITFReader_cpp=function(){return b.asm.__GLOBAL__sub_I_ITFReader_cpp.apply(null, | ||
209 | -arguments)},ae=b.__GLOBAL__sub_I_ImageParameters_cpp=function(){return b.asm.__GLOBAL__sub_I_ImageParameters_cpp.apply(null,arguments)},Ie=b.__GLOBAL__sub_I_Industry2of5Reader_cpp=function(){return b.asm.__GLOBAL__sub_I_Industry2of5Reader_cpp.apply(null,arguments)},qe=b.__GLOBAL__sub_I_JsonParser_cpp=function(){return b.asm.__GLOBAL__sub_I_JsonParser_cpp.apply(null,arguments)},Qd=b.__GLOBAL__sub_I_JsonReader_cpp=function(){return b.asm.__GLOBAL__sub_I_JsonReader_cpp.apply(null,arguments)},Me=b.__GLOBAL__sub_I_LineStatistics_cpp= | ||
210 | -function(){return b.asm.__GLOBAL__sub_I_LineStatistics_cpp.apply(null,arguments)},$d=b.__GLOBAL__sub_I_LogParamUtil_cpp=function(){return b.asm.__GLOBAL__sub_I_LogParamUtil_cpp.apply(null,arguments)},ge=b.__GLOBAL__sub_I_Mode_cpp=function(){return b.asm.__GLOBAL__sub_I_Mode_cpp.apply(null,arguments)},Ue=b.__GLOBAL__sub_I_ModulusGF_cpp=function(){return b.asm.__GLOBAL__sub_I_ModulusGF_cpp.apply(null,arguments)},hf=b.__GLOBAL__sub_I_MultiFormatOneDReader_cpp=function(){return b.asm.__GLOBAL__sub_I_MultiFormatOneDReader_cpp.apply(null, | ||
211 | -arguments)},Ud=b.__GLOBAL__sub_I_MultiFormatReader_cpp=function(){return b.asm.__GLOBAL__sub_I_MultiFormatReader_cpp.apply(null,arguments)},gf=b.__GLOBAL__sub_I_MultiFormatUPCEANReader_cpp=function(){return b.asm.__GLOBAL__sub_I_MultiFormatUPCEANReader_cpp.apply(null,arguments)},ff=b.__GLOBAL__sub_I_OneDReader_cpp=function(){return b.asm.__GLOBAL__sub_I_OneDReader_cpp.apply(null,arguments)},xe=b.__GLOBAL__sub_I_OneD_StandardLization_cpp=function(){return b.asm.__GLOBAL__sub_I_OneD_StandardLization_cpp.apply(null, | ||
212 | -arguments)},We=b.__GLOBAL__sub_I_PDF417CodewordDecoder_cpp=function(){return b.asm.__GLOBAL__sub_I_PDF417CodewordDecoder_cpp.apply(null,arguments)},Ve=b.__GLOBAL__sub_I_PDF417DecodedBitStreamParser_cpp=function(){return b.asm.__GLOBAL__sub_I_PDF417DecodedBitStreamParser_cpp.apply(null,arguments)},Xe=b.__GLOBAL__sub_I_PDF417Reader_cpp=function(){return b.asm.__GLOBAL__sub_I_PDF417Reader_cpp.apply(null,arguments)},He=b.__GLOBAL__sub_I_PDF417_Deblur_cpp=function(){return b.asm.__GLOBAL__sub_I_PDF417_Deblur_cpp.apply(null, | ||
213 | -arguments)},we=b.__GLOBAL__sub_I_PDF417_standardLization_cpp=function(){return b.asm.__GLOBAL__sub_I_PDF417_standardLization_cpp.apply(null,arguments)},Zd=b.__GLOBAL__sub_I_ParameterPool_cpp=function(){return b.asm.__GLOBAL__sub_I_ParameterPool_cpp.apply(null,arguments)},Le=b.__GLOBAL__sub_I_QRBarcodeLocation_cpp=function(){return b.asm.__GLOBAL__sub_I_QRBarcodeLocation_cpp.apply(null,arguments)},Te=b.__GLOBAL__sub_I_QRCodeReader_cpp=function(){return b.asm.__GLOBAL__sub_I_QRCodeReader_cpp.apply(null, | ||
214 | -arguments)},fe=b.__GLOBAL__sub_I_QRVersion_cpp=function(){return b.asm.__GLOBAL__sub_I_QRVersion_cpp.apply(null,arguments)},ve=b.__GLOBAL__sub_I_QR_StandardLization_cpp=function(){return b.asm.__GLOBAL__sub_I_QR_StandardLization_cpp.apply(null,arguments)},bf=b.__GLOBAL__sub_I_Reader_cpp=function(){return b.asm.__GLOBAL__sub_I_Reader_cpp.apply(null,arguments)},Yd=b.__GLOBAL__sub_I_RegionDefinition_cpp=function(){return b.asm.__GLOBAL__sub_I_RegionDefinition_cpp.apply(null,arguments)},ze=b.__GLOBAL__sub_I_RestoreColor_cpp= | ||
215 | -function(){return b.asm.__GLOBAL__sub_I_RestoreColor_cpp.apply(null,arguments)},ue=b.__GLOBAL__sub_I_TextFilter_cpp=function(){return b.asm.__GLOBAL__sub_I_TextFilter_cpp.apply(null,arguments)},ef=b.__GLOBAL__sub_I_UPCAReader_cpp=function(){return b.asm.__GLOBAL__sub_I_UPCAReader_cpp.apply(null,arguments)},df=b.__GLOBAL__sub_I_UPCEANReader_cpp=function(){return b.asm.__GLOBAL__sub_I_UPCEANReader_cpp.apply(null,arguments)},cf=b.__GLOBAL__sub_I_UPCEReader_cpp=function(){return b.asm.__GLOBAL__sub_I_UPCEReader_cpp.apply(null, | ||
216 | -arguments)},je=b.__GLOBAL__sub_I_bind_cpp=function(){return b.asm.__GLOBAL__sub_I_bind_cpp.apply(null,arguments)},oe=b.__GLOBAL__sub_I_clahe_cpp=function(){return b.asm.__GLOBAL__sub_I_clahe_cpp.apply(null,arguments)},re=b.__GLOBAL__sub_I_dsGlobalMem_cpp=function(){return b.asm.__GLOBAL__sub_I_dsGlobalMem_cpp.apply(null,arguments)},ne=b.__GLOBAL__sub_I_generalized_hough_cpp=function(){return b.asm.__GLOBAL__sub_I_generalized_hough_cpp.apply(null,arguments)},me=b.__GLOBAL__sub_I_histogram_cpp=function(){return b.asm.__GLOBAL__sub_I_histogram_cpp.apply(null, | ||
217 | -arguments)},le=b.__GLOBAL__sub_I_imgwarp_cpp=function(){return b.asm.__GLOBAL__sub_I_imgwarp_cpp.apply(null,arguments)},ie=b.__GLOBAL__sub_I_iostream_cpp=function(){return b.asm.__GLOBAL__sub_I_iostream_cpp.apply(null,arguments)},te=b.__GLOBAL__sub_I_json_value_cpp=function(){return b.asm.__GLOBAL__sub_I_json_value_cpp.apply(null,arguments)},he=b.__GLOBAL__sub_I_persistence_cpp=function(){return b.asm.__GLOBAL__sub_I_persistence_cpp.apply(null,arguments)},pe=b.__GLOBAL__sub_I_system_cpp=function(){return b.asm.__GLOBAL__sub_I_system_cpp.apply(null, | ||
218 | -arguments)};b.___cxa_can_catch=function(){return b.asm.___cxa_can_catch.apply(null,arguments)};b.___cxa_is_pointer_type=function(){return b.asm.___cxa_is_pointer_type.apply(null,arguments)};b.___errno_location=function(){return b.asm.___errno_location.apply(null,arguments)};var Gd=b.___getTypeName=function(){return b.asm.___getTypeName.apply(null,arguments)},Od=b._emscripten_replace_memory=function(){return b.asm._emscripten_replace_memory.apply(null,arguments)},R=b._free=function(){return b.asm._free.apply(null, | ||
219 | -arguments)},da=b._malloc=function(){return b.asm._malloc.apply(null,arguments)},ab=b.setTempRet0=function(){return b.asm.setTempRet0.apply(null,arguments)};b.setThrew=function(){return b.asm.setThrew.apply(null,arguments)};var ld=b.stackAlloc=function(){return b.asm.stackAlloc.apply(null,arguments)};b.dynCall_di=function(){return b.asm.dynCall_di.apply(null,arguments)};b.dynCall_dii=function(){return b.asm.dynCall_dii.apply(null,arguments)};b.dynCall_diiid=function(){return b.asm.dynCall_diiid.apply(null, | ||
220 | -arguments)};b.dynCall_diiii=function(){return b.asm.dynCall_diiii.apply(null,arguments)};b.dynCall_fi=function(){return b.asm.dynCall_fi.apply(null,arguments)};b.dynCall_fii=function(){return b.asm.dynCall_fii.apply(null,arguments)};b.dynCall_fiifffi=function(){return b.asm.dynCall_fiifffi.apply(null,arguments)};b.dynCall_fiii=function(){return b.asm.dynCall_fiii.apply(null,arguments)};b.dynCall_i=function(){return b.asm.dynCall_i.apply(null,arguments)};b.dynCall_idd=function(){return b.asm.dynCall_idd.apply(null, | ||
221 | -arguments)};b.dynCall_ii=function(){return b.asm.dynCall_ii.apply(null,arguments)};b.dynCall_iid=function(){return b.asm.dynCall_iid.apply(null,arguments)};b.dynCall_iififi=function(){return b.asm.dynCall_iififi.apply(null,arguments)};b.dynCall_iii=function(){return b.asm.dynCall_iii.apply(null,arguments)};b.dynCall_iiifii=function(){return b.asm.dynCall_iiifii.apply(null,arguments)};b.dynCall_iiifiiiiiii=function(){return b.asm.dynCall_iiifiiiiiii.apply(null,arguments)};b.dynCall_iiii=function(){return b.asm.dynCall_iiii.apply(null, | ||
222 | -arguments)};b.dynCall_iiiidi=function(){return b.asm.dynCall_iiiidi.apply(null,arguments)};b.dynCall_iiiii=function(){return b.asm.dynCall_iiiii.apply(null,arguments)};b.dynCall_iiiiid=function(){return b.asm.dynCall_iiiiid.apply(null,arguments)};b.dynCall_iiiiifi=function(){return b.asm.dynCall_iiiiifi.apply(null,arguments)};b.dynCall_iiiiii=function(){return b.asm.dynCall_iiiiii.apply(null,arguments)};b.dynCall_iiiiiid=function(){return b.asm.dynCall_iiiiiid.apply(null,arguments)};b.dynCall_iiiiiii= | ||
223 | -function(){return b.asm.dynCall_iiiiiii.apply(null,arguments)};b.dynCall_iiiiiiii=function(){return b.asm.dynCall_iiiiiiii.apply(null,arguments)};b.dynCall_iiiiiiiif=function(){return b.asm.dynCall_iiiiiiiif.apply(null,arguments)};b.dynCall_iiiiiiiii=function(){return b.asm.dynCall_iiiiiiiii.apply(null,arguments)};b.dynCall_iiiiiiiiii=function(){return b.asm.dynCall_iiiiiiiiii.apply(null,arguments)};b.dynCall_iiiiiiiiiiii=function(){return b.asm.dynCall_iiiiiiiiiiii.apply(null,arguments)};b.dynCall_iiiiiiiiiiiiiiii= | ||
224 | -function(){return b.asm.dynCall_iiiiiiiiiiiiiiii.apply(null,arguments)};b.dynCall_iiiiiiiiiiiiiiiiii=function(){return b.asm.dynCall_iiiiiiiiiiiiiiiiii.apply(null,arguments)};b.dynCall_iiiiij=function(){return b.asm.dynCall_iiiiij.apply(null,arguments)};b.dynCall_ji=function(){return b.asm.dynCall_ji.apply(null,arguments)};b.dynCall_v=function(){return b.asm.dynCall_v.apply(null,arguments)};b.dynCall_vi=function(){return b.asm.dynCall_vi.apply(null,arguments)};b.dynCall_vid=function(){return b.asm.dynCall_vid.apply(null, | ||
225 | -arguments)};b.dynCall_vidii=function(){return b.asm.dynCall_vidii.apply(null,arguments)};b.dynCall_vif=function(){return b.asm.dynCall_vif.apply(null,arguments)};b.dynCall_viffffffff=function(){return b.asm.dynCall_viffffffff.apply(null,arguments)};b.dynCall_viffffffffffffffff=function(){return b.asm.dynCall_viffffffffffffffff.apply(null,arguments)};b.dynCall_vii=function(){return b.asm.dynCall_vii.apply(null,arguments)};b.dynCall_viid=function(){return b.asm.dynCall_viid.apply(null,arguments)};b.dynCall_viiddi= | ||
226 | -function(){return b.asm.dynCall_viiddi.apply(null,arguments)};b.dynCall_viidi=function(){return b.asm.dynCall_viidi.apply(null,arguments)};b.dynCall_viididii=function(){return b.asm.dynCall_viididii.apply(null,arguments)};b.dynCall_viif=function(){return b.asm.dynCall_viif.apply(null,arguments)};b.dynCall_viiffff=function(){return b.asm.dynCall_viiffff.apply(null,arguments)};b.dynCall_viiffi=function(){return b.asm.dynCall_viiffi.apply(null,arguments)};b.dynCall_viifi=function(){return b.asm.dynCall_viifi.apply(null, | ||
227 | -arguments)};b.dynCall_viifii=function(){return b.asm.dynCall_viifii.apply(null,arguments)};b.dynCall_viifiif=function(){return b.asm.dynCall_viifiif.apply(null,arguments)};b.dynCall_viii=function(){return b.asm.dynCall_viii.apply(null,arguments)};b.dynCall_viiid=function(){return b.asm.dynCall_viiid.apply(null,arguments)};b.dynCall_viiidd=function(){return b.asm.dynCall_viiidd.apply(null,arguments)};b.dynCall_viiiddi=function(){return b.asm.dynCall_viiiddi.apply(null,arguments)};b.dynCall_viiidi= | ||
228 | -function(){return b.asm.dynCall_viiidi.apply(null,arguments)};b.dynCall_viiidii=function(){return b.asm.dynCall_viiidii.apply(null,arguments)};b.dynCall_viiif=function(){return b.asm.dynCall_viiif.apply(null,arguments)};b.dynCall_viiifiii=function(){return b.asm.dynCall_viiifiii.apply(null,arguments)};b.dynCall_viiii=function(){return b.asm.dynCall_viiii.apply(null,arguments)};b.dynCall_viiiid=function(){return b.asm.dynCall_viiiid.apply(null,arguments)};b.dynCall_viiiidi=function(){return b.asm.dynCall_viiiidi.apply(null, | ||
229 | -arguments)};b.dynCall_viiiidiii=function(){return b.asm.dynCall_viiiidiii.apply(null,arguments)};b.dynCall_viiiii=function(){return b.asm.dynCall_viiiii.apply(null,arguments)};b.dynCall_viiiiidi=function(){return b.asm.dynCall_viiiiidi.apply(null,arguments)};b.dynCall_viiiiifi=function(){return b.asm.dynCall_viiiiifi.apply(null,arguments)};b.dynCall_viiiiii=function(){return b.asm.dynCall_viiiiii.apply(null,arguments)};b.dynCall_viiiiiiddi=function(){return b.asm.dynCall_viiiiiiddi.apply(null,arguments)}; | ||
230 | -b.dynCall_viiiiiidi=function(){return b.asm.dynCall_viiiiiidi.apply(null,arguments)};b.dynCall_viiiiiii=function(){return b.asm.dynCall_viiiiiii.apply(null,arguments)};b.dynCall_viiiiiiiddi=function(){return b.asm.dynCall_viiiiiiiddi.apply(null,arguments)};b.dynCall_viiiiiiii=function(){return b.asm.dynCall_viiiiiiii.apply(null,arguments)};b.dynCall_viiiiiiiifi=function(){return b.asm.dynCall_viiiiiiiifi.apply(null,arguments)};b.dynCall_viiiiiiiii=function(){return b.asm.dynCall_viiiiiiiii.apply(null, | ||
231 | -arguments)};b.dynCall_viiiiiiiiii=function(){return b.asm.dynCall_viiiiiiiiii.apply(null,arguments)};b.dynCall_viiiiiiiiiiddi=function(){return b.asm.dynCall_viiiiiiiiiiddi.apply(null,arguments)};b.dynCall_viiiiiiiiiii=function(){return b.asm.dynCall_viiiiiiiiiii.apply(null,arguments)};b.dynCall_viiiiiiiiiiii=function(){return b.asm.dynCall_viiiiiiiiiiii.apply(null,arguments)};b.dynCall_viiiiiiiiiiiii=function(){return b.asm.dynCall_viiiiiiiiiiiii.apply(null,arguments)};b.dynCall_viiiiiiiiiiiiiii= | ||
232 | -function(){return b.asm.dynCall_viiiiiiiiiiiiiii.apply(null,arguments)};b.dynCall_viiiiiiiiiiiiiiii=function(){return b.asm.dynCall_viiiiiiiiiiiiiiii.apply(null,arguments)};b.dynCall_viijii=function(){return b.asm.dynCall_viijii.apply(null,arguments)};b.dynCall_vij=function(){return b.asm.dynCall_vij.apply(null,arguments)};b.asm=kd;Va.prototype=Error();Va.prototype.constructor=Va;Ya=function c(){b.calledRun||dc();b.calledRun||(Ya=c)};b.run=dc;b.exit=function(c,d){if(!d||!b.noExitRuntime||0!==c){if(!b.noExitRuntime&& | ||
233 | -(Wa=!0,tb=void 0,Ia(mc),b.onExit))b.onExit(c);ia&&process.exit(c);b.quit(c,new Va(c))}};b.abort=E;if(b.preInit)for("function"==typeof b.preInit&&(b.preInit=[b.preInit]);0<b.preInit.length;)b.preInit.pop()();b.noExitRuntime=!0;dc()})).then(function(){d._loadWasmStatus="loaded";d._loadWasmTaskQueue.next();f()})["catch"](function(f){d._loadWasmStatus=f;d._loadWasmTaskQueue.next();t(f)})},null,["loading"==d._loadWasmStatus])})}; | ||
234 | -dynamsoft.dbrEnv.bAutoLoadWasm=dynamsoft.dbrEnv.bAutoLoadWasm||void 0===dynamsoft.dbrEnv.bAutoLoadWasm?!0:!1; | ||
235 | -dynamsoft.dbrEnv.bAutoLoadWasm&&!dynamsoft.BarcodeReader._BarcodeReaderWasm&&(dynamsoft.BarcodeReader._BarcodeReaderWasm=function(){throw Error("'Constructor BarcodeReader(licenseKey)': The wasm hasn't finish loading.");},dynamsoft.BarcodeReader.loadWasm().then(function(){dynamsoft.dbrEnv.onAutoLoadWasmSuccess&&setTimeout(dynamsoft.dbrEnv.onAutoLoadWasmSuccess)},function(f){dynamsoft.dbrEnv.onAutoLoadWasmError&&setTimeout(function(){dynamsoft.dbrEnv.onAutoLoadWasmError(f)},0)})); |
app-ht/web/exts/baidumap/MarkerClusterer.js
@@ -1 +0,0 @@ | @@ -1 +0,0 @@ | ||
1 | -var BMapLib=window.BMapLib=BMapLib||{};!function(){function Cluster(markerClusterer){this._markerClusterer=markerClusterer,this._map=markerClusterer.getMap(),this._minClusterSize=markerClusterer.getMinClusterSize(),this._isAverageCenter=markerClusterer.isAverageCenter(),this._center=null,this._markers=[],this._gridBounds=null,this._isReal=!1,this._clusterMarker=new BMapLib.TextIconOverlay(this._center,this._markers.length,{styles:this._markerClusterer.getStyles()})}var getExtendedBounds=function(map,bounds,gridSize){bounds=cutBoundsInRange(bounds);var pixelNE=map.pointToPixel(bounds.getNorthEast()),pixelSW=map.pointToPixel(bounds.getSouthWest());pixelNE.x+=gridSize,pixelNE.y-=gridSize,pixelSW.x-=gridSize,pixelSW.y+=gridSize;var newNE=map.pixelToPoint(pixelNE),newSW=map.pixelToPoint(pixelSW);return new BMap.Bounds(newSW,newNE)},cutBoundsInRange=function(bounds){var maxX=getRange(bounds.getNorthEast().lng,-180,180),minX=getRange(bounds.getSouthWest().lng,-180,180),maxY=getRange(bounds.getNorthEast().lat,-74,74),minY=getRange(bounds.getSouthWest().lat,-74,74);return new BMap.Bounds(new BMap.Point(minX,minY),new BMap.Point(maxX,maxY))},getRange=function(i,mix,max){return mix&&(i=Math.max(i,mix)),max&&(i=Math.min(i,max)),i},isArray=function(source){return"[object Array]"===Object.prototype.toString.call(source)},indexOf=function(item,source){var index=-1;if(isArray(source))if(source.indexOf)index=source.indexOf(item);else for(var m,i=0;m=source[i];i++)if(m===item){index=i;break}return index},MarkerClusterer=BMapLib.MarkerClusterer=function(map,options){if(map){this._map=map,this._markers=[],this._clusters=[];var opts=options||{};this._gridSize=opts.gridSize||60,this._maxZoom=opts.maxZoom||18,this._minClusterSize=opts.minClusterSize||2,this._isAverageCenter=!1,void 0!=opts.isAverageCenter&&(this._isAverageCenter=opts.isAverageCenter),this._styles=opts.styles||[];var that=this;this._map.addEventListener("zoomend",function(){that._redraw()}),this._map.addEventListener("moveend",function(){that._redraw()});var mkrs=opts.markers;isArray(mkrs)&&this.addMarkers(mkrs)}};MarkerClusterer.prototype.addMarkers=function(markers){for(var i=0,len=markers.length;i<len;i++)this._pushMarkerTo(markers[i]);this._createClusters()},MarkerClusterer.prototype._pushMarkerTo=function(marker){var index=indexOf(marker,this._markers);index===-1&&(marker.isInCluster=!1,this._markers.push(marker))},MarkerClusterer.prototype.addMarker=function(marker){this._pushMarkerTo(marker),this._createClusters()},MarkerClusterer.prototype._createClusters=function(){for(var marker,mapBounds=this._map.getBounds(),extendedBounds=getExtendedBounds(this._map,mapBounds,this._gridSize),i=0;marker=this._markers[i];i++)!marker.isInCluster&&extendedBounds.containsPoint(marker.getPosition())&&this._addToClosestCluster(marker);for(var len=this._markers.length,i=0;i<len;i++)this._clusters[i]&&this._clusters[i].render()},MarkerClusterer.prototype._addToClosestCluster=function(marker){for(var cluster,distance=4e6,clusterToAddTo=null,i=(marker.getPosition(),0);cluster=this._clusters[i];i++){var center=cluster.getCenter();if(center){var d=this._map.getDistance(center,marker.getPosition());d<distance&&(distance=d,clusterToAddTo=cluster)}}if(clusterToAddTo&&clusterToAddTo.isMarkerInClusterBounds(marker))clusterToAddTo.addMarker(marker);else{var cluster=new Cluster(this);cluster.addMarker(marker),this._clusters.push(cluster)}},MarkerClusterer.prototype._clearLastClusters=function(){for(var cluster,i=0;cluster=this._clusters[i];i++)cluster.remove();this._clusters=[],this._removeMarkersFromCluster()},MarkerClusterer.prototype._removeMarkersFromCluster=function(){for(var marker,i=0;marker=this._markers[i];i++)marker.isInCluster=!1},MarkerClusterer.prototype._removeMarkersFromMap=function(){for(var marker,i=0;marker=this._markers[i];i++)marker.isInCluster=!1,this._map.removeOverlay(marker)},MarkerClusterer.prototype._removeMarker=function(marker){var index=indexOf(marker,this._markers);return index!==-1&&(this._map.removeOverlay(marker),this._markers.splice(index,1),!0)},MarkerClusterer.prototype.removeMarker=function(marker){var success=this._removeMarker(marker);return success&&(this._clearLastClusters(),this._createClusters()),success},MarkerClusterer.prototype.removeMarkers=function(markers){for(var success=!1,i=0;i<markers.length;i++){var r=this._removeMarker(markers[i]);success=success||r}return success&&(this._clearLastClusters(),this._createClusters()),success},MarkerClusterer.prototype.clearMarkers=function(){this._clearLastClusters(),this._removeMarkersFromMap(),this._markers=[]},MarkerClusterer.prototype._redraw=function(){this._clearLastClusters(),this._createClusters()},MarkerClusterer.prototype.getGridSize=function(){return this._gridSize},MarkerClusterer.prototype.setGridSize=function(size){this._gridSize=size,this._redraw()},MarkerClusterer.prototype.getMaxZoom=function(){return this._maxZoom},MarkerClusterer.prototype.setMaxZoom=function(maxZoom){this._maxZoom=maxZoom,this._redraw()},MarkerClusterer.prototype.getStyles=function(){return this._styles},MarkerClusterer.prototype.setStyles=function(styles){this._styles=styles,this._redraw()},MarkerClusterer.prototype.getMinClusterSize=function(){return this._minClusterSize},MarkerClusterer.prototype.setMinClusterSize=function(size){this._minClusterSize=size,this._redraw()},MarkerClusterer.prototype.isAverageCenter=function(){return this._isAverageCenter},MarkerClusterer.prototype.getMap=function(){return this._map},MarkerClusterer.prototype.getMarkers=function(){return this._markers},MarkerClusterer.prototype.getClustersCount=function(){for(var cluster,count=0,i=0;cluster=this._clusters[i];i++)cluster.isReal()&&count++;return count},Cluster.prototype.addMarker=function(marker){if(this.isMarkerInCluster(marker))return!1;if(this._center){if(this._isAverageCenter){var l=this._markers.length+1,lat=(this._center.lat*(l-1)+marker.getPosition().lat)/l,lng=(this._center.lng*(l-1)+marker.getPosition().lng)/l;this._center=new BMap.Point(lng,lat),this.updateGridBounds()}}else this._center=marker.getPosition(),this.updateGridBounds();marker.isInCluster=!0,this._markers.push(marker)},Cluster.prototype.render=function(){var len=this._markers.length;if(len<this._minClusterSize)for(var i=0;i<len;i++)this._map.addOverlay(this._markers[i]);else this._map.addOverlay(this._clusterMarker),this._isReal=!0,this.updateClusterMarker()},Cluster.prototype.isMarkerInCluster=function(marker){if(this._markers.indexOf)return this._markers.indexOf(marker)!=-1;for(var m,i=0;m=this._markers[i];i++)if(m===marker)return!0;return!1},Cluster.prototype.isMarkerInClusterBounds=function(marker){return this._gridBounds.containsPoint(marker.getPosition())},Cluster.prototype.isReal=function(marker){return this._isReal},Cluster.prototype.updateGridBounds=function(){var bounds=new BMap.Bounds(this._center,this._center);this._gridBounds=getExtendedBounds(this._map,bounds,this._markerClusterer.getGridSize())},Cluster.prototype.updateClusterMarker=function(){if(this._map.getZoom()>this._markerClusterer.getMaxZoom()){this._clusterMarker&&this._map.removeOverlay(this._clusterMarker);for(var marker,i=0;marker=this._markers[i];i++)this._map.addOverlay(marker)}else{if(this._markers.length<this._minClusterSize)return void this._clusterMarker.hide();this._clusterMarker.setPosition(this._center),this._clusterMarker.setText(this._markers.length);var thatMap=this._map,thatBounds=this.getBounds();this._clusterMarker.addEventListener("click",function(event){thatMap.setViewport(thatBounds)})}},Cluster.prototype.remove=function(){for(var m,i=0;m=this._markers[i];i++)this._markers[i].getMap()&&this._map.removeOverlay(this._markers[i]);this._map.removeOverlay(this._clusterMarker),this._markers.length=0,delete this._markers},Cluster.prototype.getBounds=function(){for(var marker,bounds=new BMap.Bounds(this._center,this._center),i=0;marker=this._markers[i];i++)bounds.extend(marker.getPosition());return bounds},Cluster.prototype.getCenter=function(){return this._center}}(); | ||
2 | \ No newline at end of file | 0 | \ No newline at end of file |
app-ht/web/exts/baidumap/TextIconOverlay.js
@@ -1,1046 +0,0 @@ | @@ -1,1046 +0,0 @@ | ||
1 | -/** | ||
2 | - * @fileoverview 此类表示地图上的一个覆盖物,该覆盖物由文字和图标组成,从Overlay继承。 | ||
3 | - * 主入口类是<a href="symbols/BMapLib.TextIconOverlay.html">TextIconOverlay</a>, | ||
4 | - * 基于Baidu Map API 1.2。 | ||
5 | - * | ||
6 | - * @author Baidu Map Api Group | ||
7 | - * @version 1.2 | ||
8 | - */ | ||
9 | - | ||
10 | - | ||
11 | -/** | ||
12 | - * @namespace BMap的所有library类均放在BMapLib命名空间下 | ||
13 | - */ | ||
14 | -var BMapLib = window.BMapLib = BMapLib || {}; | ||
15 | - | ||
16 | -(function () { | ||
17 | - | ||
18 | - /** | ||
19 | - * 声明baidu包 | ||
20 | - */ | ||
21 | - var T, | ||
22 | - baidu = T = baidu || {version: "1.3.8"}; | ||
23 | - | ||
24 | - (function (){ | ||
25 | - //提出guid,防止在与老版本Tangram混用时 | ||
26 | - //在下一行错误的修改window[undefined] | ||
27 | - baidu.guid = "$BAIDU$"; | ||
28 | - | ||
29 | - //Tangram可能被放在闭包中 | ||
30 | - //一些页面级别唯一的属性,需要挂载在window[baidu.guid]上 | ||
31 | - window[baidu.guid] = window[baidu.guid] || {}; | ||
32 | - | ||
33 | - /** | ||
34 | - * @ignore | ||
35 | - * @namespace baidu.dom 操作dom的方法。 | ||
36 | - */ | ||
37 | - baidu.dom = baidu.dom || {}; | ||
38 | - | ||
39 | - | ||
40 | - /** | ||
41 | - * 从文档中获取指定的DOM元素 | ||
42 | - * @name baidu.dom.g | ||
43 | - * @function | ||
44 | - * @grammar baidu.dom.g(id) | ||
45 | - * @param {string|HTMLElement} id 元素的id或DOM元素 | ||
46 | - * @shortcut g,T.G | ||
47 | - * @meta standard | ||
48 | - * @see baidu.dom.q | ||
49 | - * | ||
50 | - * @returns {HTMLElement|null} 获取的元素,查找不到时返回null,如果参数不合法,直接返回参数 | ||
51 | - */ | ||
52 | - baidu.dom.g = function (id) { | ||
53 | - if ('string' == typeof id || id instanceof String) { | ||
54 | - return document.getElementById(id); | ||
55 | - } else if (id && id.nodeName && (id.nodeType == 1 || id.nodeType == 9)) { | ||
56 | - return id; | ||
57 | - } | ||
58 | - return null; | ||
59 | - }; | ||
60 | - | ||
61 | - // 声明快捷方法 | ||
62 | - baidu.g = baidu.G = baidu.dom.g; | ||
63 | - | ||
64 | - /** | ||
65 | - * 获取目标元素所属的document对象 | ||
66 | - * @name baidu.dom.getDocument | ||
67 | - * @function | ||
68 | - * @grammar baidu.dom.getDocument(element) | ||
69 | - * @param {HTMLElement|string} element 目标元素或目标元素的id | ||
70 | - * @meta standard | ||
71 | - * @see baidu.dom.getWindow | ||
72 | - * | ||
73 | - * @returns {HTMLDocument} 目标元素所属的document对象 | ||
74 | - */ | ||
75 | - baidu.dom.getDocument = function (element) { | ||
76 | - element = baidu.dom.g(element); | ||
77 | - return element.nodeType == 9 ? element : element.ownerDocument || element.document; | ||
78 | - }; | ||
79 | - | ||
80 | - /** | ||
81 | - * @ignore | ||
82 | - * @namespace baidu.lang 对语言层面的封装,包括类型判断、模块扩展、继承基类以及对象自定义事件的支持。 | ||
83 | - */ | ||
84 | - baidu.lang = baidu.lang || {}; | ||
85 | - | ||
86 | - /** | ||
87 | - * 判断目标参数是否string类型或String对象 | ||
88 | - * @name baidu.lang.isString | ||
89 | - * @function | ||
90 | - * @grammar baidu.lang.isString(source) | ||
91 | - * @param {Any} source 目标参数 | ||
92 | - * @shortcut isString | ||
93 | - * @meta standard | ||
94 | - * @see baidu.lang.isObject,baidu.lang.isNumber,baidu.lang.isArray,baidu.lang.isElement,baidu.lang.isBoolean,baidu.lang.isDate | ||
95 | - * | ||
96 | - * @returns {boolean} 类型判断结果 | ||
97 | - */ | ||
98 | - baidu.lang.isString = function (source) { | ||
99 | - return '[object String]' == Object.prototype.toString.call(source); | ||
100 | - }; | ||
101 | - | ||
102 | - // 声明快捷方法 | ||
103 | - baidu.isString = baidu.lang.isString; | ||
104 | - | ||
105 | - /** | ||
106 | - * 从文档中获取指定的DOM元素 | ||
107 | - * **内部方法** | ||
108 | - * | ||
109 | - * @param {string|HTMLElement} id 元素的id或DOM元素 | ||
110 | - * @meta standard | ||
111 | - * @return {HTMLElement} DOM元素,如果不存在,返回null,如果参数不合法,直接返回参数 | ||
112 | - */ | ||
113 | - baidu.dom._g = function (id) { | ||
114 | - if (baidu.lang.isString(id)) { | ||
115 | - return document.getElementById(id); | ||
116 | - } | ||
117 | - return id; | ||
118 | - }; | ||
119 | - | ||
120 | - // 声明快捷方法 | ||
121 | - baidu._g = baidu.dom._g; | ||
122 | - | ||
123 | - /** | ||
124 | - * @ignore | ||
125 | - * @namespace baidu.browser 判断浏览器类型和特性的属性。 | ||
126 | - */ | ||
127 | - baidu.browser = baidu.browser || {}; | ||
128 | - | ||
129 | - if (/msie (\d+\.\d)/i.test(navigator.userAgent)) { | ||
130 | - //IE 8下,以documentMode为准 | ||
131 | - //在百度模板中,可能会有$,防止冲突,将$1 写成 \x241 | ||
132 | - /** | ||
133 | - * 判断是否为ie浏览器 | ||
134 | - * @property ie ie版本号 | ||
135 | - * @grammar baidu.browser.ie | ||
136 | - * @meta standard | ||
137 | - * @shortcut ie | ||
138 | - * @see baidu.browser.firefox,baidu.browser.safari,baidu.browser.opera,baidu.browser.chrome,baidu.browser.maxthon | ||
139 | - */ | ||
140 | - baidu.browser.ie = baidu.ie = document.documentMode || + RegExp['\x241']; | ||
141 | - } | ||
142 | - | ||
143 | - /** | ||
144 | - * 获取目标元素的computed style值。如果元素的样式值不能被浏览器计算,则会返回空字符串(IE) | ||
145 | - * | ||
146 | - * @author berg | ||
147 | - * @name baidu.dom.getComputedStyle | ||
148 | - * @function | ||
149 | - * @grammar baidu.dom.getComputedStyle(element, key) | ||
150 | - * @param {HTMLElement|string} element 目标元素或目标元素的id | ||
151 | - * @param {string} key 要获取的样式名 | ||
152 | - * | ||
153 | - * @see baidu.dom.getStyle | ||
154 | - * | ||
155 | - * @returns {string} 目标元素的computed style值 | ||
156 | - */ | ||
157 | - | ||
158 | - baidu.dom.getComputedStyle = function(element, key){ | ||
159 | - element = baidu.dom._g(element); | ||
160 | - var doc = baidu.dom.getDocument(element), | ||
161 | - styles; | ||
162 | - if (doc.defaultView && doc.defaultView.getComputedStyle) { | ||
163 | - styles = doc.defaultView.getComputedStyle(element, null); | ||
164 | - if (styles) { | ||
165 | - return styles[key] || styles.getPropertyValue(key); | ||
166 | - } | ||
167 | - } | ||
168 | - return ''; | ||
169 | - }; | ||
170 | - | ||
171 | - /** | ||
172 | - * 提供给setStyle与getStyle使用 | ||
173 | - */ | ||
174 | - baidu.dom._styleFixer = baidu.dom._styleFixer || {}; | ||
175 | - | ||
176 | - /** | ||
177 | - * 提供给setStyle与getStyle使用 | ||
178 | - */ | ||
179 | - baidu.dom._styleFilter = baidu.dom._styleFilter || []; | ||
180 | - | ||
181 | - /** | ||
182 | - * 为获取和设置样式的过滤器 | ||
183 | - * @private | ||
184 | - * @meta standard | ||
185 | - */ | ||
186 | - baidu.dom._styleFilter.filter = function (key, value, method) { | ||
187 | - for (var i = 0, filters = baidu.dom._styleFilter, filter; filter = filters[i]; i++) { | ||
188 | - if (filter = filter[method]) { | ||
189 | - value = filter(key, value); | ||
190 | - } | ||
191 | - } | ||
192 | - return value; | ||
193 | - }; | ||
194 | - | ||
195 | - /** | ||
196 | - * @ignore | ||
197 | - * @namespace baidu.string 操作字符串的方法。 | ||
198 | - */ | ||
199 | - baidu.string = baidu.string || {}; | ||
200 | - | ||
201 | - /** | ||
202 | - * 将目标字符串进行驼峰化处理 | ||
203 | - * @name baidu.string.toCamelCase | ||
204 | - * @function | ||
205 | - * @grammar baidu.string.toCamelCase(source) | ||
206 | - * @param {string} source 目标字符串 | ||
207 | - * @remark | ||
208 | - * 支持单词以“-_”分隔 | ||
209 | - * @meta standard | ||
210 | - * | ||
211 | - * @returns {string} 驼峰化处理后的字符串 | ||
212 | - */ | ||
213 | - baidu.string.toCamelCase = function (source) { | ||
214 | - //提前判断,提高getStyle等的效率 thanks xianwei | ||
215 | - if (source.indexOf('-') < 0 && source.indexOf('_') < 0) { | ||
216 | - return source; | ||
217 | - } | ||
218 | - return source.replace(/[-_][^-_]/g, function (match) { | ||
219 | - return match.charAt(1).toUpperCase(); | ||
220 | - }); | ||
221 | - }; | ||
222 | - | ||
223 | - /** | ||
224 | - * 获取目标元素的样式值 | ||
225 | - * @name baidu.dom.getStyle | ||
226 | - * @function | ||
227 | - * @grammar baidu.dom.getStyle(element, key) | ||
228 | - * @param {HTMLElement|string} element 目标元素或目标元素的id | ||
229 | - * @param {string} key 要获取的样式名 | ||
230 | - * @remark | ||
231 | - * | ||
232 | - * 为了精简代码,本模块默认不对任何浏览器返回值进行归一化处理(如使用getStyle时,不同浏览器下可能返回rgb颜色或hex颜色),也不会修复浏览器的bug和差异性(如设置IE的float属性叫styleFloat,firefox则是cssFloat)。<br /> | ||
233 | - * baidu.dom._styleFixer和baidu.dom._styleFilter可以为本模块提供支持。<br /> | ||
234 | - * 其中_styleFilter能对颜色和px进行归一化处理,_styleFixer能对display,float,opacity,textOverflow的浏览器兼容性bug进行处理。 | ||
235 | - * @shortcut getStyle | ||
236 | - * @meta standard | ||
237 | - * @see baidu.dom.setStyle,baidu.dom.setStyles, baidu.dom.getComputedStyle | ||
238 | - * | ||
239 | - * @returns {string} 目标元素的样式值 | ||
240 | - */ | ||
241 | - baidu.dom.getStyle = function (element, key) { | ||
242 | - var dom = baidu.dom; | ||
243 | - | ||
244 | - element = dom.g(element); | ||
245 | - key = baidu.string.toCamelCase(key); | ||
246 | - //computed style, then cascaded style, then explicitly set style. | ||
247 | - var value = element.style[key] || | ||
248 | - (element.currentStyle ? element.currentStyle[key] : "") || | ||
249 | - dom.getComputedStyle(element, key); | ||
250 | - | ||
251 | - // 在取不到值的时候,用fixer进行修正 | ||
252 | - if (!value) { | ||
253 | - var fixer = dom._styleFixer[key]; | ||
254 | - if(fixer){ | ||
255 | - value = fixer.get ? fixer.get(element) : baidu.dom.getStyle(element, fixer); | ||
256 | - } | ||
257 | - } | ||
258 | - | ||
259 | - /* 检查结果过滤器 */ | ||
260 | - if (fixer = dom._styleFilter) { | ||
261 | - value = fixer.filter(key, value, 'get'); | ||
262 | - } | ||
263 | - | ||
264 | - return value; | ||
265 | - }; | ||
266 | - | ||
267 | - // 声明快捷方法 | ||
268 | - baidu.getStyle = baidu.dom.getStyle; | ||
269 | - | ||
270 | - | ||
271 | - if (/opera\/(\d+\.\d)/i.test(navigator.userAgent)) { | ||
272 | - /** | ||
273 | - * 判断是否为opera浏览器 | ||
274 | - * @property opera opera版本号 | ||
275 | - * @grammar baidu.browser.opera | ||
276 | - * @meta standard | ||
277 | - * @see baidu.browser.ie,baidu.browser.firefox,baidu.browser.safari,baidu.browser.chrome | ||
278 | - */ | ||
279 | - baidu.browser.opera = + RegExp['\x241']; | ||
280 | - } | ||
281 | - | ||
282 | - /** | ||
283 | - * 判断是否为webkit内核 | ||
284 | - * @property isWebkit | ||
285 | - * @grammar baidu.browser.isWebkit | ||
286 | - * @meta standard | ||
287 | - * @see baidu.browser.isGecko | ||
288 | - */ | ||
289 | - baidu.browser.isWebkit = /webkit/i.test(navigator.userAgent); | ||
290 | - | ||
291 | - /** | ||
292 | - * 判断是否为gecko内核 | ||
293 | - * @property isGecko | ||
294 | - * @grammar baidu.browser.isGecko | ||
295 | - * @meta standard | ||
296 | - * @see baidu.browser.isWebkit | ||
297 | - */ | ||
298 | - baidu.browser.isGecko = /gecko/i.test(navigator.userAgent) && !/like gecko/i.test(navigator.userAgent); | ||
299 | - | ||
300 | - /** | ||
301 | - * 判断是否严格标准的渲染模式 | ||
302 | - * @property isStrict | ||
303 | - * @grammar baidu.browser.isStrict | ||
304 | - * @meta standard | ||
305 | - */ | ||
306 | - baidu.browser.isStrict = document.compatMode == "CSS1Compat"; | ||
307 | - | ||
308 | - /** | ||
309 | - * 获取目标元素相对于整个文档左上角的位置 | ||
310 | - * @name baidu.dom.getPosition | ||
311 | - * @function | ||
312 | - * @grammar baidu.dom.getPosition(element) | ||
313 | - * @param {HTMLElement|string} element 目标元素或目标元素的id | ||
314 | - * @meta standard | ||
315 | - * | ||
316 | - * @returns {Object} 目标元素的位置,键值为top和left的Object。 | ||
317 | - */ | ||
318 | - baidu.dom.getPosition = function (element) { | ||
319 | - element = baidu.dom.g(element); | ||
320 | - var doc = baidu.dom.getDocument(element), | ||
321 | - browser = baidu.browser, | ||
322 | - getStyle = baidu.dom.getStyle, | ||
323 | - // Gecko 1.9版本以下用getBoxObjectFor计算位置 | ||
324 | - // 但是某些情况下是有bug的 | ||
325 | - // 对于这些有bug的情况 | ||
326 | - // 使用递归查找的方式 | ||
327 | - BUGGY_GECKO_BOX_OBJECT = browser.isGecko > 0 && | ||
328 | - doc.getBoxObjectFor && | ||
329 | - getStyle(element, 'position') == 'absolute' && | ||
330 | - (element.style.top === '' || element.style.left === ''), | ||
331 | - pos = {"left":0,"top":0}, | ||
332 | - viewport = (browser.ie && !browser.isStrict) ? doc.body : doc.documentElement, | ||
333 | - parent, | ||
334 | - box; | ||
335 | - | ||
336 | - if(element == viewport){ | ||
337 | - return pos; | ||
338 | - } | ||
339 | - | ||
340 | - if(element.getBoundingClientRect){ // IE and Gecko 1.9+ | ||
341 | - | ||
342 | - //当HTML或者BODY有border width时, 原生的getBoundingClientRect返回值是不符合预期的 | ||
343 | - //考虑到通常情况下 HTML和BODY的border只会设成0px,所以忽略该问题. | ||
344 | - box = element.getBoundingClientRect(); | ||
345 | - | ||
346 | - pos.left = Math.floor(box.left) + Math.max(doc.documentElement.scrollLeft, doc.body.scrollLeft); | ||
347 | - pos.top = Math.floor(box.top) + Math.max(doc.documentElement.scrollTop, doc.body.scrollTop); | ||
348 | - | ||
349 | - // IE会给HTML元素添加一个border,默认是medium(2px) | ||
350 | - // 但是在IE 6 7 的怪异模式下,可以被html { border: 0; } 这条css规则覆盖 | ||
351 | - // 在IE7的标准模式下,border永远是2px,这个值通过clientLeft 和 clientTop取得 | ||
352 | - // 但是。。。在IE 6 7的怪异模式,如果用户使用css覆盖了默认的medium | ||
353 | - // clientTop和clientLeft不会更新 | ||
354 | - pos.left -= doc.documentElement.clientLeft; | ||
355 | - pos.top -= doc.documentElement.clientTop; | ||
356 | - | ||
357 | - var htmlDom = doc.body, | ||
358 | - // 在这里,不使用element.style.borderLeftWidth,只有computedStyle是可信的 | ||
359 | - htmlBorderLeftWidth = parseInt(getStyle(htmlDom, 'borderLeftWidth')), | ||
360 | - htmlBorderTopWidth = parseInt(getStyle(htmlDom, 'borderTopWidth')); | ||
361 | - if(browser.ie && !browser.isStrict){ | ||
362 | - pos.left -= isNaN(htmlBorderLeftWidth) ? 2 : htmlBorderLeftWidth; | ||
363 | - pos.top -= isNaN(htmlBorderTopWidth) ? 2 : htmlBorderTopWidth; | ||
364 | - } | ||
365 | - } else { | ||
366 | - // safari/opera/firefox | ||
367 | - parent = element; | ||
368 | - | ||
369 | - do { | ||
370 | - pos.left += parent.offsetLeft; | ||
371 | - pos.top += parent.offsetTop; | ||
372 | - | ||
373 | - // safari里面,如果遍历到了一个fixed的元素,后面的offset都不准了 | ||
374 | - if (browser.isWebkit > 0 && getStyle(parent, 'position') == 'fixed') { | ||
375 | - pos.left += doc.body.scrollLeft; | ||
376 | - pos.top += doc.body.scrollTop; | ||
377 | - break; | ||
378 | - } | ||
379 | - | ||
380 | - parent = parent.offsetParent; | ||
381 | - } while (parent && parent != element); | ||
382 | - | ||
383 | - // 对body offsetTop的修正 | ||
384 | - if(browser.opera > 0 || (browser.isWebkit > 0 && getStyle(element, 'position') == 'absolute')){ | ||
385 | - pos.top -= doc.body.offsetTop; | ||
386 | - } | ||
387 | - | ||
388 | - // 计算除了body的scroll | ||
389 | - parent = element.offsetParent; | ||
390 | - while (parent && parent != doc.body) { | ||
391 | - pos.left -= parent.scrollLeft; | ||
392 | - // see https://bugs.opera.com/show_bug.cgi?id=249965 | ||
393 | - if (!browser.opera || parent.tagName != 'TR') { | ||
394 | - pos.top -= parent.scrollTop; | ||
395 | - } | ||
396 | - parent = parent.offsetParent; | ||
397 | - } | ||
398 | - } | ||
399 | - | ||
400 | - return pos; | ||
401 | - }; | ||
402 | - | ||
403 | - /** | ||
404 | - * @ignore | ||
405 | - * @namespace baidu.event 屏蔽浏览器差异性的事件封装。 | ||
406 | - * @property target 事件的触发元素 | ||
407 | - * @property pageX 鼠标事件的鼠标x坐标 | ||
408 | - * @property pageY 鼠标事件的鼠标y坐标 | ||
409 | - * @property keyCode 键盘事件的键值 | ||
410 | - */ | ||
411 | - baidu.event = baidu.event || {}; | ||
412 | - | ||
413 | - /** | ||
414 | - * 事件监听器的存储表 | ||
415 | - * @private | ||
416 | - * @meta standard | ||
417 | - */ | ||
418 | - baidu.event._listeners = baidu.event._listeners || []; | ||
419 | - | ||
420 | - /** | ||
421 | - * 为目标元素添加事件监听器 | ||
422 | - * @name baidu.event.on | ||
423 | - * @function | ||
424 | - * @grammar baidu.event.on(element, type, listener) | ||
425 | - * @param {HTMLElement|string|window} element 目标元素或目标元素id | ||
426 | - * @param {string} type 事件类型 | ||
427 | - * @param {Function} listener 需要添加的监听器 | ||
428 | - * @remark | ||
429 | - * | ||
430 | - 1. 不支持跨浏览器的鼠标滚轮事件监听器添加<br> | ||
431 | - 2. 改方法不为监听器灌入事件对象,以防止跨iframe事件挂载的事件对象获取失败 | ||
432 | - | ||
433 | - * @shortcut on | ||
434 | - * @meta standard | ||
435 | - * @see baidu.event.un | ||
436 | - * | ||
437 | - * @returns {HTMLElement|window} 目标元素 | ||
438 | - */ | ||
439 | - baidu.event.on = function (element, type, listener) { | ||
440 | - type = type.replace(/^on/i, ''); | ||
441 | - element = baidu.dom._g(element); | ||
442 | - | ||
443 | - var realListener = function (ev) { | ||
444 | - // 1. 这里不支持EventArgument, 原因是跨frame的事件挂载 | ||
445 | - // 2. element是为了修正this | ||
446 | - listener.call(element, ev); | ||
447 | - }, | ||
448 | - lis = baidu.event._listeners, | ||
449 | - filter = baidu.event._eventFilter, | ||
450 | - afterFilter, | ||
451 | - realType = type; | ||
452 | - type = type.toLowerCase(); | ||
453 | - // filter过滤 | ||
454 | - if(filter && filter[type]){ | ||
455 | - afterFilter = filter[type](element, type, realListener); | ||
456 | - realType = afterFilter.type; | ||
457 | - realListener = afterFilter.listener; | ||
458 | - } | ||
459 | - | ||
460 | - // 事件监听器挂载 | ||
461 | - if (element.addEventListener) { | ||
462 | - element.addEventListener(realType, realListener, false); | ||
463 | - } else if (element.attachEvent) { | ||
464 | - element.attachEvent('on' + realType, realListener); | ||
465 | - } | ||
466 | - | ||
467 | - // 将监听器存储到数组中 | ||
468 | - lis[lis.length] = [element, type, listener, realListener, realType]; | ||
469 | - return element; | ||
470 | - }; | ||
471 | - | ||
472 | - // 声明快捷方法 | ||
473 | - baidu.on = baidu.event.on; | ||
474 | - | ||
475 | - /** | ||
476 | - * 返回一个当前页面的唯一标识字符串。 | ||
477 | - * @name baidu.lang.guid | ||
478 | - * @function | ||
479 | - * @grammar baidu.lang.guid() | ||
480 | - * @version 1.1.1 | ||
481 | - * @meta standard | ||
482 | - * | ||
483 | - * @returns {String} 当前页面的唯一标识字符串 | ||
484 | - */ | ||
485 | - | ||
486 | - (function(){ | ||
487 | - //不直接使用window,可以提高3倍左右性能 | ||
488 | - var guid = window[baidu.guid]; | ||
489 | - | ||
490 | - baidu.lang.guid = function() { | ||
491 | - return "TANGRAM__" + (guid._counter ++).toString(36); | ||
492 | - }; | ||
493 | - | ||
494 | - guid._counter = guid._counter || 1; | ||
495 | - })(); | ||
496 | - | ||
497 | - /** | ||
498 | - * 所有类的实例的容器 | ||
499 | - * key为每个实例的guid | ||
500 | - * @meta standard | ||
501 | - */ | ||
502 | - | ||
503 | - window[baidu.guid]._instances = window[baidu.guid]._instances || {}; | ||
504 | - | ||
505 | - /** | ||
506 | - * 判断目标参数是否为function或Function实例 | ||
507 | - * @name baidu.lang.isFunction | ||
508 | - * @function | ||
509 | - * @grammar baidu.lang.isFunction(source) | ||
510 | - * @param {Any} source 目标参数 | ||
511 | - * @version 1.2 | ||
512 | - * @see baidu.lang.isString,baidu.lang.isObject,baidu.lang.isNumber,baidu.lang.isArray,baidu.lang.isElement,baidu.lang.isBoolean,baidu.lang.isDate | ||
513 | - * @meta standard | ||
514 | - * @returns {boolean} 类型判断结果 | ||
515 | - */ | ||
516 | - baidu.lang.isFunction = function (source) { | ||
517 | - // chrome下,'function' == typeof /a/ 为true. | ||
518 | - return '[object Function]' == Object.prototype.toString.call(source); | ||
519 | - }; | ||
520 | - | ||
521 | - /** | ||
522 | - * | ||
523 | - * @ignore | ||
524 | - * @class Tangram继承机制提供的一个基类,用户可以通过继承baidu.lang.Class来获取它的属性及方法。 | ||
525 | - * @name baidu.lang.Class | ||
526 | - * @grammar baidu.lang.Class(guid) | ||
527 | - * @param {string} guid 对象的唯一标识 | ||
528 | - * @meta standard | ||
529 | - * @remark baidu.lang.Class和它的子类的实例均包含一个全局唯一的标识guid。guid是在构造函数中生成的,因此,继承自baidu.lang.Class的类应该直接或者间接调用它的构造函数。<br>baidu.lang.Class的构造函数中产生guid的方式可以保证guid的唯一性,及每个实例都有一个全局唯一的guid。 | ||
530 | - * @meta standard | ||
531 | - * @see baidu.lang.inherits,baidu.lang.Event | ||
532 | - */ | ||
533 | - baidu.lang.Class = function(guid) { | ||
534 | - this.guid = guid || baidu.lang.guid(); | ||
535 | - window[baidu.guid]._instances[this.guid] = this; | ||
536 | - }; | ||
537 | - window[baidu.guid]._instances = window[baidu.guid]._instances || {}; | ||
538 | - | ||
539 | - /** | ||
540 | - * 释放对象所持有的资源,主要是自定义事件。 | ||
541 | - * @name dispose | ||
542 | - * @grammar obj.dispose() | ||
543 | - */ | ||
544 | - baidu.lang.Class.prototype.dispose = function(){ | ||
545 | - delete window[baidu.guid]._instances[this.guid]; | ||
546 | - | ||
547 | - for(var property in this){ | ||
548 | - if (!baidu.lang.isFunction(this[property])) { | ||
549 | - delete this[property]; | ||
550 | - } | ||
551 | - } | ||
552 | - this.disposed = true; | ||
553 | - }; | ||
554 | - | ||
555 | - /** | ||
556 | - * 重载了默认的toString方法,使得返回信息更加准确一些。 | ||
557 | - * @return {string} 对象的String表示形式 | ||
558 | - */ | ||
559 | - baidu.lang.Class.prototype.toString = function(){ | ||
560 | - return "[object " + (this._className || "Object" ) + "]"; | ||
561 | - }; | ||
562 | - | ||
563 | - /** | ||
564 | - * @ignore | ||
565 | - * @class 自定义的事件对象。 | ||
566 | - * @name baidu.lang.Event | ||
567 | - * @grammar baidu.lang.Event(type[, target]) | ||
568 | - * @param {string} type 事件类型名称。为了方便区分事件和一个普通的方法,事件类型名称必须以"on"(小写)开头。 | ||
569 | - * @param {Object} [target]触发事件的对象 | ||
570 | - * @meta standard | ||
571 | - * @remark 引入该模块,会自动为Class引入3个事件扩展方法:addEventListener、removeEventListener和dispatchEvent。 | ||
572 | - * @meta standard | ||
573 | - * @see baidu.lang.Class | ||
574 | - */ | ||
575 | - baidu.lang.Event = function (type, target) { | ||
576 | - this.type = type; | ||
577 | - this.returnValue = true; | ||
578 | - this.target = target || null; | ||
579 | - this.currentTarget = null; | ||
580 | - }; | ||
581 | - | ||
582 | - /** | ||
583 | - * 注册对象的事件监听器。引入baidu.lang.Event后,Class的子类实例才会获得该方法。 | ||
584 | - * @grammar obj.addEventListener(type, handler[, key]) | ||
585 | - * @param {string} type 自定义事件的名称 | ||
586 | - * @param {Function} handler 自定义事件被触发时应该调用的回调函数 | ||
587 | - * @param {string} [key] 为事件监听函数指定的名称,可在移除时使用。如果不提供,方法会默认为它生成一个全局唯一的key。 | ||
588 | - * @remark 事件类型区分大小写。如果自定义事件名称不是以小写"on"开头,该方法会给它加上"on"再进行判断,即"click"和"onclick"会被认为是同一种事件。 | ||
589 | - */ | ||
590 | - baidu.lang.Class.prototype.addEventListener = function (type, handler, key) { | ||
591 | - if (!baidu.lang.isFunction(handler)) { | ||
592 | - return; | ||
593 | - } | ||
594 | - | ||
595 | - !this.__listeners && (this.__listeners = {}); | ||
596 | - | ||
597 | - var t = this.__listeners, id; | ||
598 | - if (typeof key == "string" && key) { | ||
599 | - if (/[^\w\-]/.test(key)) { | ||
600 | - throw("nonstandard key:" + key); | ||
601 | - } else { | ||
602 | - handler.hashCode = key; | ||
603 | - id = key; | ||
604 | - } | ||
605 | - } | ||
606 | - type.indexOf("on") != 0 && (type = "on" + type); | ||
607 | - | ||
608 | - typeof t[type] != "object" && (t[type] = {}); | ||
609 | - id = id || baidu.lang.guid(); | ||
610 | - handler.hashCode = id; | ||
611 | - t[type][id] = handler; | ||
612 | - }; | ||
613 | - | ||
614 | - /** | ||
615 | - * 移除对象的事件监听器。引入baidu.lang.Event后,Class的子类实例才会获得该方法。 | ||
616 | - * @grammar obj.removeEventListener(type, handler) | ||
617 | - * @param {string} type 事件类型 | ||
618 | - * @param {Function|string} handler 要移除的事件监听函数或者监听函数的key | ||
619 | - * @remark 如果第二个参数handler没有被绑定到对应的自定义事件中,什么也不做。 | ||
620 | - */ | ||
621 | - baidu.lang.Class.prototype.removeEventListener = function (type, handler) { | ||
622 | - if (typeof handler != "undefined") { | ||
623 | - if ( (baidu.lang.isFunction(handler) && ! (handler = handler.hashCode)) | ||
624 | - || (! baidu.lang.isString(handler)) | ||
625 | - ){ | ||
626 | - return; | ||
627 | - } | ||
628 | - } | ||
629 | - | ||
630 | - !this.__listeners && (this.__listeners = {}); | ||
631 | - | ||
632 | - type.indexOf("on") != 0 && (type = "on" + type); | ||
633 | - | ||
634 | - var t = this.__listeners; | ||
635 | - if (!t[type]) { | ||
636 | - return; | ||
637 | - } | ||
638 | - if (typeof handler != "undefined") { | ||
639 | - t[type][handler] && delete t[type][handler]; | ||
640 | - } else { | ||
641 | - for(var guid in t[type]){ | ||
642 | - delete t[type][guid]; | ||
643 | - } | ||
644 | - } | ||
645 | - }; | ||
646 | - | ||
647 | - /** | ||
648 | - * 派发自定义事件,使得绑定到自定义事件上面的函数都会被执行。引入baidu.lang.Event后,Class的子类实例才会获得该方法。 | ||
649 | - * @grammar obj.dispatchEvent(event, options) | ||
650 | - * @param {baidu.lang.Event|String} event Event对象,或事件名称(1.1.1起支持) | ||
651 | - * @param {Object} options 扩展参数,所含属性键值会扩展到Event对象上(1.2起支持) | ||
652 | - * @remark 处理会调用通过addEventListenr绑定的自定义事件回调函数之外,还会调用直接绑定到对象上面的自定义事件。例如:<br> | ||
653 | - myobj.onMyEvent = function(){}<br> | ||
654 | - myobj.addEventListener("onMyEvent", function(){}); | ||
655 | - */ | ||
656 | - baidu.lang.Class.prototype.dispatchEvent = function (event, options) { | ||
657 | - if (baidu.lang.isString(event)) { | ||
658 | - event = new baidu.lang.Event(event); | ||
659 | - } | ||
660 | - !this.__listeners && (this.__listeners = {}); | ||
661 | - | ||
662 | - // 20100603 添加本方法的第二个参数,将 options extend到event中去传递 | ||
663 | - options = options || {}; | ||
664 | - for (var i in options) { | ||
665 | - event[i] = options[i]; | ||
666 | - } | ||
667 | - | ||
668 | - var i, t = this.__listeners, p = event.type; | ||
669 | - event.target = event.target || this; | ||
670 | - event.currentTarget = this; | ||
671 | - | ||
672 | - p.indexOf("on") != 0 && (p = "on" + p); | ||
673 | - | ||
674 | - baidu.lang.isFunction(this[p]) && this[p].apply(this, arguments); | ||
675 | - | ||
676 | - if (typeof t[p] == "object") { | ||
677 | - for (i in t[p]) { | ||
678 | - t[p][i].apply(this, arguments); | ||
679 | - } | ||
680 | - } | ||
681 | - return event.returnValue; | ||
682 | - }; | ||
683 | - | ||
684 | - | ||
685 | - baidu.lang.inherits = function (subClass, superClass, className) { | ||
686 | - var key, proto, | ||
687 | - selfProps = subClass.prototype, | ||
688 | - clazz = new Function(); | ||
689 | - | ||
690 | - clazz.prototype = superClass.prototype; | ||
691 | - proto = subClass.prototype = new clazz(); | ||
692 | - for (key in selfProps) { | ||
693 | - proto[key] = selfProps[key]; | ||
694 | - } | ||
695 | - subClass.prototype.constructor = subClass; | ||
696 | - subClass.superClass = superClass.prototype; | ||
697 | - | ||
698 | - // 类名标识,兼容Class的toString,基本没用 | ||
699 | - if ("string" == typeof className) { | ||
700 | - proto._className = className; | ||
701 | - } | ||
702 | - }; | ||
703 | - // 声明快捷方法 | ||
704 | - baidu.inherits = baidu.lang.inherits; | ||
705 | - })(); | ||
706 | - | ||
707 | - | ||
708 | - /** | ||
709 | - | ||
710 | - * 图片的路径 | ||
711 | - | ||
712 | - * @private | ||
713 | - * @type {String} | ||
714 | - | ||
715 | - */ | ||
716 | - var _IMAGE_PATH = 'http://api.map.baidu.com/library/TextIconOverlay/1.2/src/images/m'; | ||
717 | - | ||
718 | - /** | ||
719 | - | ||
720 | - * 图片的后缀名 | ||
721 | - | ||
722 | - * @private | ||
723 | - * @type {String} | ||
724 | - | ||
725 | - */ | ||
726 | - var _IMAGE_EXTENSION = 'png'; | ||
727 | - | ||
728 | - /** | ||
729 | - *@exports TextIconOverlay as BMapLib.TextIconOverlay | ||
730 | - */ | ||
731 | - var TextIconOverlay = | ||
732 | - /** | ||
733 | - * TextIconOverlay | ||
734 | - * @class 此类表示地图上的一个覆盖物,该覆盖物由文字和图标组成,从Overlay继承。文字通常是数字(0-9)或字母(A-Z ),而文字与图标之间有一定的映射关系。 | ||
735 | - *该覆盖物适用于以下类似的场景:需要在地图上添加一系列覆盖物,这些覆盖物之间用不同的图标和文字来区分,文字可能表示了该覆盖物的某一属性值,根据该文字和一定的映射关系,自动匹配相应颜色和大小的图标。 | ||
736 | - * | ||
737 | - *@constructor | ||
738 | - *@param {Point} position 表示一个经纬度坐标位置。 | ||
739 | - *@param {String} text 表示该覆盖物显示的文字信息。 | ||
740 | - *@param {Json Object} options 可选参数,可选项包括:<br /> | ||
741 | - *"<b>styles</b>":{Array<IconStyle>} 一组图标风格。单个图表风格包括以下几个属性:<br /> | ||
742 | - * url {String} 图片的url地址。(必选)<br /> | ||
743 | - * size {Size} 图片的大小。(必选)<br /> | ||
744 | - * anchor {Size} 图标定位在地图上的位置相对于图标左上角的偏移值,默认偏移值为图标的中心位置。(可选)<br /> | ||
745 | - * offset {Size} 图片相对于可视区域的偏移值,此功能的作用等同于CSS中的background-position属性。(可选)<br /> | ||
746 | - * textSize {Number} 文字的大小。(可选,默认10)<br /> | ||
747 | - * textColor {String} 文字的颜色。(可选,默认black)<br /> | ||
748 | - */ | ||
749 | - BMapLib.TextIconOverlay = function(position, text, options){ | ||
750 | - this._position = position; | ||
751 | - this._text = text; | ||
752 | - this._options = options || {}; | ||
753 | - this._styles = this._options['styles'] || []; | ||
754 | - (!this._styles.length) && this._setupDefaultStyles(); | ||
755 | - }; | ||
756 | - | ||
757 | - T.lang.inherits(TextIconOverlay, BMap.Overlay, "TextIconOverlay"); | ||
758 | - | ||
759 | - TextIconOverlay.prototype._setupDefaultStyles = function(){ | ||
760 | - var sizes = [53, 56, 66, 78, 90]; | ||
761 | - for(var i = 0, size; size = sizes[i]; i++){ | ||
762 | - this._styles.push({ | ||
763 | - url:_IMAGE_PATH + i + '.' + _IMAGE_EXTENSION, | ||
764 | - size: new BMap.Size(size, size) | ||
765 | - }); | ||
766 | - }//for循环的简洁写法 | ||
767 | - }; | ||
768 | - | ||
769 | - /** | ||
770 | - *继承Overlay的intialize方法,自定义覆盖物时必须。 | ||
771 | - *@param {Map} map BMap.Map的实例化对象。 | ||
772 | - *@return {HTMLElement} 返回覆盖物对应的HTML元素。 | ||
773 | - */ | ||
774 | - TextIconOverlay.prototype.initialize = function(map){ | ||
775 | - this._map = map; | ||
776 | - | ||
777 | - this._domElement = document.createElement('div'); | ||
778 | - this._updateCss(); | ||
779 | - this._updateText(); | ||
780 | - this._updatePosition(); | ||
781 | - | ||
782 | - this._bind(); | ||
783 | - | ||
784 | - this._map.getPanes().markerMouseTarget.appendChild(this._domElement); | ||
785 | - return this._domElement; | ||
786 | - }; | ||
787 | - | ||
788 | - /** | ||
789 | - *继承Overlay的draw方法,自定义覆盖物时必须。 | ||
790 | - *@return 无返回值。 | ||
791 | - */ | ||
792 | - TextIconOverlay.prototype.draw = function(){ | ||
793 | - this._map && this._updatePosition(); | ||
794 | - }; | ||
795 | - | ||
796 | - /** | ||
797 | - *获取该覆盖物上的文字。 | ||
798 | - *@return {String} 该覆盖物上的文字。 | ||
799 | - */ | ||
800 | - TextIconOverlay.prototype.getText = function(){ | ||
801 | - return this._text; | ||
802 | - }; | ||
803 | - | ||
804 | - /** | ||
805 | - *设置该覆盖物上的文字。 | ||
806 | - *@param {String} text 要设置的文字,通常是字母A-Z或数字0-9。 | ||
807 | - *@return 无返回值。 | ||
808 | - */ | ||
809 | - TextIconOverlay.prototype.setText = function(text){ | ||
810 | - if(text && (!this._text || (this._text.toString() != text.toString()))){ | ||
811 | - this._text = text; | ||
812 | - this._updateText(); | ||
813 | - this._updateCss(); | ||
814 | - this._updatePosition(); | ||
815 | - } | ||
816 | - }; | ||
817 | - | ||
818 | - /** | ||
819 | - *获取该覆盖物的位置。 | ||
820 | - *@return {Point} 该覆盖物的经纬度坐标。 | ||
821 | - */ | ||
822 | - TextIconOverlay.prototype.getPosition = function () { | ||
823 | - return this._position; | ||
824 | - }; | ||
825 | - | ||
826 | - /** | ||
827 | - *设置该覆盖物的位置。 | ||
828 | - *@param {Point} position 要设置的经纬度坐标。 | ||
829 | - *@return 无返回值。 | ||
830 | - */ | ||
831 | - TextIconOverlay.prototype.setPosition = function (position) { | ||
832 | - if(position && (!this._position || !this._position.equals(position))){ | ||
833 | - this._position = position; | ||
834 | - this._updatePosition(); | ||
835 | - } | ||
836 | - }; | ||
837 | - | ||
838 | - /** | ||
839 | - *由文字信息获取风格数组的对应索引值。 | ||
840 | - *内部默认的对应函数为文字转换为数字除以10的结果,比如文字8返回索引0,文字25返回索引2. | ||
841 | - *如果需要自定义映射关系,请覆盖该函数。 | ||
842 | - *@param {String} text 文字。 | ||
843 | - *@param {Array<IconStyle>} styles 一组图标风格。 | ||
844 | - *@return {Number} 对应的索引值。 | ||
845 | - */ | ||
846 | - TextIconOverlay.prototype.getStyleByText = function(text, styles){ | ||
847 | - var count = parseInt(text); | ||
848 | - if (count < 0) { | ||
849 | - count = 0; | ||
850 | - } | ||
851 | - var index = String(count).length; | ||
852 | - return styles[index-1]; | ||
853 | - } | ||
854 | - | ||
855 | - /** | ||
856 | - *更新相应的CSS。 | ||
857 | - *@return 无返回值。 | ||
858 | - */ | ||
859 | - TextIconOverlay.prototype._updateCss = function(){ | ||
860 | - var style = this.getStyleByText(this._text, this._styles); | ||
861 | - this._domElement.style.cssText = this._buildCssText(style); | ||
862 | - }; | ||
863 | - | ||
864 | - /** | ||
865 | - *更新覆盖物的显示文字。 | ||
866 | - *@return 无返回值。 | ||
867 | - */ | ||
868 | - TextIconOverlay.prototype._updateText = function(){ | ||
869 | - if (this._domElement) { | ||
870 | - this._domElement.innerHTML = this._text; | ||
871 | - } | ||
872 | - }; | ||
873 | - | ||
874 | - /** | ||
875 | - *调整覆盖物在地图上的位置更新覆盖物的显示文字。 | ||
876 | - *@return 无返回值。 | ||
877 | - */ | ||
878 | - TextIconOverlay.prototype._updatePosition = function(){ | ||
879 | - if (this._domElement && this._position) { | ||
880 | - var style = this._domElement.style; | ||
881 | - var pixelPosition= this._map.pointToOverlayPixel(this._position); | ||
882 | - pixelPosition.x -= Math.ceil(parseInt(style.width) / 2); | ||
883 | - pixelPosition.y -= Math.ceil(parseInt(style.height) / 2); | ||
884 | - style.left = pixelPosition.x + "px"; | ||
885 | - style.top = pixelPosition.y + "px"; | ||
886 | - } | ||
887 | - }; | ||
888 | - | ||
889 | - /** | ||
890 | - * 为该覆盖物的HTML元素构建CSS | ||
891 | - * @param {IconStyle} 一个图标的风格。 | ||
892 | - * @return {String} 构建完成的CSSTEXT。 | ||
893 | - */ | ||
894 | - TextIconOverlay.prototype._buildCssText = function(style) { | ||
895 | - //根据style来确定一些默认值 | ||
896 | - var url = style['url']; | ||
897 | - var size = style['size']; | ||
898 | - var anchor = style['anchor']; | ||
899 | - var offset = style['offset']; | ||
900 | - var textColor = style['textColor'] || 'black'; | ||
901 | - var textSize = style['textSize'] || 10; | ||
902 | - | ||
903 | - var csstext = []; | ||
904 | - if (T.browser["ie"] < 7) { | ||
905 | - csstext.push('filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(' + | ||
906 | - 'sizingMethod=scale,src="' + url + '");'); | ||
907 | - } else { | ||
908 | - if(style['bgColor'] == '' || style['bgColor'] == undefined) { | ||
909 | - csstext.push('background-image:url(' + url + ');'); | ||
910 | - var backgroundPosition = '0 0'; | ||
911 | - (offset instanceof BMap.Size) && (backgroundPosition = offset.width + 'px' + ' ' + offset.height + 'px'); | ||
912 | - csstext.push('background-position:' + backgroundPosition + ';'); | ||
913 | - } else { | ||
914 | - var bgColor = style['bgColor']; | ||
915 | - csstext.push('background-color:' + bgColor + '; border-radius: 51%;'); | ||
916 | - } | ||
917 | - } | ||
918 | - | ||
919 | - if (size instanceof BMap.Size){ | ||
920 | - if (anchor instanceof BMap.Size) { | ||
921 | - if (anchor.height > 0 && anchor.height < size.height) { | ||
922 | - csstext.push('height:' + (size.height - anchor.height) + 'px; padding-top:' + anchor.height + 'px;'); | ||
923 | - } | ||
924 | - if(anchor.width > 0 && anchor.width < size.width){ | ||
925 | - csstext.push('width:' + (size.width - anchor.width) + 'px; padding-left:' + anchor.width + 'px;'); | ||
926 | - } | ||
927 | - } else { | ||
928 | - csstext.push('height:' + size.height + 'px; line-height:' + size.height + 'px;'); | ||
929 | - csstext.push('width:' + size.width + 'px; text-align:center;'); | ||
930 | - } | ||
931 | - } | ||
932 | - | ||
933 | - csstext.push('cursor:pointer; color:' + textColor + '; position:absolute; font-size:' + | ||
934 | - textSize + 'px; font-family:Arial,sans-serif; font-weight:bold'); | ||
935 | - return csstext.join(''); | ||
936 | - }; | ||
937 | - | ||
938 | - | ||
939 | - /** | ||
940 | - | ||
941 | - * 当鼠标点击该覆盖物时会触发该事件 | ||
942 | - | ||
943 | - * @name TextIconOverlay#click | ||
944 | - | ||
945 | - * @event | ||
946 | - | ||
947 | - * @param {Event Object} e 回调函数会返回event参数,包括以下返回值: | ||
948 | - | ||
949 | - * <br />"<b>type</b> : {String} 事件类型 | ||
950 | - | ||
951 | - * <br />"<b>target</b>:{BMapLib.TextIconOverlay} 事件目标 | ||
952 | - | ||
953 | - * | ||
954 | - | ||
955 | - */ | ||
956 | - | ||
957 | - /** | ||
958 | - | ||
959 | - * 当鼠标进入该覆盖物区域时会触发该事件 | ||
960 | - | ||
961 | - * @name TextIconOverlay#mouseover | ||
962 | - | ||
963 | - * @event | ||
964 | - * @param {Event Object} e 回调函数会返回event参数,包括以下返回值: | ||
965 | - | ||
966 | - * <br />"<b>type</b> : {String} 事件类型 | ||
967 | - | ||
968 | - * <br />"<b>target</b>:{BMapLib.TextIconOverlay} 事件目标 | ||
969 | - | ||
970 | - * <br />"<b>point</b> : {BMap.Point} 最新添加上的节点BMap.Point对象 | ||
971 | - | ||
972 | - * <br />"<b>pixel</b>:{BMap.pixel} 最新添加上的节点BMap.Pixel对象 | ||
973 | - | ||
974 | - * | ||
975 | - | ||
976 | - * @example <b>参考示例:</b><br /> | ||
977 | - | ||
978 | - * myTextIconOverlay.addEventListener("mouseover", function(e) { alert(e.point); }); | ||
979 | - | ||
980 | - */ | ||
981 | - | ||
982 | - /** | ||
983 | - | ||
984 | - * 当鼠标离开该覆盖物区域时会触发该事件 | ||
985 | - | ||
986 | - * @name TextIconOverlay#mouseout | ||
987 | - | ||
988 | - * @event | ||
989 | - | ||
990 | - * @param {Event Object} e 回调函数会返回event参数,包括以下返回值: | ||
991 | - | ||
992 | - * <br />"<b>type</b> : {String} 事件类型 | ||
993 | - | ||
994 | - * <br />"<b>target</b>:{BMapLib.TextIconOverlay} 事件目标 | ||
995 | - | ||
996 | - * <br />"<b>point</b> : {BMap.Point} 最新添加上的节点BMap.Point对象 | ||
997 | - | ||
998 | - * <br />"<b>pixel</b>:{BMap.pixel} 最新添加上的节点BMap.Pixel对象 | ||
999 | - | ||
1000 | - * | ||
1001 | - | ||
1002 | - * @example <b>参考示例:</b><br /> | ||
1003 | - | ||
1004 | - * myTextIconOverlay.addEventListener("mouseout", function(e) { alert(e.point); }); | ||
1005 | - | ||
1006 | - */ | ||
1007 | - | ||
1008 | - | ||
1009 | - /** | ||
1010 | - * 为该覆盖物绑定一系列事件 | ||
1011 | - * 当前支持click mouseover mouseout | ||
1012 | - * @return 无返回值。 | ||
1013 | - */ | ||
1014 | - TextIconOverlay.prototype._bind = function(){ | ||
1015 | - if (!this._domElement){ | ||
1016 | - return; | ||
1017 | - } | ||
1018 | - | ||
1019 | - var me = this; | ||
1020 | - var map = this._map; | ||
1021 | - | ||
1022 | - var BaseEvent = T.lang.Event; | ||
1023 | - function eventExtend(e, be){ | ||
1024 | - var elem = e.srcElement || e.target; | ||
1025 | - var x = e.clientX || e.pageX; | ||
1026 | - var y = e.clientY || e.pageY; | ||
1027 | - if (e && be && x && y && elem){ | ||
1028 | - var offset = T.dom.getPosition(map.getContainer()); | ||
1029 | - be.pixel = new BMap.Pixel(x - offset.left, y - offset.top); | ||
1030 | - be.point = map.pixelToPoint(be.pixel); | ||
1031 | - } | ||
1032 | - return be; | ||
1033 | - }//给事件参数增加pixel和point两个值 | ||
1034 | - | ||
1035 | - T.event.on(this._domElement,"mouseover", function(e){ | ||
1036 | - me.dispatchEvent(eventExtend(e, new BaseEvent("onmouseover"))); | ||
1037 | - }); | ||
1038 | - T.event.on(this._domElement,"mouseout", function(e){ | ||
1039 | - me.dispatchEvent(eventExtend(e, new BaseEvent("onmouseout"))); | ||
1040 | - }); | ||
1041 | - T.event.on(this._domElement,"click", function(e){ | ||
1042 | - me.dispatchEvent(eventExtend(e, new BaseEvent("onclick"))); | ||
1043 | - }); | ||
1044 | - }; | ||
1045 | - | ||
1046 | -})(); | ||
1047 | \ No newline at end of file | 0 | \ No newline at end of file |
common/helpers/Utils.php
@@ -2,7 +2,7 @@ | @@ -2,7 +2,7 @@ | ||
2 | 2 | ||
3 | namespace common\helpers; | 3 | namespace common\helpers; |
4 | 4 | ||
5 | -use common\exts\wechat\Http; | 5 | +use common\exts\Http; |
6 | use Faker\Provider\Uuid; | 6 | use Faker\Provider\Uuid; |
7 | 7 | ||
8 | class Utils | 8 | class Utils |
@@ -169,22 +169,6 @@ class Utils | @@ -169,22 +169,6 @@ class Utils | ||
169 | return round($number ,2); | 169 | return round($number ,2); |
170 | } | 170 | } |
171 | 171 | ||
172 | - /** | ||
173 | - * @param $avatar | ||
174 | - * @return bool|string | ||
175 | - */ | ||
176 | - public static function getUserAvatar($avatar, $WX_STYLE = 96 ) | ||
177 | - { | ||
178 | - if(false !== strpos($avatar,'http')){ | ||
179 | - if(false !== strpos($avatar,'.jpg')){ | ||
180 | - return $avatar; | ||
181 | - } else { | ||
182 | - return \common\helpers\WxHelper::exchangeHeadImgSize($avatar, $WX_STYLE); | ||
183 | - } | ||
184 | - }else{ | ||
185 | - return $avatar; | ||
186 | - } | ||
187 | - } | ||
188 | 172 | ||
189 | /** 经纬度检测是否合格 | 173 | /** 经纬度检测是否合格 |
190 | * @param $latitude | 174 | * @param $latitude |
console/controllers/TestController.php
@@ -8,7 +8,9 @@ namespace console\controllers; | @@ -8,7 +8,9 @@ namespace console\controllers; | ||
8 | */ | 8 | */ |
9 | 9 | ||
10 | 10 | ||
11 | +use app\api\helpers\Aes; | ||
11 | use common\exts\Http; | 12 | use common\exts\Http; |
13 | +use domain\device\Device; | ||
12 | use GuzzleHttp\Psr7; | 14 | use GuzzleHttp\Psr7; |
13 | use yii\console\Controller; | 15 | use yii\console\Controller; |
14 | use GuzzleHttp\Psr7\Request; | 16 | use GuzzleHttp\Psr7\Request; |
@@ -27,7 +29,7 @@ class TestController extends Controller | @@ -27,7 +29,7 @@ class TestController extends Controller | ||
27 | { | 29 | { |
28 | $url = 'http://kingb:8012/app-api/web/authDevice'; | 30 | $url = 'http://kingb:8012/app-api/web/authDevice'; |
29 | $manufactureNo = '0002'; | 31 | $manufactureNo = '0002'; |
30 | - $device_id = 'SZDEVICE000036'; | 32 | + $device_id = 'SZDEVICE000037'; |
31 | $projectNo = '002'; | 33 | $projectNo = '002'; |
32 | $modelNo = '002'; | 34 | $modelNo = '002'; |
33 | $productionNo = '0001'; | 35 | $productionNo = '0001'; |
@@ -49,5 +51,59 @@ class TestController extends Controller | @@ -49,5 +51,59 @@ class TestController extends Controller | ||
49 | 51 | ||
50 | } | 52 | } |
51 | 53 | ||
54 | + public function actionUpgrade() | ||
55 | + { | ||
56 | + $url = 'http://kingb:8012/app-api/web/reportDeviceVersion'; | ||
57 | + $params = [ | ||
58 | + 'barcode' => '00001', | ||
59 | + 'device_id' => 'DEVICE001', | ||
60 | + 'software_version' => 'V1.0.1', | ||
61 | + 'hardware_version' => 'V1.0.2', | ||
62 | + 'timestamp' => 1500000000 | ||
63 | + ]; | ||
64 | + | ||
65 | + $postResult = Http::POST($url, $params); | ||
66 | + echo $postResult; | ||
67 | + } | ||
68 | + | ||
69 | + public function actionAec() | ||
70 | + { | ||
71 | + $aes = new Aes('12345678'); | ||
72 | + $encrypted = $aes->encrypt('this is en AES testing'); | ||
73 | + echo '要加密的字符串:this is en AES testing<br>加密后的字符串:'. $encrypted. '<hr>'; | ||
74 | + $decrypted = $aes->decrypt($encrypted); | ||
75 | + echo '要解密的字符串:'. $encrypted, '<br>解密后的字符串:'. $decrypted; | ||
76 | + } | ||
77 | + | ||
78 | + public function actionDeviceSt() | ||
79 | + { | ||
80 | + $url = 'http://kingb:8012/app-api/web/reportDeviceVersion'; | ||
81 | + $params = [ | ||
82 | + 'barcode' => '0001000100010001', | ||
83 | + 'device_id' => 'DEVICE003', | ||
84 | + 'software_version' => 'V1.0.1', | ||
85 | + 'hardware_version' => 'V1.0.2', | ||
86 | + 'timestamp' => 1500000000 | ||
87 | + ]; | ||
88 | + | ||
89 | + $postResult = Http::POST($url, json_encode($params)); | ||
90 | + echo $postResult; | ||
91 | + } | ||
92 | + | ||
93 | + public function actionCheckAppUpdate() | ||
94 | + { | ||
95 | + //actionCheckAppVersion | ||
96 | + $url = 'http://kingb:8012/app-api/web/checkAppVersion'; | ||
97 | + $params = [ | ||
98 | + 'barcode' => '0001000100010001', | ||
99 | + 'device_id' => 'DEVICE000001', | ||
100 | + 'current_version' => 'V1.0.1', | ||
101 | + 'package_name' => 'com.ota.app.pro', | ||
102 | + ]; | ||
103 | + | ||
104 | + $postResult = Http::POST($url, json_encode($params)); | ||
105 | + echo $postResult; | ||
106 | + } | ||
107 | + | ||
52 | } | 108 | } |
53 | 109 |
domain/device/Device.php
@@ -18,6 +18,22 @@ class Device | @@ -18,6 +18,22 @@ class Device | ||
18 | return $manufacture. $project. $model. $production; | 18 | return $manufacture. $project. $model. $production; |
19 | } | 19 | } |
20 | 20 | ||
21 | + static function explodeBarcode($barcode) | ||
22 | + { | ||
23 | + //建议格式: 0001 0001 0001 0001 | ||
24 | + //供参考 厂商ID 项目ID 型号ID 生产日期ID | ||
25 | + $len = mb_strlen($barcode); | ||
26 | + if ($len != 16) { | ||
27 | + return null; | ||
28 | + } | ||
29 | + $manufactureNo = mb_substr($barcode, 0, 4, 'utf-8'); | ||
30 | + $projectNo = mb_substr($barcode, 4, 4, 'utf-8'); | ||
31 | + $modelNo = mb_substr($barcode, 8, 4, 'utf-8'); | ||
32 | + $productionNo = mb_substr($barcode, 12, 4, 'utf-8'); | ||
33 | + | ||
34 | + return [$manufactureNo, $projectNo, $modelNo, $productionNo]; | ||
35 | + } | ||
36 | + | ||
21 | /** | 37 | /** |
22 | * @param $deviceId | 38 | * @param $deviceId |
23 | * @param $manufactureNo | 39 | * @param $manufactureNo |
@@ -41,7 +57,7 @@ class Device | @@ -41,7 +57,7 @@ class Device | ||
41 | return $e; | 57 | return $e; |
42 | } | 58 | } |
43 | $batchId = $batchModel->id; | 59 | $batchId = $batchModel->id; |
44 | - $count = DeviceRepository::rowsCount(['batch_id' => $batchId, 'is_delete' => 0]); | 60 | + $count = DeviceRepository::rowsCount(['batch_id' => $batchId, 'status' => DeviceStatus::HAS_AUTH, 'is_delete' => 0]); |
45 | 61 | ||
46 | if (($count *1) >= ($batchModel->num * 1)) { | 62 | if (($count *1) >= ($batchModel->num * 1)) { |
47 | // 超过了限制数,记录到另外一个表里面 | 63 | // 超过了限制数,记录到另外一个表里面 |
domain/device/DeviceAuthFailRepository.php
@@ -16,4 +16,50 @@ class DeviceAuthFailRepository | @@ -16,4 +16,50 @@ class DeviceAuthFailRepository | ||
16 | return DeviceAuthFailModel::findOne($condition); | 16 | return DeviceAuthFailModel::findOne($condition); |
17 | } | 17 | } |
18 | 18 | ||
19 | + | ||
20 | + /** | ||
21 | + * @param $where | ||
22 | + * @return array|\yii\db\ActiveRecord[] | ||
23 | + */ | ||
24 | + static function getList($where, $limit = 0, $offset = 0) | ||
25 | + { | ||
26 | + $deviceFind = DeviceAuthFailModel::find(); | ||
27 | + $deviceFind->alias('a'); | ||
28 | + $deviceFind->select(['a.*', 'm.name as manufacture','p.name as project','pd.name as production','mo.name as model']); | ||
29 | + $deviceFind->leftJoin('manufacture as m', 'm.manufacture_no = a.manufacture_no'); | ||
30 | + $deviceFind->leftJoin('project as p', 'p.project_no = a.project_no'); | ||
31 | + $deviceFind->leftJoin('model as mo', 'mo.model_no = a.model_no'); | ||
32 | + $deviceFind->leftJoin('production as pd', 'pd.production_no = a.production_no'); | ||
33 | + | ||
34 | + $deviceFind->where($where); | ||
35 | + $deviceFind->orderBy('created_at desc'); | ||
36 | + $deviceFind->asArray(); | ||
37 | + if ($offset) { | ||
38 | + $deviceFind->offset($offset); | ||
39 | + } | ||
40 | + if ($limit) { | ||
41 | + $deviceFind->limit($limit); | ||
42 | + } | ||
43 | + $all = $deviceFind->all(); | ||
44 | + | ||
45 | + return $all; | ||
46 | + } | ||
47 | + | ||
48 | + /** | ||
49 | + * @param $where | ||
50 | + * @return int|string | ||
51 | + */ | ||
52 | + static function getListCount($where) | ||
53 | + { | ||
54 | + $deviceFind = DeviceAuthFailModel::find(); | ||
55 | + $deviceFind->alias('a'); | ||
56 | + $deviceFind->leftJoin('manufacture as m', 'm.manufacture_no = a.manufacture_no'); | ||
57 | + $deviceFind->leftJoin('project as p', 'p.project_no = a.project_no'); | ||
58 | + $deviceFind->leftJoin('model as mo', 'mo.model_no = a.model_no'); | ||
59 | + $deviceFind->leftJoin('production as pd', 'pd.production_no = a.production_no'); | ||
60 | + $deviceFind->where($where); | ||
61 | + $all = $deviceFind->count(); | ||
62 | + | ||
63 | + return $all; | ||
64 | + } | ||
19 | } | 65 | } |
20 | \ No newline at end of file | 66 | \ No newline at end of file |
domain/device/DeviceRepository.php
@@ -23,6 +23,7 @@ class DeviceRepository | @@ -23,6 +23,7 @@ class DeviceRepository | ||
23 | $deviceFind->leftJoin('production as pd', 'pd.id = b.production_id'); | 23 | $deviceFind->leftJoin('production as pd', 'pd.id = b.production_id'); |
24 | 24 | ||
25 | $deviceFind->where($where); | 25 | $deviceFind->where($where); |
26 | + $deviceFind->orderBy('created_at desc'); | ||
26 | $deviceFind->asArray(); | 27 | $deviceFind->asArray(); |
27 | if ($offset) { | 28 | if ($offset) { |
28 | $deviceFind->offset($offset); | 29 | $deviceFind->offset($offset); |
@@ -0,0 +1,35 @@ | @@ -0,0 +1,35 @@ | ||
1 | +<?php | ||
2 | + | ||
3 | +namespace domain\device; | ||
4 | + | ||
5 | +use Yii; | ||
6 | +use domain\device\models\DeviceStats as DeviceStatsModel; | ||
7 | + | ||
8 | +class DeviceStats | ||
9 | +{ | ||
10 | + /** | ||
11 | + * @param $item | ||
12 | + * @return null | ||
13 | + */ | ||
14 | + static function create($item) | ||
15 | + { | ||
16 | + $createModel = Yii::createObject([ | ||
17 | + 'class' => DeviceStatsModel::className(), | ||
18 | + 'barcode' => $item['barcode'], | ||
19 | + 'device_id' => $item['device_id'], | ||
20 | + 'manufacture_id' => $item['manufacture_id'], | ||
21 | + 'project_id' => $item['project_id'], | ||
22 | + 'model_id' => $item['model_id'], | ||
23 | + 'software_version' => $item['software_version'], | ||
24 | + 'hardware_version' => $item['hardware_version'], | ||
25 | + 'timestamp' => $item['timestamp'], | ||
26 | + 'city' => $item['city'], | ||
27 | + 'ip' => $item['ip'] | ||
28 | + ]); | ||
29 | + if ($createModel->save()) { | ||
30 | + return $createModel; | ||
31 | + } else { | ||
32 | + return null; | ||
33 | + } | ||
34 | + } | ||
35 | +} | ||
0 | \ No newline at end of file | 36 | \ No newline at end of file |
@@ -0,0 +1,81 @@ | @@ -0,0 +1,81 @@ | ||
1 | +<?php | ||
2 | + | ||
3 | +namespace domain\device; | ||
4 | + | ||
5 | +use domain\device\models\Device as DeviceModel; | ||
6 | +use domain\device\models\DeviceStats as DeviceStatsModel; | ||
7 | +use domain\manufacturer\models\Manufacturer as ManufacturerModel; | ||
8 | +use domain\model\models\Model as ModelModel; | ||
9 | +use domain\project\models\Project as ProjectModel; | ||
10 | +use yii\db\Query; | ||
11 | + | ||
12 | +class DeviceStatsRepository | ||
13 | +{ | ||
14 | + /** | ||
15 | + * @param $condition | ||
16 | + * @return null|static | ||
17 | + */ | ||
18 | + static function findOne($condition) | ||
19 | + { | ||
20 | + return DeviceStatsModel::findOne($condition); | ||
21 | + } | ||
22 | + | ||
23 | + /** | ||
24 | + * 获取分页数据 | ||
25 | + * @param $where | ||
26 | + * @param $offset | ||
27 | + * @param $limit | ||
28 | + * @return array|\yii\db\ActiveRecord[] | ||
29 | + */ | ||
30 | + static function getPageList($where, $offset, $limit) | ||
31 | + { | ||
32 | + $upgradeFind = DeviceStatsModel::find()->alias("ds") | ||
33 | + ->select([ | ||
34 | + "ds.*", | ||
35 | + "mf.name as manufacture_name", | ||
36 | + 'de.serial_no', | ||
37 | + 'de.device_id as device_device_id', | ||
38 | + 'pj.name as project_name', | ||
39 | + 'md.name as model_name', | ||
40 | + ]); | ||
41 | + $upgradeFind->leftJoin(ManufacturerModel::tableName() . " mf", "mf.id = ds.manufacture_id"); | ||
42 | + $upgradeFind->leftJoin(DeviceModel::tableName() . " de", "de.id = ds.device_id"); | ||
43 | + $upgradeFind->leftJoin(ProjectModel::tableName() . " pj", "pj.id = ds.project_id"); | ||
44 | + $upgradeFind->leftJoin(ModelModel::tableName() . " md", "md.id = ds.model_id"); | ||
45 | + | ||
46 | + if (!empty($where)) { | ||
47 | + $upgradeFind->where($where); | ||
48 | + } | ||
49 | + if ($offset) { | ||
50 | + $upgradeFind->offset($offset); | ||
51 | + } | ||
52 | + if ($limit) { | ||
53 | + $upgradeFind->limit($limit); | ||
54 | + } | ||
55 | + $upgradeFind->orderBy("ds.id desc"); | ||
56 | + $upgradeFind->asArray(); | ||
57 | + $dataList = $upgradeFind->all(); | ||
58 | + | ||
59 | + return $dataList; | ||
60 | + } | ||
61 | + | ||
62 | + /** | ||
63 | + * 列表页面分页器数量 | ||
64 | + * @param string $map | ||
65 | + */ | ||
66 | + static function getPageCount($map = '') | ||
67 | + { | ||
68 | + $DeviceStatsFind = DeviceStatsModel::find()->alias("ds"); | ||
69 | + $DeviceStatsFind->leftJoin(ManufacturerModel::tableName() . " mf", "mf.id = ds.manufacture_id"); | ||
70 | + $DeviceStatsFind->leftJoin(DeviceModel::tableName() . " de", "de.id = ds.device_id"); | ||
71 | + $DeviceStatsFind->leftJoin(ProjectModel::tableName() . " pj", "pj.id = ds.project_id"); | ||
72 | + $DeviceStatsFind->leftJoin(ModelModel::tableName() . " md", "md.id = ds.model_id"); | ||
73 | + if (!empty($map)) { | ||
74 | + $DeviceStatsFind->where($map); | ||
75 | + } | ||
76 | + $pageCount = $DeviceStatsFind->count(); | ||
77 | + | ||
78 | + return $pageCount; | ||
79 | + } | ||
80 | + | ||
81 | +} | ||
0 | \ No newline at end of file | 82 | \ No newline at end of file |
@@ -0,0 +1,28 @@ | @@ -0,0 +1,28 @@ | ||
1 | +<?php | ||
2 | + | ||
3 | +namespace domain\device\models; | ||
4 | + | ||
5 | +use yii\behaviors\TimestampBehavior; | ||
6 | +use yii\db\ActiveRecord; | ||
7 | + | ||
8 | +class DeviceStats extends ActiveRecord | ||
9 | +{ | ||
10 | + /** | ||
11 | + * @inheritdoc | ||
12 | + */ | ||
13 | + public static function tableName() | ||
14 | + { | ||
15 | + return '{{%device_stats}}'; | ||
16 | + } | ||
17 | + | ||
18 | + public function behaviors() | ||
19 | + { | ||
20 | + return [ | ||
21 | + 'time' => [ | ||
22 | + 'class' => TimestampBehavior::className(), | ||
23 | + 'createdAtAttribute' => 'created_at', | ||
24 | + 'updatedAtAttribute' => 'updated_at', | ||
25 | + ] | ||
26 | + ]; | ||
27 | + } | ||
28 | +} | ||
0 | \ No newline at end of file | 29 | \ No newline at end of file |
domain/upgrade/Upgrade.php
@@ -20,7 +20,7 @@ class Upgrade | @@ -20,7 +20,7 @@ class Upgrade | ||
20 | static function create($item) | 20 | static function create($item) |
21 | { | 21 | { |
22 | try { | 22 | try { |
23 | - $findUpgradeModel = UpgradeModel::findOne(['version' => $item["version"], 'type' => $item["type"]]); | 23 | + $findUpgradeModel = UpgradeModel::findOne(['version' => $item["version"], 'manufacture_id' => $item["manufacture_id"], 'type' => $item["type"]]); |
24 | if (!empty($findUpgradeModel)) { | 24 | if (!empty($findUpgradeModel)) { |
25 | return -1; | 25 | return -1; |
26 | } | 26 | } |
domain/upgrade/UpgradeLog.php
@@ -48,6 +48,9 @@ class UpgradeLog | @@ -48,6 +48,9 @@ class UpgradeLog | ||
48 | if (isset($item["error_code"])) { | 48 | if (isset($item["error_code"])) { |
49 | $upgradeLogModel->error_code = $item["error_code"]; // 错误码 | 49 | $upgradeLogModel->error_code = $item["error_code"]; // 错误码 |
50 | } | 50 | } |
51 | + if (isset($item["timestamp"])) { | ||
52 | + $upgradeLogModel->timestamp = $item["timestamp"]; // | ||
53 | + } | ||
51 | if (isset($item["type"])) { | 54 | if (isset($item["type"])) { |
52 | $upgradeLogModel->type = $item["type"]; // 日志类型 1 app 2.ota整机 | 55 | $upgradeLogModel->type = $item["type"]; // 日志类型 1 app 2.ota整机 |
53 | } | 56 | } |