瀏覽代碼

报表上传到oss,预览套入,修复短链接

laiguoran 4 年之前
父節點
當前提交
3f33bde03e
共有 100 個文件被更改,包括 111398 次插入20 次删除
  1. 34 13
      app/controller/report_archive_controller.js
  2. 8 7
      app/extend/helper.js
  3. 237 0
      app/public/netcasign/example/appPackage.js
  4. 1 0
      app/public/netcasign/js/base64.min.js
  5. 615 0
      app/public/netcasign/js/debugger.js
  6. 506 0
      app/public/netcasign/js/json2.js
  7. 11012 0
      app/public/netcasign/js/netca-jquery-client.js
  8. 191 0
      app/public/netcasign/js/netcaseal.js
  9. 2047 0
      app/public/netcasign/js/netcasealpdf.js
  10. 2185 0
      app/public/netcasign/js/netcawebsocket.js
  11. 23599 0
      app/public/netcasign/js/pdf.js
  12. 1 0
      app/public/netcasign/js/pdf.js.map
  13. 55370 0
      app/public/netcasign/js/pdf.worker.js
  14. 1 0
      app/public/netcasign/js/pdf.worker.js.map
  15. 15580 0
      app/public/netcasign/js/viewer.js
  16. 1 0
      app/public/netcasign/js/viewer.js.map
  17. 二進制
      app/public/netcasign/ui/cmaps/78-EUC-H.bcmap
  18. 二進制
      app/public/netcasign/ui/cmaps/78-EUC-V.bcmap
  19. 二進制
      app/public/netcasign/ui/cmaps/78-H.bcmap
  20. 二進制
      app/public/netcasign/ui/cmaps/78-RKSJ-H.bcmap
  21. 二進制
      app/public/netcasign/ui/cmaps/78-RKSJ-V.bcmap
  22. 二進制
      app/public/netcasign/ui/cmaps/78-V.bcmap
  23. 二進制
      app/public/netcasign/ui/cmaps/78ms-RKSJ-H.bcmap
  24. 二進制
      app/public/netcasign/ui/cmaps/78ms-RKSJ-V.bcmap
  25. 二進制
      app/public/netcasign/ui/cmaps/83pv-RKSJ-H.bcmap
  26. 二進制
      app/public/netcasign/ui/cmaps/90ms-RKSJ-H.bcmap
  27. 二進制
      app/public/netcasign/ui/cmaps/90ms-RKSJ-V.bcmap
  28. 二進制
      app/public/netcasign/ui/cmaps/90msp-RKSJ-H.bcmap
  29. 二進制
      app/public/netcasign/ui/cmaps/90msp-RKSJ-V.bcmap
  30. 二進制
      app/public/netcasign/ui/cmaps/90pv-RKSJ-H.bcmap
  31. 二進制
      app/public/netcasign/ui/cmaps/90pv-RKSJ-V.bcmap
  32. 二進制
      app/public/netcasign/ui/cmaps/Add-H.bcmap
  33. 二進制
      app/public/netcasign/ui/cmaps/Add-RKSJ-H.bcmap
  34. 二進制
      app/public/netcasign/ui/cmaps/Add-RKSJ-V.bcmap
  35. 二進制
      app/public/netcasign/ui/cmaps/Add-V.bcmap
  36. 二進制
      app/public/netcasign/ui/cmaps/Adobe-CNS1-0.bcmap
  37. 二進制
      app/public/netcasign/ui/cmaps/Adobe-CNS1-1.bcmap
  38. 二進制
      app/public/netcasign/ui/cmaps/Adobe-CNS1-2.bcmap
  39. 二進制
      app/public/netcasign/ui/cmaps/Adobe-CNS1-3.bcmap
  40. 二進制
      app/public/netcasign/ui/cmaps/Adobe-CNS1-4.bcmap
  41. 二進制
      app/public/netcasign/ui/cmaps/Adobe-CNS1-5.bcmap
  42. 二進制
      app/public/netcasign/ui/cmaps/Adobe-CNS1-6.bcmap
  43. 二進制
      app/public/netcasign/ui/cmaps/Adobe-CNS1-UCS2.bcmap
  44. 二進制
      app/public/netcasign/ui/cmaps/Adobe-GB1-0.bcmap
  45. 二進制
      app/public/netcasign/ui/cmaps/Adobe-GB1-1.bcmap
  46. 二進制
      app/public/netcasign/ui/cmaps/Adobe-GB1-2.bcmap
  47. 二進制
      app/public/netcasign/ui/cmaps/Adobe-GB1-3.bcmap
  48. 二進制
      app/public/netcasign/ui/cmaps/Adobe-GB1-4.bcmap
  49. 二進制
      app/public/netcasign/ui/cmaps/Adobe-GB1-5.bcmap
  50. 二進制
      app/public/netcasign/ui/cmaps/Adobe-GB1-UCS2.bcmap
  51. 二進制
      app/public/netcasign/ui/cmaps/Adobe-Japan1-0.bcmap
  52. 二進制
      app/public/netcasign/ui/cmaps/Adobe-Japan1-1.bcmap
  53. 二進制
      app/public/netcasign/ui/cmaps/Adobe-Japan1-2.bcmap
  54. 二進制
      app/public/netcasign/ui/cmaps/Adobe-Japan1-3.bcmap
  55. 二進制
      app/public/netcasign/ui/cmaps/Adobe-Japan1-4.bcmap
  56. 二進制
      app/public/netcasign/ui/cmaps/Adobe-Japan1-5.bcmap
  57. 二進制
      app/public/netcasign/ui/cmaps/Adobe-Japan1-6.bcmap
  58. 二進制
      app/public/netcasign/ui/cmaps/Adobe-Japan1-UCS2.bcmap
  59. 二進制
      app/public/netcasign/ui/cmaps/Adobe-Korea1-0.bcmap
  60. 二進制
      app/public/netcasign/ui/cmaps/Adobe-Korea1-1.bcmap
  61. 二進制
      app/public/netcasign/ui/cmaps/Adobe-Korea1-2.bcmap
  62. 二進制
      app/public/netcasign/ui/cmaps/Adobe-Korea1-UCS2.bcmap
  63. 二進制
      app/public/netcasign/ui/cmaps/B5-H.bcmap
  64. 二進制
      app/public/netcasign/ui/cmaps/B5-V.bcmap
  65. 二進制
      app/public/netcasign/ui/cmaps/B5pc-H.bcmap
  66. 二進制
      app/public/netcasign/ui/cmaps/B5pc-V.bcmap
  67. 二進制
      app/public/netcasign/ui/cmaps/CNS-EUC-H.bcmap
  68. 二進制
      app/public/netcasign/ui/cmaps/CNS-EUC-V.bcmap
  69. 二進制
      app/public/netcasign/ui/cmaps/CNS1-H.bcmap
  70. 二進制
      app/public/netcasign/ui/cmaps/CNS1-V.bcmap
  71. 二進制
      app/public/netcasign/ui/cmaps/CNS2-H.bcmap
  72. 3 0
      app/public/netcasign/ui/cmaps/CNS2-V.bcmap
  73. 二進制
      app/public/netcasign/ui/cmaps/ETHK-B5-H.bcmap
  74. 二進制
      app/public/netcasign/ui/cmaps/ETHK-B5-V.bcmap
  75. 二進制
      app/public/netcasign/ui/cmaps/ETen-B5-H.bcmap
  76. 二進制
      app/public/netcasign/ui/cmaps/ETen-B5-V.bcmap
  77. 3 0
      app/public/netcasign/ui/cmaps/ETenms-B5-H.bcmap
  78. 二進制
      app/public/netcasign/ui/cmaps/ETenms-B5-V.bcmap
  79. 二進制
      app/public/netcasign/ui/cmaps/EUC-H.bcmap
  80. 二進制
      app/public/netcasign/ui/cmaps/EUC-V.bcmap
  81. 二進制
      app/public/netcasign/ui/cmaps/Ext-H.bcmap
  82. 二進制
      app/public/netcasign/ui/cmaps/Ext-RKSJ-H.bcmap
  83. 二進制
      app/public/netcasign/ui/cmaps/Ext-RKSJ-V.bcmap
  84. 二進制
      app/public/netcasign/ui/cmaps/Ext-V.bcmap
  85. 二進制
      app/public/netcasign/ui/cmaps/GB-EUC-H.bcmap
  86. 二進制
      app/public/netcasign/ui/cmaps/GB-EUC-V.bcmap
  87. 4 0
      app/public/netcasign/ui/cmaps/GB-H.bcmap
  88. 二進制
      app/public/netcasign/ui/cmaps/GB-V.bcmap
  89. 二進制
      app/public/netcasign/ui/cmaps/GBK-EUC-H.bcmap
  90. 二進制
      app/public/netcasign/ui/cmaps/GBK-EUC-V.bcmap
  91. 二進制
      app/public/netcasign/ui/cmaps/GBK2K-H.bcmap
  92. 二進制
      app/public/netcasign/ui/cmaps/GBK2K-V.bcmap
  93. 二進制
      app/public/netcasign/ui/cmaps/GBKp-EUC-H.bcmap
  94. 二進制
      app/public/netcasign/ui/cmaps/GBKp-EUC-V.bcmap
  95. 二進制
      app/public/netcasign/ui/cmaps/GBT-EUC-H.bcmap
  96. 二進制
      app/public/netcasign/ui/cmaps/GBT-EUC-V.bcmap
  97. 二進制
      app/public/netcasign/ui/cmaps/GBT-H.bcmap
  98. 二進制
      app/public/netcasign/ui/cmaps/GBT-V.bcmap
  99. 二進制
      app/public/netcasign/ui/cmaps/GBTpc-EUC-H.bcmap
  100. 0 0
      app/public/netcasign/ui/cmaps/GBTpc-EUC-V.bcmap

+ 34 - 13
app/controller/report_archive_controller.js

@@ -100,7 +100,17 @@ module.exports = app => {
                 const newName = uuidV1();
                 const fileName = newName + '.PDF';
                 // console.log('adding fileName: ' + fileName);
-                await ctx.helper.saveStreamFile(stream, path.join(this.app.baseDir, 'app', 'public/archive', fileName));
+                // await ctx.helper.saveStreamFile(stream, path.join(this.app.baseDir, 'app', 'public/archive', fileName));
+                const oss_result = await ctx.oss.put('archive/' + fileName, stream);
+                if (!(oss_result && oss_result.url && oss_result.res.status === 200)) {
+                    throw '上传文件失败';
+                }
+                // const url = await ctx.oss.delete('archive/52d3e7f0-c7fb-11eb-b8c2-51b890b95d23.PDF');
+                // console.log(url);
+                // const flag = true;
+                // if (flag) {
+                //     throw 'ok';
+                // }
                 const updateDate = new Date();
                 const montStr = (updateDate.getMonth() + 1) < 10 ? ('0' + (updateDate.getMonth() + 1)) : ((updateDate.getMonth() + 1));
                 const dateStr = (updateDate.getDate()) < 10 ? ('0' + (updateDate.getDate())) : ((updateDate.getDate()));
@@ -120,6 +130,8 @@ module.exports = app => {
                                         rmIdx = idx;
                                     }
                                 }
+                                // 同时删除oss文件
+                                await ctx.oss.delete('archive/' + item.items[rmIdx].uuid + '.PDF');
                                 item.items.splice(rmIdx, 1);
                             }
                             const newItem = { uuid: newName, updateDate_time: dtStr };
@@ -157,7 +169,12 @@ module.exports = app => {
                 const orgName = ctx.params.orgName;
                 const fileName = orgName + '.PDF';
                 console.log('updating fileName: ' + fileName);
-                await ctx.helper.saveStreamFile(stream, path.join(this.app.baseDir, 'app', 'public/archive', fileName));
+                // await ctx.helper.saveStreamFile(stream, path.join(this.app.baseDir, 'app', 'public/archive', fileName));
+                const oss_result = await ctx.oss.put('archive/' + fileName, stream);
+                if (!(oss_result && oss_result.url && oss_result.res.status === 200)) {
+                    throw '上传文件失败';
+                }
+
                 const updateDate = new Date();
                 const montStr = (updateDate.getMonth() + 1) < 10 ? ('0' + (updateDate.getMonth() + 1)) : ((updateDate.getMonth() + 1));
                 const dateStr = (updateDate.getDate()) < 10 ? ('0' + (updateDate.getDate())) : ((updateDate.getDate()));
@@ -207,17 +224,21 @@ module.exports = app => {
                 console.log('removing fileName: ' + fileName);
                 const fullName = path.join(this.app.baseDir, 'app', 'public/archive', fileName);
                 // await ctx.helper.saveStreamFile(stream, path.join(this.app.baseDir, 'app', 'public/archive', fileName));
-                fs.stat(fullName, function(err, data) {
-                    if (err) {
-                        console.log(err);
-                    } else {
-                        fs.unlink(fullName, function(err) {
-                            if (err) {
-                                console.log(err);
-                            }
-                        });
-                    }
-                });
+                // fs.stat(fullName, function(err, data) {
+                //     if (err) {
+                //         console.log(err);
+                //     } else {
+                //         fs.unlink(fullName, function(err) {
+                //             if (err) {
+                //                 console.log(err);
+                //             }
+                //         });
+                //     }
+                // });
+                const oss_result = await ctx.oss.delete('archive/' + fileName);
+                if (!(oss_result && oss_result.res.status === 204)) {
+                    throw '删除归档文件失败';
+                }
                 const orgArchiveList = await ctx.service.rptArchive.getPrjStgArchive(prjId, stgId);
                 if (orgArchiveList.length > 0) {
                     const contentArr = JSON.parse(orgArchiveList[0].content);

+ 8 - 7
app/extend/helper.js

@@ -1133,17 +1133,18 @@ module.exports = {
     },
 
     /**
-     * 短链接生成
+     * 短链接生成(暂停生成)
      * @param url
      * @return {*}
      */
     async urlToShort(url) {
-        const apiUrl = 'http://scn.ink/api/shorturl';
-        const data = {
-            url: encodeURI(url),
-        };
-        const result = await this.sendRequest(apiUrl, data, 'get');
-        return result && result.code === 200 && result.url ? result.url : url;
+        // const apiUrl = 'http://scn.ink/api/shorturl';
+        // const data = {
+        //     url: encodeURI(url),
+        // };
+        // const result = await this.sendRequest(apiUrl, data, 'get');
+        // return result && result.code === 200 && result.url ? result.url : url;
+        return url;
     },
 
     /**

+ 237 - 0
app/public/netcasign/example/appPackage.js

@@ -0,0 +1,237 @@
+// 下载文件
+function dataURLtoBlob(dataurl) {
+    var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
+        bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
+    while (n--) {
+        u8arr[n] = bstr.charCodeAt(n);
+    }
+    return new Blob([u8arr], { type: mime });
+}
+
+function downloadFile(blob, url, name){
+
+    if (window.navigator.msSaveBlob) {
+        try {
+            window.navigator.msSaveBlob(blob, name)
+        } catch (e) {
+            console.log(e);
+        }
+    } else {
+        // 谷歌浏览器 创建a标签 添加download属性下载
+        var a = document.createElement("a");
+        a.setAttribute("href",url);
+        a.setAttribute("download",name);
+        a.setAttribute("target","_blank");
+        var clickEvent = document.createEvent("MouseEvents"); //创建
+        clickEvent.initEvent("click", true, true);//初始化
+        a.dispatchEvent(clickEvent);//触发
+    }
+
+}
+
+function downloadFileByBase64(base64,name){
+    var myBlob = dataURLtoBlob(base64);
+    var myUrl = URL.createObjectURL(myBlob);
+    downloadFile(myBlob, myUrl,name)
+}
+
+function downloadNewFile(){
+    var base64 = NetcaPDFSeal.getSignPDFBytes();
+    var file = 'data:application/pdf;base64,' + base64;
+    var name = new Date();
+    name = name.getTime();
+    downloadFileByBase64(file, name+'.pdf');
+
+}
+
+
+
+
+// 演示功能
+function demonstrationFn(){
+
+    var obj = {
+
+        'netcasave':false,
+        'netcaFirstSeparator':false,
+        'netcaSecondSeparator':false,
+        'netcaThirdSeparaor':false,
+        'netcaSetting':false,
+        'netcaAbout':false
+    };
+    checkObjHasOwnProperty(obj);
+    hideExtraCheckboxesIE(obj);
+    removeExtraCheckboxes();
+    hideExtraCheckboxes();
+
+}
+
+
+/**检查obj是否有指定属性存在*/
+function checkObjHasOwnProperty(obj){
+    if(!obj.hasOwnProperty('openFile')){
+        obj.openFile = true
+    }
+    if(!obj.hasOwnProperty('netcasave')){
+        obj.netcasave = true
+    }
+    if(!obj.hasOwnProperty('viewFind')){
+        obj.viewFind = true
+    }
+    if(!obj.hasOwnProperty('zoomOut')){
+        obj.zoomOut = true
+    }
+    if(!obj.hasOwnProperty('zoomIn')){
+        obj.zoomIn = true
+    }
+    if(!obj.hasOwnProperty('scaleSelectContainer')){
+        obj.scaleSelectContainer = true
+    }
+    if(!obj.hasOwnProperty('netcaFirstSeparator')){
+        obj.netcaFirstSeparator = true
+    }
+    if(!obj.hasOwnProperty('previous')){
+        obj.previous = true
+    }
+    if(!obj.hasOwnProperty('next')){
+        obj.next = true
+    }
+    if(!obj.hasOwnProperty('netcaSecondSeparator')){
+        obj.netcaSecondSeparator = true
+    }
+    if(!obj.hasOwnProperty('verify')){
+        obj.verify = true
+    }
+    if(!obj.hasOwnProperty('netcasign')){
+        obj.netcasign = true
+    }
+    if(!obj.hasOwnProperty('netcaThirdSeparaor')){
+        obj.netcaThirdSeparaor = true
+    }
+    if(!obj.hasOwnProperty('netcaSetting')){
+        obj.netcaSetting = true
+    }
+    if(!obj.hasOwnProperty('netcaAbout')){
+        obj.netcaAbout = true
+    }
+    if(!obj.hasOwnProperty('netcastaff')){
+        obj.netcastaff = true
+    }
+    if(!obj.hasOwnProperty('netcaorganization')){
+        obj.netcaorganization = true
+    }
+    if(!obj.hasOwnProperty('netcalegalperson')){
+        obj.netcalegalperson = true
+    }
+    if(!obj.hasOwnProperty('print')){
+        obj.print = true
+    }
+    if(!obj.hasOwnProperty('closeFile')){
+        obj.closeFile = true
+    }
+}
+/**
+ * 非IE浏览器下,移除多余的checkbox
+ * */
+function removeExtraCheckboxes(){
+    var arr = [2,7,11,14,15,16];
+    if(!NetcaPDFSeal._isIE()){
+        for(var i=0;i<arr.length;i++){
+            (function(i){
+                $('input[name="checkbox'+arr[i]+'"]').parent().remove()
+            })(i);
+        }
+    }
+}
+/**
+ * 根据toolbarButton的true/false,隐藏多余的checkbox
+ * */
+function hideExtraCheckboxes(){
+    var arr1 = [4,5,6,8,9,10,12,13,20,21,22,23,24,28];
+    for(var j=0;j<arr1.length;j++){
+        (function(j){
+            if($('.netca_btn'+arr1[j]+'').css('display') === 'none'){
+                $('input[name="checkbox'+arr1[j]+'"]').parent().remove()
+            }
+        })(j);
+    }
+}
+/** IE 隐藏多余的checkbox
+ * */
+function hideExtraCheckboxesIE(obj) {
+    for (var k in obj) {
+        if(k === 'print' && obj[k] === false){
+            $('#checkbox20').parent().remove();
+        }
+        if(k === 'zoomOut' &&  obj[k] === false){
+            $('#checkbox4').parent().remove();
+        }
+        if(k === 'zoomIn' &&  obj[k] === false){
+            $('#checkbox5').parent().remove();
+        }
+        if(k === 'scaleSelectContainer' && obj[k] === false){
+            $('#checkbox6').parent().remove();
+        }
+        if(k === 'previous' && obj[k] === false){
+            $('#checkbox8').parent().remove();
+        }
+        if(k === 'next' && obj[k] === false){
+            $('#checkbox9').parent().remove();
+        }
+        if(k === 'netcapage' && obj[k] === false){
+            $('#checkbox10').parent().remove();
+        }
+        if(k === 'openFile' && obj[k] === false){
+            $('#checkbox1').parent().remove();
+        }
+        if(k === 'netcasave' && obj[k] === false){
+            $('#checkbox2').parent().remove();
+        }
+        if(k === 'viewFind' && obj[k] === false){
+            $('#checkbox3').parent().remove();
+        }
+        if(k === 'netcaFirstSeparator' && obj[k] === false){
+            $('#checkbox7').parent().remove();
+        }
+        if(k === 'netcaSecondSeparator' && obj[k] === false){
+            $('#checkbox11').parent().remove();
+        }
+        if(k === 'netcaThirdSeparaor' && obj[k] === false){
+            $('#checkbox14').parent().remove();
+        }
+        if(k === 'verfity' && obj[k] === false){
+            $('#checkbox13').parent().remove();
+        }
+        if(k === 'netcaSetting' && obj[k] === false){
+            $('#checkbox15').parent().remove();
+        }
+        if(k === 'netcaAbout' && obj[k] === false){
+            $('#checkbox16').parent().remove();
+        }
+        if(k === 'netcasign' && obj[k] === false){
+            $('#checkbox21').parent().remove();
+        }
+        if(k === 'netcastaff' && obj[k] === false){
+            $('#checkbox22').parent().remove();
+        }
+        if(k === 'netcaorganization' && obj[k] === false){
+            $('#checkbox23').parent().remove();
+        }
+        if(k === 'netcalegalperson' && obj[k] === false){
+            $('#checkbox24').parent().remove();
+        }
+        if(k === 'closeFile' && obj[k] === false){
+            $('#checkbox28').parent().remove();
+        }
+    }
+}
+
+function getSignCallBack(res){
+    console.log("签名信息", JSON.parse(res))
+}
+function getVerifyCallBack(res){
+    console.log("验证信息", JSON.parse(res))
+}
+// NetcaPDFSeal.setSignCallbackEvent(getSignCallBack);
+// NetcaPDFSeal.setVerifyCallbackEvent(getVerifyCallBack);
+

文件差異過大導致無法顯示
+ 1 - 0
app/public/netcasign/js/base64.min.js


+ 615 - 0
app/public/netcasign/js/debugger.js

@@ -0,0 +1,615 @@
+/* Copyright 2012 Mozilla Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/* eslint-disable no-var */
+
+'use strict';
+
+var FontInspector = (function FontInspectorClosure() {
+  var fonts, createObjectURL;
+  var active = false;
+  var fontAttribute = 'data-font-name';
+  function removeSelection() {
+    let divs = document.querySelectorAll(`span[${fontAttribute}]`);
+    for (let div of divs) {
+      div.className = '';
+    }
+  }
+  function resetSelection() {
+    let divs = document.querySelectorAll(`span[${fontAttribute}]`);
+    for (let div of divs) {
+      div.className = 'debuggerHideText';
+    }
+  }
+  function selectFont(fontName, show) {
+    let divs = document.querySelectorAll(`span[${fontAttribute}=${fontName}]`);
+    for (let div of divs) {
+      div.className = show ? 'debuggerShowText' : 'debuggerHideText';
+    }
+  }
+  function textLayerClick(e) {
+    if (!e.target.dataset.fontName ||
+        e.target.tagName.toUpperCase() !== 'SPAN') {
+      return;
+    }
+    var fontName = e.target.dataset.fontName;
+    var selects = document.getElementsByTagName('input');
+    for (var i = 0; i < selects.length; ++i) {
+      var select = selects[i];
+      if (select.dataset.fontName !== fontName) {
+        continue;
+      }
+      select.checked = !select.checked;
+      selectFont(fontName, select.checked);
+      select.scrollIntoView();
+    }
+  }
+  return {
+    // Properties/functions needed by PDFBug.
+    id: 'FontInspector',
+    name: 'Font Inspector',
+    panel: null,
+    manager: null,
+    init: function init(pdfjsLib) {
+      var panel = this.panel;
+      panel.setAttribute('style', 'padding: 5px;');
+      var tmp = document.createElement('button');
+      tmp.addEventListener('click', resetSelection);
+      tmp.textContent = 'Refresh';
+      panel.appendChild(tmp);
+
+      fonts = document.createElement('div');
+      panel.appendChild(fonts);
+
+      createObjectURL = pdfjsLib.createObjectURL;
+    },
+    cleanup: function cleanup() {
+      fonts.textContent = '';
+    },
+    enabled: false,
+    get active() {
+      return active;
+    },
+    set active(value) {
+      active = value;
+      if (active) {
+        document.body.addEventListener('click', textLayerClick, true);
+        resetSelection();
+      } else {
+        document.body.removeEventListener('click', textLayerClick, true);
+        removeSelection();
+      }
+    },
+    // FontInspector specific functions.
+    fontAdded: function fontAdded(fontObj, url) {
+      function properties(obj, list) {
+        var moreInfo = document.createElement('table');
+        for (var i = 0; i < list.length; i++) {
+          var tr = document.createElement('tr');
+          var td1 = document.createElement('td');
+          td1.textContent = list[i];
+          tr.appendChild(td1);
+          var td2 = document.createElement('td');
+          td2.textContent = obj[list[i]].toString();
+          tr.appendChild(td2);
+          moreInfo.appendChild(tr);
+        }
+        return moreInfo;
+      }
+      var moreInfo = properties(fontObj, ['name', 'type']);
+      var fontName = fontObj.loadedName;
+      var font = document.createElement('div');
+      var name = document.createElement('span');
+      name.textContent = fontName;
+      var download = document.createElement('a');
+      if (url) {
+        url = /url\(['"]?([^\)"']+)/.exec(url);
+        download.href = url[1];
+      } else if (fontObj.data) {
+        download.href = createObjectURL(fontObj.data, fontObj.mimeType);
+      }
+      download.textContent = 'Download';
+      var logIt = document.createElement('a');
+      logIt.href = '';
+      logIt.textContent = 'Log';
+      logIt.addEventListener('click', function(event) {
+        event.preventDefault();
+        console.log(fontObj);
+      });
+      var select = document.createElement('input');
+      select.setAttribute('type', 'checkbox');
+      select.dataset.fontName = fontName;
+      select.addEventListener('click', (function(select, fontName) {
+        return (function() {
+           selectFont(fontName, select.checked);
+        });
+      })(select, fontName));
+      font.appendChild(select);
+      font.appendChild(name);
+      font.appendChild(document.createTextNode(' '));
+      font.appendChild(download);
+      font.appendChild(document.createTextNode(' '));
+      font.appendChild(logIt);
+      font.appendChild(moreInfo);
+      fonts.appendChild(font);
+      // Somewhat of a hack, should probably add a hook for when the text layer
+      // is done rendering.
+      setTimeout(() => {
+        if (this.active) {
+          resetSelection();
+        }
+      }, 2000);
+    },
+  };
+})();
+
+var opMap;
+
+// Manages all the page steppers.
+var StepperManager = (function StepperManagerClosure() {
+  var steppers = [];
+  var stepperDiv = null;
+  var stepperControls = null;
+  var stepperChooser = null;
+  var breakPoints = Object.create(null);
+  return {
+    // Properties/functions needed by PDFBug.
+    id: 'Stepper',
+    name: 'Stepper',
+    panel: null,
+    manager: null,
+    init: function init(pdfjsLib) {
+      var self = this;
+      this.panel.setAttribute('style', 'padding: 5px;');
+      stepperControls = document.createElement('div');
+      stepperChooser = document.createElement('select');
+      stepperChooser.addEventListener('change', function(event) {
+        self.selectStepper(this.value);
+      });
+      stepperControls.appendChild(stepperChooser);
+      stepperDiv = document.createElement('div');
+      this.panel.appendChild(stepperControls);
+      this.panel.appendChild(stepperDiv);
+      if (sessionStorage.getItem('pdfjsBreakPoints')) {
+        breakPoints = JSON.parse(sessionStorage.getItem('pdfjsBreakPoints'));
+      }
+
+      opMap = Object.create(null);
+      for (var key in pdfjsLib.OPS) {
+        opMap[pdfjsLib.OPS[key]] = key;
+      }
+    },
+    cleanup: function cleanup() {
+      stepperChooser.textContent = '';
+      stepperDiv.textContent = '';
+      steppers = [];
+    },
+    enabled: false,
+    active: false,
+    // Stepper specific functions.
+    create: function create(pageIndex) {
+      var debug = document.createElement('div');
+      debug.id = 'stepper' + pageIndex;
+      debug.setAttribute('hidden', true);
+      debug.className = 'stepper';
+      stepperDiv.appendChild(debug);
+      var b = document.createElement('option');
+      b.textContent = 'Page ' + (pageIndex + 1);
+      b.value = pageIndex;
+      stepperChooser.appendChild(b);
+      var initBreakPoints = breakPoints[pageIndex] || [];
+      var stepper = new Stepper(debug, pageIndex, initBreakPoints);
+      steppers.push(stepper);
+      if (steppers.length === 1) {
+        this.selectStepper(pageIndex, false);
+      }
+      return stepper;
+    },
+    selectStepper: function selectStepper(pageIndex, selectPanel) {
+      var i;
+      pageIndex = pageIndex | 0;
+      if (selectPanel) {
+        this.manager.selectPanel(this);
+      }
+      for (i = 0; i < steppers.length; ++i) {
+        var stepper = steppers[i];
+        if (stepper.pageIndex === pageIndex) {
+          stepper.panel.removeAttribute('hidden');
+        } else {
+          stepper.panel.setAttribute('hidden', true);
+        }
+      }
+      var options = stepperChooser.options;
+      for (i = 0; i < options.length; ++i) {
+        var option = options[i];
+        option.selected = (option.value | 0) === pageIndex;
+      }
+    },
+    saveBreakPoints: function saveBreakPoints(pageIndex, bps) {
+      breakPoints[pageIndex] = bps;
+      sessionStorage.setItem('pdfjsBreakPoints', JSON.stringify(breakPoints));
+    },
+  };
+})();
+
+// The stepper for each page's IRQueue.
+var Stepper = (function StepperClosure() {
+  // Shorter way to create element and optionally set textContent.
+  function c(tag, textContent) {
+    var d = document.createElement(tag);
+    if (textContent) {
+      d.textContent = textContent;
+    }
+    return d;
+  }
+
+  function simplifyArgs(args) {
+    if (typeof args === 'string') {
+      var MAX_STRING_LENGTH = 75;
+      return args.length <= MAX_STRING_LENGTH ? args :
+        args.substring(0, MAX_STRING_LENGTH) + '...';
+    }
+    if (typeof args !== 'object' || args === null) {
+      return args;
+    }
+    if ('length' in args) { // array
+      var simpleArgs = [], i, ii;
+      var MAX_ITEMS = 10;
+      for (i = 0, ii = Math.min(MAX_ITEMS, args.length); i < ii; i++) {
+        simpleArgs.push(simplifyArgs(args[i]));
+      }
+      if (i < args.length) {
+        simpleArgs.push('...');
+      }
+      return simpleArgs;
+    }
+    var simpleObj = {};
+    for (var key in args) {
+      simpleObj[key] = simplifyArgs(args[key]);
+    }
+    return simpleObj;
+  }
+
+  function Stepper(panel, pageIndex, initialBreakPoints) {
+    this.panel = panel;
+    this.breakPoint = 0;
+    this.nextBreakPoint = null;
+    this.pageIndex = pageIndex;
+    this.breakPoints = initialBreakPoints;
+    this.currentIdx = -1;
+    this.operatorListIdx = 0;
+  }
+  Stepper.prototype = {
+    init: function init(operatorList) {
+      var panel = this.panel;
+      var content = c('div', 'c=continue, s=step');
+      var table = c('table');
+      content.appendChild(table);
+      table.cellSpacing = 0;
+      var headerRow = c('tr');
+      table.appendChild(headerRow);
+      headerRow.appendChild(c('th', 'Break'));
+      headerRow.appendChild(c('th', 'Idx'));
+      headerRow.appendChild(c('th', 'fn'));
+      headerRow.appendChild(c('th', 'args'));
+      panel.appendChild(content);
+      this.table = table;
+      this.updateOperatorList(operatorList);
+    },
+    updateOperatorList: function updateOperatorList(operatorList) {
+      var self = this;
+
+      function cboxOnClick() {
+        var x = +this.dataset.idx;
+        if (this.checked) {
+          self.breakPoints.push(x);
+        } else {
+          self.breakPoints.splice(self.breakPoints.indexOf(x), 1);
+        }
+        StepperManager.saveBreakPoints(self.pageIndex, self.breakPoints);
+      }
+
+      var MAX_OPERATORS_COUNT = 15000;
+      if (this.operatorListIdx > MAX_OPERATORS_COUNT) {
+        return;
+      }
+
+      var chunk = document.createDocumentFragment();
+      var operatorsToDisplay = Math.min(MAX_OPERATORS_COUNT,
+                                        operatorList.fnArray.length);
+      for (var i = this.operatorListIdx; i < operatorsToDisplay; i++) {
+        var line = c('tr');
+        line.className = 'line';
+        line.dataset.idx = i;
+        chunk.appendChild(line);
+        var checked = this.breakPoints.includes(i);
+        var args = operatorList.argsArray[i] || [];
+
+        var breakCell = c('td');
+        var cbox = c('input');
+        cbox.type = 'checkbox';
+        cbox.className = 'points';
+        cbox.checked = checked;
+        cbox.dataset.idx = i;
+        cbox.onclick = cboxOnClick;
+
+        breakCell.appendChild(cbox);
+        line.appendChild(breakCell);
+        line.appendChild(c('td', i.toString()));
+        var fn = opMap[operatorList.fnArray[i]];
+        var decArgs = args;
+        if (fn === 'showText') {
+          var glyphs = args[0];
+          var newArgs = [];
+          var str = [];
+          for (var j = 0; j < glyphs.length; j++) {
+            var glyph = glyphs[j];
+            if (typeof glyph === 'object' && glyph !== null) {
+              str.push(glyph.fontChar);
+            } else {
+              if (str.length > 0) {
+                newArgs.push(str.join(''));
+                str = [];
+              }
+              newArgs.push(glyph); // null or number
+            }
+          }
+          if (str.length > 0) {
+            newArgs.push(str.join(''));
+          }
+          decArgs = [newArgs];
+        }
+        line.appendChild(c('td', fn));
+        line.appendChild(c('td', JSON.stringify(simplifyArgs(decArgs))));
+      }
+      if (operatorsToDisplay < operatorList.fnArray.length) {
+        line = c('tr');
+        var lastCell = c('td', '...');
+        lastCell.colspan = 4;
+        chunk.appendChild(lastCell);
+      }
+      this.operatorListIdx = operatorList.fnArray.length;
+      this.table.appendChild(chunk);
+    },
+    getNextBreakPoint: function getNextBreakPoint() {
+      this.breakPoints.sort(function(a, b) {
+        return a - b;
+      });
+      for (var i = 0; i < this.breakPoints.length; i++) {
+        if (this.breakPoints[i] > this.currentIdx) {
+          return this.breakPoints[i];
+        }
+      }
+      return null;
+    },
+    breakIt: function breakIt(idx, callback) {
+      StepperManager.selectStepper(this.pageIndex, true);
+      var self = this;
+      var dom = document;
+      self.currentIdx = idx;
+      var listener = function(e) {
+        switch (e.keyCode) {
+          case 83: // step
+            dom.removeEventListener('keydown', listener);
+            self.nextBreakPoint = self.currentIdx + 1;
+            self.goTo(-1);
+            callback();
+            break;
+          case 67: // continue
+            dom.removeEventListener('keydown', listener);
+            var breakPoint = self.getNextBreakPoint();
+            self.nextBreakPoint = breakPoint;
+            self.goTo(-1);
+            callback();
+            break;
+        }
+      };
+      dom.addEventListener('keydown', listener);
+      self.goTo(idx);
+    },
+    goTo: function goTo(idx) {
+      var allRows = this.panel.getElementsByClassName('line');
+      for (var x = 0, xx = allRows.length; x < xx; ++x) {
+        var row = allRows[x];
+        if ((row.dataset.idx | 0) === idx) {
+          row.style.backgroundColor = 'rgb(251,250,207)';
+          row.scrollIntoView();
+        } else {
+          row.style.backgroundColor = null;
+        }
+      }
+    },
+  };
+  return Stepper;
+})();
+
+var Stats = (function Stats() {
+  var stats = [];
+  function clear(node) {
+    while (node.hasChildNodes()) {
+      node.removeChild(node.lastChild);
+    }
+  }
+  function getStatIndex(pageNumber) {
+    for (var i = 0, ii = stats.length; i < ii; ++i) {
+      if (stats[i].pageNumber === pageNumber) {
+        return i;
+      }
+    }
+    return false;
+  }
+  return {
+    // Properties/functions needed by PDFBug.
+    id: 'Stats',
+    name: 'Stats',
+    panel: null,
+    manager: null,
+    init(pdfjsLib) {
+      this.panel.setAttribute('style', 'padding: 5px;');
+    },
+    enabled: false,
+    active: false,
+    // Stats specific functions.
+    add(pageNumber, stat) {
+      if (!stat) {
+        return;
+      }
+      var statsIndex = getStatIndex(pageNumber);
+      if (statsIndex !== false) {
+        var b = stats[statsIndex];
+        this.panel.removeChild(b.div);
+        stats.splice(statsIndex, 1);
+      }
+      var wrapper = document.createElement('div');
+      wrapper.className = 'stats';
+      var title = document.createElement('div');
+      title.className = 'title';
+      title.textContent = 'Page: ' + pageNumber;
+      var statsDiv = document.createElement('div');
+      statsDiv.textContent = stat.toString();
+      wrapper.appendChild(title);
+      wrapper.appendChild(statsDiv);
+      stats.push({ pageNumber, div: wrapper, });
+      stats.sort(function(a, b) {
+        return a.pageNumber - b.pageNumber;
+      });
+      clear(this.panel);
+      for (var i = 0, ii = stats.length; i < ii; ++i) {
+        this.panel.appendChild(stats[i].div);
+      }
+    },
+    cleanup() {
+      stats = [];
+      clear(this.panel);
+    },
+  };
+})();
+
+// Manages all the debugging tools.
+window.PDFBug = (function PDFBugClosure() {
+  var panelWidth = 300;
+  var buttons = [];
+  var activePanel = null;
+
+  return {
+    tools: [
+      FontInspector,
+      StepperManager,
+      Stats
+    ],
+    enable(ids) {
+      var all = false, tools = this.tools;
+      if (ids.length === 1 && ids[0] === 'all') {
+        all = true;
+      }
+      for (var i = 0; i < tools.length; ++i) {
+        var tool = tools[i];
+        if (all || ids.includes(tool.id)) {
+          tool.enabled = true;
+        }
+      }
+      if (!all) {
+        // Sort the tools by the order they are enabled.
+        tools.sort(function(a, b) {
+          var indexA = ids.indexOf(a.id);
+          indexA = indexA < 0 ? tools.length : indexA;
+          var indexB = ids.indexOf(b.id);
+          indexB = indexB < 0 ? tools.length : indexB;
+          return indexA - indexB;
+        });
+      }
+    },
+    init(pdfjsLib, container) {
+      /*
+       * Basic Layout:
+       * PDFBug
+       *  Controls
+       *  Panels
+       *    Panel
+       *    Panel
+       *    ...
+       */
+      var ui = document.createElement('div');
+      ui.id = 'PDFBug';
+
+      var controls = document.createElement('div');
+      controls.setAttribute('class', 'controls');
+      ui.appendChild(controls);
+
+      var panels = document.createElement('div');
+      panels.setAttribute('class', 'panels');
+      ui.appendChild(panels);
+
+      container.appendChild(ui);
+      container.style.right = panelWidth + 'px';
+
+      // Initialize all the debugging tools.
+      var tools = this.tools;
+      var self = this;
+      for (var i = 0; i < tools.length; ++i) {
+        var tool = tools[i];
+        var panel = document.createElement('div');
+        var panelButton = document.createElement('button');
+        panelButton.textContent = tool.name;
+        panelButton.addEventListener('click', (function(selected) {
+          return function(event) {
+            event.preventDefault();
+            self.selectPanel(selected);
+          };
+        })(i));
+        controls.appendChild(panelButton);
+        panels.appendChild(panel);
+        tool.panel = panel;
+        tool.manager = this;
+        if (tool.enabled) {
+          tool.init(pdfjsLib);
+        } else {
+          panel.textContent = tool.name + ' is disabled. To enable add ' +
+                              ' "' + tool.id + '" to the pdfBug parameter ' +
+                              'and refresh (separate multiple by commas).';
+        }
+        buttons.push(panelButton);
+      }
+      this.selectPanel(0);
+    },
+    cleanup() {
+      for (var i = 0, ii = this.tools.length; i < ii; i++) {
+        if (this.tools[i].enabled) {
+          this.tools[i].cleanup();
+        }
+      }
+    },
+    selectPanel(index) {
+      if (typeof index !== 'number') {
+        index = this.tools.indexOf(index);
+      }
+      if (index === activePanel) {
+        return;
+      }
+      activePanel = index;
+      var tools = this.tools;
+      for (var j = 0; j < tools.length; ++j) {
+        if (j === index) {
+          buttons[j].setAttribute('class', 'active');
+          tools[j].active = true;
+          tools[j].panel.removeAttribute('hidden');
+        } else {
+          buttons[j].setAttribute('class', '');
+          tools[j].active = false;
+          tools[j].panel.setAttribute('hidden', 'true');
+        }
+      }
+    },
+  };
+})();

+ 506 - 0
app/public/netcasign/js/json2.js

@@ -0,0 +1,506 @@
+//  json2.js
+//  2016-10-28
+//  Public Domain.
+//  NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
+//  See http://www.JSON.org/js.html
+//  This code should be minified before deployment.
+//  See http://javascript.crockford.com/jsmin.html
+
+//  USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
+//  NOT CONTROL.
+
+//  This file creates a global JSON object containing two methods: stringify
+//  and parse. This file provides the ES5 JSON capability to ES3 systems.
+//  If a project might run on IE8 or earlier, then this file should be included.
+//  This file does nothing on ES5 systems.
+
+//      JSON.stringify(value, replacer, space)
+//          value       any JavaScript value, usually an object or array.
+//          replacer    an optional parameter that determines how object
+//                      values are stringified for objects. It can be a
+//                      function or an array of strings.
+//          space       an optional parameter that specifies the indentation
+//                      of nested structures. If it is omitted, the text will
+//                      be packed without extra whitespace. If it is a number,
+//                      it will specify the number of spaces to indent at each
+//                      level. If it is a string (such as "\t" or "&nbsp;"),
+//                      it contains the characters used to indent at each level.
+//          This method produces a JSON text from a JavaScript value.
+//          When an object value is found, if the object contains a toJSON
+//          method, its toJSON method will be called and the result will be
+//          stringified. A toJSON method does not serialize: it returns the
+//          value represented by the name/value pair that should be serialized,
+//          or undefined if nothing should be serialized. The toJSON method
+//          will be passed the key associated with the value, and this will be
+//          bound to the value.
+
+//          For example, this would serialize Dates as ISO strings.
+
+//              Date.prototype.toJSON = function (key) {
+//                  function f(n) {
+//                      // Format integers to have at least two digits.
+//                      return (n < 10)
+//                          ? "0" + n
+//                          : n;
+//                  }
+//                  return this.getUTCFullYear()   + "-" +
+//                       f(this.getUTCMonth() + 1) + "-" +
+//                       f(this.getUTCDate())      + "T" +
+//                       f(this.getUTCHours())     + ":" +
+//                       f(this.getUTCMinutes())   + ":" +
+//                       f(this.getUTCSeconds())   + "Z";
+//              };
+
+//          You can provide an optional replacer method. It will be passed the
+//          key and value of each member, with this bound to the containing
+//          object. The value that is returned from your method will be
+//          serialized. If your method returns undefined, then the member will
+//          be excluded from the serialization.
+
+//          If the replacer parameter is an array of strings, then it will be
+//          used to select the members to be serialized. It filters the results
+//          such that only members with keys listed in the replacer array are
+//          stringified.
+
+//          Values that do not have JSON representations, such as undefined or
+//          functions, will not be serialized. Such values in objects will be
+//          dropped; in arrays they will be replaced with null. You can use
+//          a replacer function to replace those with JSON values.
+
+//          JSON.stringify(undefined) returns undefined.
+
+//          The optional space parameter produces a stringification of the
+//          value that is filled with line breaks and indentation to make it
+//          easier to read.
+
+//          If the space parameter is a non-empty string, then that string will
+//          be used for indentation. If the space parameter is a number, then
+//          the indentation will be that many spaces.
+
+//          Example:
+
+//          text = JSON.stringify(["e", {pluribus: "unum"}]);
+//          // text is '["e",{"pluribus":"unum"}]'
+
+//          text = JSON.stringify(["e", {pluribus: "unum"}], null, "\t");
+//          // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
+
+//          text = JSON.stringify([new Date()], function (key, value) {
+//              return this[key] instanceof Date
+//                  ? "Date(" + this[key] + ")"
+//                  : value;
+//          });
+//          // text is '["Date(---current time---)"]'
+
+//      JSON.parse(text, reviver)
+//          This method parses a JSON text to produce an object or array.
+//          It can throw a SyntaxError exception.
+
+//          The optional reviver parameter is a function that can filter and
+//          transform the results. It receives each of the keys and values,
+//          and its return value is used instead of the original value.
+//          If it returns what it received, then the structure is not modified.
+//          If it returns undefined then the member is deleted.
+
+//          Example:
+
+//          // Parse the text. Values that look like ISO date strings will
+//          // be converted to Date objects.
+
+//          myData = JSON.parse(text, function (key, value) {
+//              var a;
+//              if (typeof value === "string") {
+//                  a =
+//   /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
+//                  if (a) {
+//                      return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
+//                          +a[5], +a[6]));
+//                  }
+//              }
+//              return value;
+//          });
+
+//          myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
+//              var d;
+//              if (typeof value === "string" &&
+//                      value.slice(0, 5) === "Date(" &&
+//                      value.slice(-1) === ")") {
+//                  d = new Date(value.slice(5, -1));
+//                  if (d) {
+//                      return d;
+//                  }
+//              }
+//              return value;
+//          });
+
+//  This is a reference implementation. You are free to copy, modify, or
+//  redistribute.
+
+/*jslint
+    eval, for, this
+*/
+
+/*property
+    JSON, apply, call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
+    getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
+    lastIndex, length, parse, prototype, push, replace, slice, stringify,
+    test, toJSON, toString, valueOf
+*/
+
+
+// Create a JSON object only if one does not already exist. We create the
+// methods in a closure to avoid creating global variables.
+
+if (typeof JSON !== "object") {
+    JSON = {};
+}
+
+(function () {
+    "use strict";
+
+    var rx_one = /^[\],:{}\s]*$/;
+    var rx_two = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g;
+    var rx_three = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g;
+    var rx_four = /(?:^|:|,)(?:\s*\[)+/g;
+    var rx_escapable = /[\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
+    var rx_dangerous = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
+
+    function f(n) {
+        // Format integers to have at least two digits.
+        return n < 10
+            ? "0" + n
+            : n;
+    }
+
+    function this_value() {
+        return this.valueOf();
+    }
+
+    if (typeof Date.prototype.toJSON !== "function") {
+
+        Date.prototype.toJSON = function () {
+
+            return isFinite(this.valueOf())
+                ? this.getUTCFullYear() + "-" +
+                        f(this.getUTCMonth() + 1) + "-" +
+                        f(this.getUTCDate()) + "T" +
+                        f(this.getUTCHours()) + ":" +
+                        f(this.getUTCMinutes()) + ":" +
+                        f(this.getUTCSeconds()) + "Z"
+                : null;
+        };
+
+        Boolean.prototype.toJSON = this_value;
+        Number.prototype.toJSON = this_value;
+        String.prototype.toJSON = this_value;
+    }
+
+    var gap;
+    var indent;
+    var meta;
+    var rep;
+
+
+    function quote(string) {
+
+// If the string contains no control characters, no quote characters, and no
+// backslash characters, then we can safely slap some quotes around it.
+// Otherwise we must also replace the offending characters with safe escape
+// sequences.
+
+        rx_escapable.lastIndex = 0;
+        return rx_escapable.test(string)
+            ? "\"" + string.replace(rx_escapable, function (a) {
+                var c = meta[a];
+                return typeof c === "string"
+                    ? c
+                    : "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
+            }) + "\""
+            : "\"" + string + "\"";
+    }
+
+
+    function str(key, holder) {
+
+// Produce a string from holder[key].
+
+        var i;          // The loop counter.
+        var k;          // The member key.
+        var v;          // The member value.
+        var length;
+        var mind = gap;
+        var partial;
+        var value = holder[key];
+
+// If the value has a toJSON method, call it to obtain a replacement value.
+
+        if (value && typeof value === "object" &&
+                typeof value.toJSON === "function") {
+            value = value.toJSON(key);
+        }
+
+// If we were called with a replacer function, then call the replacer to
+// obtain a replacement value.
+
+        if (typeof rep === "function") {
+            value = rep.call(holder, key, value);
+        }
+
+// What happens next depends on the value's type.
+
+        switch (typeof value) {
+        case "string":
+            return quote(value);
+
+        case "number":
+
+// JSON numbers must be finite. Encode non-finite numbers as null.
+
+            return isFinite(value)
+                ? String(value)
+                : "null";
+
+        case "boolean":
+        case "null":
+
+// If the value is a boolean or null, convert it to a string. Note:
+// typeof null does not produce "null". The case is included here in
+// the remote chance that this gets fixed someday.
+
+            return String(value);
+
+// If the type is "object", we might be dealing with an object or an array or
+// null.
+
+        case "object":
+
+// Due to a specification blunder in ECMAScript, typeof null is "object",
+// so watch out for that case.
+
+            if (!value) {
+                return "null";
+            }
+
+// Make an array to hold the partial results of stringifying this object value.
+
+            gap += indent;
+            partial = [];
+
+// Is the value an array?
+
+            if (Object.prototype.toString.apply(value) === "[object Array]") {
+
+// The value is an array. Stringify every element. Use null as a placeholder
+// for non-JSON values.
+
+                length = value.length;
+                for (i = 0; i < length; i += 1) {
+                    partial[i] = str(i, value) || "null";
+                }
+
+// Join all of the elements together, separated with commas, and wrap them in
+// brackets.
+
+                v = partial.length === 0
+                    ? "[]"
+                    : gap
+                        ? "[\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "]"
+                        : "[" + partial.join(",") + "]";
+                gap = mind;
+                return v;
+            }
+
+// If the replacer is an array, use it to select the members to be stringified.
+
+            if (rep && typeof rep === "object") {
+                length = rep.length;
+                for (i = 0; i < length; i += 1) {
+                    if (typeof rep[i] === "string") {
+                        k = rep[i];
+                        v = str(k, value);
+                        if (v) {
+                            partial.push(quote(k) + (
+                                gap
+                                    ? ": "
+                                    : ":"
+                            ) + v);
+                        }
+                    }
+                }
+            } else {
+
+// Otherwise, iterate through all of the keys in the object.
+
+                for (k in value) {
+                    if (Object.prototype.hasOwnProperty.call(value, k)) {
+                        v = str(k, value);
+                        if (v) {
+                            partial.push(quote(k) + (
+                                gap
+                                    ? ": "
+                                    : ":"
+                            ) + v);
+                        }
+                    }
+                }
+            }
+
+// Join all of the member texts together, separated with commas,
+// and wrap them in braces.
+
+            v = partial.length === 0
+                ? "{}"
+                : gap
+                    ? "{\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "}"
+                    : "{" + partial.join(",") + "}";
+            gap = mind;
+            return v;
+        }
+    }
+
+// If the JSON object does not yet have a stringify method, give it one.
+
+    if (typeof JSON.stringify !== "function") {
+        meta = {    // table of character substitutions
+            "\b": "\\b",
+            "\t": "\\t",
+            "\n": "\\n",
+            "\f": "\\f",
+            "\r": "\\r",
+            "\"": "\\\"",
+            "\\": "\\\\"
+        };
+        JSON.stringify = function (value, replacer, space) {
+
+// The stringify method takes a value and an optional replacer, and an optional
+// space parameter, and returns a JSON text. The replacer can be a function
+// that can replace values, or an array of strings that will select the keys.
+// A default replacer method can be provided. Use of the space parameter can
+// produce text that is more easily readable.
+
+            var i;
+            gap = "";
+            indent = "";
+
+// If the space parameter is a number, make an indent string containing that
+// many spaces.
+
+            if (typeof space === "number") {
+                for (i = 0; i < space; i += 1) {
+                    indent += " ";
+                }
+
+// If the space parameter is a string, it will be used as the indent string.
+
+            } else if (typeof space === "string") {
+                indent = space;
+            }
+
+// If there is a replacer, it must be a function or an array.
+// Otherwise, throw an error.
+
+            rep = replacer;
+            if (replacer && typeof replacer !== "function" &&
+                    (typeof replacer !== "object" ||
+                    typeof replacer.length !== "number")) {
+                throw new Error("JSON.stringify");
+            }
+
+// Make a fake root object containing our value under the key of "".
+// Return the result of stringifying the value.
+
+            return str("", {"": value});
+        };
+    }
+
+
+// If the JSON object does not yet have a parse method, give it one.
+
+    if (typeof JSON.parse !== "function") {
+        JSON.parse = function (text, reviver) {
+
+// The parse method takes a text and an optional reviver function, and returns
+// a JavaScript value if the text is a valid JSON text.
+
+            var j;
+
+            function walk(holder, key) {
+
+// The walk method is used to recursively walk the resulting structure so
+// that modifications can be made.
+
+                var k;
+                var v;
+                var value = holder[key];
+                if (value && typeof value === "object") {
+                    for (k in value) {
+                        if (Object.prototype.hasOwnProperty.call(value, k)) {
+                            v = walk(value, k);
+                            if (v !== undefined) {
+                                value[k] = v;
+                            } else {
+                                delete value[k];
+                            }
+                        }
+                    }
+                }
+                return reviver.call(holder, key, value);
+            }
+
+
+// Parsing happens in four stages. In the first stage, we replace certain
+// Unicode characters with escape sequences. JavaScript handles many characters
+// incorrectly, either silently deleting them, or treating them as line endings.
+
+            text = String(text);
+            rx_dangerous.lastIndex = 0;
+            if (rx_dangerous.test(text)) {
+                text = text.replace(rx_dangerous, function (a) {
+                    return "\\u" +
+                            ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
+                });
+            }
+
+// In the second stage, we run the text against regular expressions that look
+// for non-JSON patterns. We are especially concerned with "()" and "new"
+// because they can cause invocation, and "=" because it can cause mutation.
+// But just to be safe, we want to reject all unexpected forms.
+
+// We split the second stage into 4 regexp operations in order to work around
+// crippling inefficiencies in IE's and Safari's regexp engines. First we
+// replace the JSON backslash pairs with "@" (a non-JSON character). Second, we
+// replace all simple value tokens with "]" characters. Third, we delete all
+// open brackets that follow a colon or comma or that begin the text. Finally,
+// we look to see that the remaining characters are only whitespace or "]" or
+// "," or ":" or "{" or "}". If that is so, then the text is safe for eval.
+
+            if (
+                rx_one.test(
+                    text
+                        .replace(rx_two, "@")
+                        .replace(rx_three, "]")
+                        .replace(rx_four, "")
+                )
+            ) {
+
+// In the third stage we use the eval function to compile the text into a
+// JavaScript structure. The "{" operator is subject to a syntactic ambiguity
+// in JavaScript: it can begin a block or an object literal. We wrap the text
+// in parens to eliminate the ambiguity.
+
+                j = eval("(" + text + ")");
+
+// In the optional fourth stage, we recursively walk the new structure, passing
+// each name/value pair to a reviver function for possible transformation.
+
+                return (typeof reviver === "function")
+                    ? walk({"": j}, "")
+                    : j;
+            }
+
+// If the text is not JSON parseable, then a SyntaxError is thrown.
+
+            throw new SyntaxError("JSON.parse");
+        };
+    }
+}());

文件差異過大導致無法顯示
+ 11012 - 0
app/public/netcasign/js/netca-jquery-client.js


+ 191 - 0
app/public/netcasign/js/netcaseal.js

@@ -0,0 +1,191 @@
+
+/* 
+    Netca电子签章模块(V1.3.0)
+    版本 V1.0.0
+        提供基础的电子签章接口    
+
+    版本 V1.2.0  2019-10-07
+        提供关键字的印章接口
+
+    版本 V1.3.0  2020-03-03
+        提供获取签名域信息接口
+*/
+
+NetcaPKI.getSealClientVersion = function (params) {
+    var requestQueryParams = {};
+    requestQueryParams["appName"] = "SignatureCreator";
+    requestQueryParams["function"] = "GetSealClientVersion";
+    requestQueryParams["param"] = params;
+    return NetcaPKI.SendNetcaCryptoJsonRpcMessage(requestQueryParams);
+}
+
+NetcaPKI.getNetcaSealImage=function(params){
+    var requestQueryParams = {};
+    requestQueryParams["function"] ="GetNetcaSealImage";
+    requestQueryParams["param"] = params;
+    return NetcaPKI.SendNetcaCryptoJsonRpcMessage(requestQueryParams);
+}
+
+NetcaPKI.GetNetcaSealImage=function(params){
+    return NetcaPKI.getNetcaSealImage(params);
+}
+
+NetcaPKI.SignatureCreatorPdfSignSealFieldOrPosition = function(params)
+{
+    var requestQueryParams = {};
+    requestQueryParams["appName"] = "SignatureCreator";
+    requestQueryParams["function"] = "SignatureCreatorSignSeal";
+    requestQueryParams["param"] = params;
+    return NetcaPKI.SendNetcaCryptoJsonRpcMessage(requestQueryParams);
+}
+
+NetcaPKI.signatureCreatorSignSeal = function(params)
+{
+    var requestQueryParams = {};
+    requestQueryParams["appName"] = "SignatureCreator";
+    requestQueryParams["function"] = "SignatureCreatorSignSeal";
+    requestQueryParams["param"] = params;
+    return NetcaPKI.SendNetcaCryptoJsonRpcMessage(requestQueryParams);
+}
+
+NetcaPKI.SignatureCreatorPdfSignSealFieldOrPositionEx = function(params)
+{
+    var requestQueryParams = {};
+    requestQueryParams["appName"] = "SignatureCreator";
+    requestQueryParams["function"] = "SignatureCreatorSignSealEx";
+    requestQueryParams["param"] = params;
+    return NetcaPKI.SendNetcaCryptoJsonRpcMessage(requestQueryParams);
+}
+
+NetcaPKI.signatureCreatorSignSealEx = function(params)
+{
+    var requestQueryParams = {};
+    requestQueryParams["appName"] = "SignatureCreator";
+    requestQueryParams["function"] = "SignatureCreatorSignSealEx";
+    requestQueryParams["param"] = params;
+    return NetcaPKI.SendNetcaCryptoJsonRpcMessage(requestQueryParams);
+}
+
+NetcaPKI.SignatureCreatorSignSealEx = function(params)
+{
+    return NetcaPKI.signatureCreatorSignSealEx(params)
+}
+
+NetcaPKI.signatureVerifierVerifyPDF = function (params) {
+    var requestQueryParams = {};
+    requestQueryParams["appName"] = "SignatureCreator";
+    requestQueryParams["function"] = "SignatureVerifierVerifyPDF";
+    requestQueryParams["param"] = params;
+    return NetcaPKI.SendNetcaCryptoJsonRpcMessage(requestQueryParams);
+}
+
+NetcaPKI.signatureVerifierUndoPDF = function (params) {
+    var requestQueryParams = {};
+    requestQueryParams["appName"] = "SignatureCreator";
+    requestQueryParams["function"] = "SignatureVerifierUndoPDF";
+    requestQueryParams["param"] = params;
+    return NetcaPKI.SendNetcaCryptoJsonRpcMessage(requestQueryParams);
+}
+
+NetcaPKI.Custom_PdfSignAndUpload=function(params){
+	var requestQueryParams = {};
+    requestQueryParams["function"] ="Custom_PdfSignAndUploadByBytes";
+    requestQueryParams["param"] = params;
+    return NetcaPKI.SendNetcaCryptoJsonRpcMessage(requestQueryParams);
+}
+
+NetcaPKI.custom_PdfSignAndUploadByBytes=function(params){
+	var requestQueryParams = {};
+    requestQueryParams["function"] ="Custom_PdfSignAndUploadByBytes";
+    requestQueryParams["param"] = params;
+    return NetcaPKI.SendNetcaCryptoJsonRpcMessage(requestQueryParams);
+}
+
+NetcaPKI.Custom_PdfSignAndUploadByURL=function(params){
+	var requestQueryParams = {};
+    requestQueryParams["function"] ="Custom_PdfSignAndUploadByURL";
+    requestQueryParams["param"] = params;
+    return NetcaPKI.SendNetcaCryptoJsonRpcMessage(requestQueryParams);
+}
+
+NetcaPKI.getSignatureFieldInfo=function(params){
+	var requestQueryParams = {};
+    requestQueryParams["appName"] = "SignatureCreator";
+    requestQueryParams["function"] ="GetSignatureFieldInfo";
+    requestQueryParams["param"] = params;
+    return NetcaPKI.SendNetcaCryptoJsonRpcMessage(requestQueryParams);
+}
+NetcaPKI.SelectSealSigntureInfoWithDispaly=function(params){
+    var requestQueryParams = {};
+    requestQueryParams["appName"] = "SignatureCreator";
+    requestQueryParams["function"] ="SelectSealSigntureInfoWithDispaly";
+    requestQueryParams["param"] = params;
+    return NetcaPKI.SendNetcaCryptoJsonRpcMessage(requestQueryParams);
+}
+NetcaPKI.getSealConfigInfo=function(params){
+    var requestQueryParams = {};
+    requestQueryParams["appName"] = "SignatureCreator";
+    requestQueryParams["function"] ="GetSealConfigInfo";
+    requestQueryParams["param"] = params;
+    return NetcaPKI.SendNetcaCryptoJsonRpcMessage(requestQueryParams);
+}
+NetcaPKI.printPDF=function(params){
+    var requestQueryParams = {};
+    requestQueryParams["appName"] = "SignatureCreator";
+    requestQueryParams["function"] ="PrintPDF";
+    requestQueryParams["param"] = params;
+    return NetcaPKI.SendNetcaCryptoJsonRpcMessage(requestQueryParams);
+}
+NetcaPKI.signatureCreatorBatchSeal=function(params){
+    var requestQueryParams = {};
+    requestQueryParams["appName"] = "SignatureCreator";
+    requestQueryParams["function"] ="SignatureCreatorBatchSeal";
+    requestQueryParams["param"] = params;
+    return NetcaPKI.SendNetcaCryptoJsonRpcMessage(requestQueryParams);
+}
+NetcaPKI.signatureCreatorAcrossPageSeal=function(params){
+    var requestQueryParams = {};
+    requestQueryParams["appName"] = "SignatureCreator";
+    requestQueryParams["function"] ="SignatureCreatorAcrossPageSeal";
+    requestQueryParams["param"] = params;
+    return NetcaPKI.SendNetcaCryptoJsonRpcMessage(requestQueryParams);
+}
+NetcaPKI.getPdfPageInfo=function(params){
+    var requestQueryParams = {};
+    requestQueryParams["appName"] = "SignatureCreator";
+    requestQueryParams["function"] ="GetPdfPageInfo";
+    requestQueryParams["param"] = params;
+    return NetcaPKI.SendNetcaCryptoJsonRpcMessage(requestQueryParams);
+}
+
+NetcaPKI.createStream=function(params){
+    var requestQueryParams = {};
+    requestQueryParams["appName"] = "SignatureCreator";
+    requestQueryParams["function"] ="CreateStream";
+    requestQueryParams["param"] = params;
+    return NetcaPKI.SendNetcaCryptoJsonRpcMessage(requestQueryParams);
+}
+
+NetcaPKI.writeStream=function(params){
+    var requestQueryParams = {};
+    requestQueryParams["appName"] = "SignatureCreator";
+    requestQueryParams["function"] ="WriteStream";
+    requestQueryParams["param"] = params;
+    return NetcaPKI.SendNetcaCryptoJsonRpcMessage(requestQueryParams);
+}
+
+NetcaPKI.destoryStream=function(params){
+    var requestQueryParams = {};
+    requestQueryParams["appName"] = "SignatureCreator";
+    requestQueryParams["function"] ="DestoryStream";
+    requestQueryParams["param"] = params;
+    return NetcaPKI.SendNetcaCryptoJsonRpcMessage(requestQueryParams);
+}
+
+NetcaPKI.readStream=function(params){
+    var requestQueryParams = {};
+    requestQueryParams["appName"] = "SignatureCreator";
+    requestQueryParams["function"] ="ReadStream";
+    requestQueryParams["param"] = params;
+    return NetcaPKI.SendNetcaCryptoJsonRpcMessage(requestQueryParams);
+}

文件差異過大導致無法顯示
+ 2047 - 0
app/public/netcasign/js/netcasealpdf.js


文件差異過大導致無法顯示
+ 2185 - 0
app/public/netcasign/js/netcawebsocket.js


文件差異過大導致無法顯示
+ 23599 - 0
app/public/netcasign/js/pdf.js


文件差異過大導致無法顯示
+ 1 - 0
app/public/netcasign/js/pdf.js.map


文件差異過大導致無法顯示
+ 55370 - 0
app/public/netcasign/js/pdf.worker.js


文件差異過大導致無法顯示
+ 1 - 0
app/public/netcasign/js/pdf.worker.js.map


文件差異過大導致無法顯示
+ 15580 - 0
app/public/netcasign/js/viewer.js


文件差異過大導致無法顯示
+ 1 - 0
app/public/netcasign/js/viewer.js.map


二進制
app/public/netcasign/ui/cmaps/78-EUC-H.bcmap


二進制
app/public/netcasign/ui/cmaps/78-EUC-V.bcmap


二進制
app/public/netcasign/ui/cmaps/78-H.bcmap


二進制
app/public/netcasign/ui/cmaps/78-RKSJ-H.bcmap


二進制
app/public/netcasign/ui/cmaps/78-RKSJ-V.bcmap


二進制
app/public/netcasign/ui/cmaps/78-V.bcmap


二進制
app/public/netcasign/ui/cmaps/78ms-RKSJ-H.bcmap


二進制
app/public/netcasign/ui/cmaps/78ms-RKSJ-V.bcmap


二進制
app/public/netcasign/ui/cmaps/83pv-RKSJ-H.bcmap


二進制
app/public/netcasign/ui/cmaps/90ms-RKSJ-H.bcmap


二進制
app/public/netcasign/ui/cmaps/90ms-RKSJ-V.bcmap


二進制
app/public/netcasign/ui/cmaps/90msp-RKSJ-H.bcmap


二進制
app/public/netcasign/ui/cmaps/90msp-RKSJ-V.bcmap


二進制
app/public/netcasign/ui/cmaps/90pv-RKSJ-H.bcmap


二進制
app/public/netcasign/ui/cmaps/90pv-RKSJ-V.bcmap


二進制
app/public/netcasign/ui/cmaps/Add-H.bcmap


二進制
app/public/netcasign/ui/cmaps/Add-RKSJ-H.bcmap


二進制
app/public/netcasign/ui/cmaps/Add-RKSJ-V.bcmap


二進制
app/public/netcasign/ui/cmaps/Add-V.bcmap


二進制
app/public/netcasign/ui/cmaps/Adobe-CNS1-0.bcmap


二進制
app/public/netcasign/ui/cmaps/Adobe-CNS1-1.bcmap


二進制
app/public/netcasign/ui/cmaps/Adobe-CNS1-2.bcmap


二進制
app/public/netcasign/ui/cmaps/Adobe-CNS1-3.bcmap


二進制
app/public/netcasign/ui/cmaps/Adobe-CNS1-4.bcmap


二進制
app/public/netcasign/ui/cmaps/Adobe-CNS1-5.bcmap


二進制
app/public/netcasign/ui/cmaps/Adobe-CNS1-6.bcmap


二進制
app/public/netcasign/ui/cmaps/Adobe-CNS1-UCS2.bcmap


二進制
app/public/netcasign/ui/cmaps/Adobe-GB1-0.bcmap


二進制
app/public/netcasign/ui/cmaps/Adobe-GB1-1.bcmap


二進制
app/public/netcasign/ui/cmaps/Adobe-GB1-2.bcmap


二進制
app/public/netcasign/ui/cmaps/Adobe-GB1-3.bcmap


二進制
app/public/netcasign/ui/cmaps/Adobe-GB1-4.bcmap


二進制
app/public/netcasign/ui/cmaps/Adobe-GB1-5.bcmap


二進制
app/public/netcasign/ui/cmaps/Adobe-GB1-UCS2.bcmap


二進制
app/public/netcasign/ui/cmaps/Adobe-Japan1-0.bcmap


二進制
app/public/netcasign/ui/cmaps/Adobe-Japan1-1.bcmap


二進制
app/public/netcasign/ui/cmaps/Adobe-Japan1-2.bcmap


二進制
app/public/netcasign/ui/cmaps/Adobe-Japan1-3.bcmap


二進制
app/public/netcasign/ui/cmaps/Adobe-Japan1-4.bcmap


二進制
app/public/netcasign/ui/cmaps/Adobe-Japan1-5.bcmap


二進制
app/public/netcasign/ui/cmaps/Adobe-Japan1-6.bcmap


二進制
app/public/netcasign/ui/cmaps/Adobe-Japan1-UCS2.bcmap


二進制
app/public/netcasign/ui/cmaps/Adobe-Korea1-0.bcmap


二進制
app/public/netcasign/ui/cmaps/Adobe-Korea1-1.bcmap


二進制
app/public/netcasign/ui/cmaps/Adobe-Korea1-2.bcmap


二進制
app/public/netcasign/ui/cmaps/Adobe-Korea1-UCS2.bcmap


二進制
app/public/netcasign/ui/cmaps/B5-H.bcmap


二進制
app/public/netcasign/ui/cmaps/B5-V.bcmap


二進制
app/public/netcasign/ui/cmaps/B5pc-H.bcmap


二進制
app/public/netcasign/ui/cmaps/B5pc-V.bcmap


二進制
app/public/netcasign/ui/cmaps/CNS-EUC-H.bcmap


二進制
app/public/netcasign/ui/cmaps/CNS-EUC-V.bcmap


二進制
app/public/netcasign/ui/cmaps/CNS1-H.bcmap


二進制
app/public/netcasign/ui/cmaps/CNS1-V.bcmap


二進制
app/public/netcasign/ui/cmaps/CNS2-H.bcmap


+ 3 - 0
app/public/netcasign/ui/cmaps/CNS2-V.bcmap

@@ -0,0 +1,3 @@
+àRCopyright 1990-2009 Adobe Systems Incorporated.
+All rights reserved.
+See ./LICENSEáCNS2-H

二進制
app/public/netcasign/ui/cmaps/ETHK-B5-H.bcmap


二進制
app/public/netcasign/ui/cmaps/ETHK-B5-V.bcmap


二進制
app/public/netcasign/ui/cmaps/ETen-B5-H.bcmap


二進制
app/public/netcasign/ui/cmaps/ETen-B5-V.bcmap


+ 3 - 0
app/public/netcasign/ui/cmaps/ETenms-B5-H.bcmap

@@ -0,0 +1,3 @@
+àRCopyright 1990-2009 Adobe Systems Incorporated.
+All rights reserved.
+See ./LICENSEá	ETen-B5-H` ^

二進制
app/public/netcasign/ui/cmaps/ETenms-B5-V.bcmap


二進制
app/public/netcasign/ui/cmaps/EUC-H.bcmap


二進制
app/public/netcasign/ui/cmaps/EUC-V.bcmap


二進制
app/public/netcasign/ui/cmaps/Ext-H.bcmap


二進制
app/public/netcasign/ui/cmaps/Ext-RKSJ-H.bcmap


二進制
app/public/netcasign/ui/cmaps/Ext-RKSJ-V.bcmap


二進制
app/public/netcasign/ui/cmaps/Ext-V.bcmap


二進制
app/public/netcasign/ui/cmaps/GB-EUC-H.bcmap


二進制
app/public/netcasign/ui/cmaps/GB-EUC-V.bcmap


+ 4 - 0
app/public/netcasign/ui/cmaps/GB-H.bcmap

@@ -0,0 +1,4 @@
+àRCopyright 1990-2009 Adobe Systems Incorporated.
+All rights reserved.
+See ./LICENSE!!�º]aX!!]`�21�>	�p�z�$]‚�"R‚d�-Uƒ7�*„
4„%�+ „Z „{�/…%…<�9K…b�1]†.�"‡‰`]‡,�"]ˆ
+�"]ˆh�"]‰F�"]Š$�"]‹�"]‹`�"]Œ>�"]��"]�z�"]ŽX�"]�6�"]��"]�r�"]‘P�"]’.�"]“�"]“j�"]”H�"]•&�"]–�"]–b�"]—@�"]˜�"]˜|�"]™Z�"]š8�"]›�"]›t�"]œR�"]�0�"]ž�"]žl�"]ŸJ�"] (�"]¡�"]¡d�"]¢B�"]£ �"X£~�']¤W�"]¥5�"]¦�"]¦q�"]§O�"]¨-�"]©�"]©i�"]ªG�"]«%�"]¬�"]¬a�"]­?�"]®�"]®{�"]¯Y�"]°7�"]±�"]±s�"]²Q�"]³/�"]´
�"]´k�"]µI�"]¶'�"]·�"]·c�"]¸A�"]¹�"]¹}�"]º[�"]»9

二進制
app/public/netcasign/ui/cmaps/GB-V.bcmap


二進制
app/public/netcasign/ui/cmaps/GBK-EUC-H.bcmap


二進制
app/public/netcasign/ui/cmaps/GBK-EUC-V.bcmap


二進制
app/public/netcasign/ui/cmaps/GBK2K-H.bcmap


二進制
app/public/netcasign/ui/cmaps/GBK2K-V.bcmap


二進制
app/public/netcasign/ui/cmaps/GBKp-EUC-H.bcmap


二進制
app/public/netcasign/ui/cmaps/GBKp-EUC-V.bcmap


二進制
app/public/netcasign/ui/cmaps/GBT-EUC-H.bcmap


二進制
app/public/netcasign/ui/cmaps/GBT-EUC-V.bcmap


二進制
app/public/netcasign/ui/cmaps/GBT-H.bcmap


二進制
app/public/netcasign/ui/cmaps/GBT-V.bcmap


二進制
app/public/netcasign/ui/cmaps/GBTpc-EUC-H.bcmap


+ 0 - 0
app/public/netcasign/ui/cmaps/GBTpc-EUC-V.bcmap


部分文件因文件數量過多而無法顯示