2021-09-12 11:11:48 +00:00
/*! xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */
/* vim: set ts=2: */
/*exported XLSX */
2022-03-16 03:18:09 +00:00
/*global process:false, Buffer:false, ArrayBuffer:false, DataView:false, Deno:false */
2021-09-12 11:11:48 +00:00
var XLSX = { } ;
2023-04-18 03:39:28 +00:00
XLSX . version = '0.19.3' ;
2021-09-12 11:11:48 +00:00
var current _codepage = 1200 , current _ansi = 1252 ;
2022-05-22 23:51:41 +00:00
/*:: declare var cptable:any; */
/*global cptable:true, window */
var $cptable ;
2021-09-12 11:11:48 +00:00
2022-03-11 05:29:05 +00:00
var VALID _ANSI = [ 874 , 932 , 936 , 949 , 950 , 1250 , 1251 , 1252 , 1253 , 1254 , 1255 , 1256 , 1257 , 1258 , 10000 ] ;
2021-09-12 11:11:48 +00:00
/* ECMA-376 Part I 18.4.1 charset to codepage mapping */
var CS2CP = ( {
/*::[*/ 0 /*::]*/ : 1252 , /* ANSI */
/*::[*/ 1 /*::]*/ : 65001 , /* DEFAULT */
/*::[*/ 2 /*::]*/ : 65001 , /* SYMBOL */
/*::[*/ 77 /*::]*/ : 10000 , /* MAC */
/*::[*/ 128 /*::]*/ : 932 , /* SHIFTJIS */
/*::[*/ 129 /*::]*/ : 949 , /* HANGUL */
/*::[*/ 130 /*::]*/ : 1361 , /* JOHAB */
/*::[*/ 134 /*::]*/ : 936 , /* GB2312 */
/*::[*/ 136 /*::]*/ : 950 , /* CHINESEBIG5 */
/*::[*/ 161 /*::]*/ : 1253 , /* GREEK */
/*::[*/ 162 /*::]*/ : 1254 , /* TURKISH */
/*::[*/ 163 /*::]*/ : 1258 , /* VIETNAMESE */
/*::[*/ 177 /*::]*/ : 1255 , /* HEBREW */
/*::[*/ 178 /*::]*/ : 1256 , /* ARABIC */
/*::[*/ 186 /*::]*/ : 1257 , /* BALTIC */
/*::[*/ 204 /*::]*/ : 1251 , /* RUSSIAN */
/*::[*/ 222 /*::]*/ : 874 , /* THAI */
/*::[*/ 238 /*::]*/ : 1250 , /* EASTEUROPE */
/*::[*/ 255 /*::]*/ : 1252 , /* OEM */
/*::[*/ 69 /*::]*/ : 6969 /* MISC */
} /*:any*/ ) ;
var set _ansi = function ( cp /*:number*/ ) { if ( VALID _ANSI . indexOf ( cp ) == - 1 ) return ; current _ansi = CS2CP [ 0 ] = cp ; } ;
function reset _ansi ( ) { set _ansi ( 1252 ) ; }
var set _cp = function ( cp /*:number*/ ) { current _codepage = cp ; set _ansi ( cp ) ; } ;
function reset _cp ( ) { set _cp ( 1200 ) ; reset _ansi ( ) ; }
function char _codes ( data /*:string*/ ) /*:Array<number>*/ { var o /*:Array<number>*/ = [ ] ; for ( var i = 0 , len = data . length ; i < len ; ++ i ) o [ i ] = data . charCodeAt ( i ) ; return o ; }
function utf16leread ( data /*:string*/ ) /*:string*/ {
var o /*:Array<string>*/ = [ ] ;
for ( var i = 0 ; i < ( data . length >> 1 ) ; ++ i ) o [ i ] = String . fromCharCode ( data . charCodeAt ( 2 * i ) + ( data . charCodeAt ( 2 * i + 1 ) << 8 ) ) ;
return o . join ( "" ) ;
}
2023-03-15 08:17:09 +00:00
function utf16lereadu ( data /*:Uint8Array*/ ) /*:string*/ {
var o /*:Array<string>*/ = [ ] ;
for ( var i = 0 ; i < ( data . length >> 1 ) ; ++ i ) o [ i ] = String . fromCharCode ( data [ 2 * i ] + ( data [ 2 * i + 1 ] << 8 ) ) ;
return o . join ( "" ) ;
}
2021-09-12 11:11:48 +00:00
function utf16beread ( data /*:string*/ ) /*:string*/ {
var o /*:Array<string>*/ = [ ] ;
for ( var i = 0 ; i < ( data . length >> 1 ) ; ++ i ) o [ i ] = String . fromCharCode ( data . charCodeAt ( 2 * i + 1 ) + ( data . charCodeAt ( 2 * i ) << 8 ) ) ;
return o . join ( "" ) ;
}
var debom = function ( data /*:string*/ ) /*:string*/ {
var c1 = data . charCodeAt ( 0 ) , c2 = data . charCodeAt ( 1 ) ;
if ( c1 == 0xFF && c2 == 0xFE ) return utf16leread ( data . slice ( 2 ) ) ;
if ( c1 == 0xFE && c2 == 0xFF ) return utf16beread ( data . slice ( 2 ) ) ;
if ( c1 == 0xFEFF ) return data . slice ( 1 ) ;
return data ;
} ;
var _getchar = function _gc1 ( x /*:number*/ ) /*:string*/ { return String . fromCharCode ( x ) ; } ;
var _getansi = function _ga1 ( x /*:number*/ ) /*:string*/ { return String . fromCharCode ( x ) ; } ;
2022-02-12 06:31:47 +00:00
2022-03-11 05:29:05 +00:00
function set _cptable ( cptable ) {
$cptable = cptable ;
2022-02-12 06:31:47 +00:00
set _cp = function ( cp /*:number*/ ) { current _codepage = cp ; set _ansi ( cp ) ; } ;
debom = function ( data /*:string*/ ) {
2022-03-11 05:29:05 +00:00
if ( data . charCodeAt ( 0 ) === 0xFF && data . charCodeAt ( 1 ) === 0xFE ) { return $cptable . utils . decode ( 1200 , char _codes ( data . slice ( 2 ) ) ) ; }
2022-02-12 06:31:47 +00:00
return data ;
} ;
_getchar = function _gc2 ( x /*:number*/ ) /*:string*/ {
if ( current _codepage === 1200 ) return String . fromCharCode ( x ) ;
2022-03-11 05:29:05 +00:00
return $cptable . utils . decode ( current _codepage , [ x & 255 , x >> 8 ] ) [ 0 ] ;
2022-02-12 06:31:47 +00:00
} ;
_getansi = function _ga2 ( x /*:number*/ ) /*:string*/ {
2022-03-11 05:29:05 +00:00
return $cptable . utils . decode ( current _ansi , [ x ] ) [ 0 ] ;
2022-02-12 06:31:47 +00:00
} ;
2022-02-13 09:35:34 +00:00
cpdoit ( ) ;
2022-02-12 06:31:47 +00:00
}
2021-09-12 11:11:48 +00:00
var DENSE = null ;
var DIF _XL = true ;
2022-03-22 20:08:08 +00:00
var Base64 _map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=" ;
function Base64 _encode ( input ) {
var o = "" ;
var c1 = 0 , c2 = 0 , c3 = 0 , e1 = 0 , e2 = 0 , e3 = 0 , e4 = 0 ;
for ( var i = 0 ; i < input . length ; ) {
c1 = input . charCodeAt ( i ++ ) ;
e1 = c1 >> 2 ;
c2 = input . charCodeAt ( i ++ ) ;
e2 = ( c1 & 3 ) << 4 | c2 >> 4 ;
c3 = input . charCodeAt ( i ++ ) ;
e3 = ( c2 & 15 ) << 2 | c3 >> 6 ;
e4 = c3 & 63 ;
if ( isNaN ( c2 ) ) {
e3 = e4 = 64 ;
} else if ( isNaN ( c3 ) ) {
e4 = 64 ;
2022-02-10 12:40:50 +00:00
}
2022-03-22 20:08:08 +00:00
o += Base64 _map . charAt ( e1 ) + Base64 _map . charAt ( e2 ) + Base64 _map . charAt ( e3 ) + Base64 _map . charAt ( e4 ) ;
}
return o ;
}
2022-06-27 05:47:58 +00:00
function Base64 _encode _pass ( input ) {
var o = "" ;
var c1 = 0 , c2 = 0 , c3 = 0 , e1 = 0 , e2 = 0 , e3 = 0 , e4 = 0 ;
for ( var i = 0 ; i < input . length ; ) {
c1 = input . charCodeAt ( i ++ ) ;
if ( c1 > 255 )
c1 = 95 ;
e1 = c1 >> 2 ;
c2 = input . charCodeAt ( i ++ ) ;
if ( c2 > 255 )
c2 = 95 ;
e2 = ( c1 & 3 ) << 4 | c2 >> 4 ;
c3 = input . charCodeAt ( i ++ ) ;
if ( c3 > 255 )
c3 = 95 ;
e3 = ( c2 & 15 ) << 2 | c3 >> 6 ;
e4 = c3 & 63 ;
if ( isNaN ( c2 ) ) {
e3 = e4 = 64 ;
} else if ( isNaN ( c3 ) ) {
e4 = 64 ;
}
o += Base64 _map . charAt ( e1 ) + Base64 _map . charAt ( e2 ) + Base64 _map . charAt ( e3 ) + Base64 _map . charAt ( e4 ) ;
}
return o ;
}
2022-03-22 20:08:08 +00:00
function Base64 _decode ( input ) {
var o = "" ;
var c1 = 0 , c2 = 0 , c3 = 0 , e1 = 0 , e2 = 0 , e3 = 0 , e4 = 0 ;
2022-08-08 23:21:46 +00:00
input = input . replace ( /^data:([^\/]+\/[^\/]+)?;base64\,/ , "" ) . replace ( /[^\w\+\/\=]/g , "" ) ;
2022-03-22 20:08:08 +00:00
for ( var i = 0 ; i < input . length ; ) {
e1 = Base64 _map . indexOf ( input . charAt ( i ++ ) ) ;
e2 = Base64 _map . indexOf ( input . charAt ( i ++ ) ) ;
c1 = e1 << 2 | e2 >> 4 ;
o += String . fromCharCode ( c1 ) ;
e3 = Base64 _map . indexOf ( input . charAt ( i ++ ) ) ;
c2 = ( e2 & 15 ) << 4 | e3 >> 2 ;
if ( e3 !== 64 ) {
o += String . fromCharCode ( c2 ) ;
}
e4 = Base64 _map . indexOf ( input . charAt ( i ++ ) ) ;
c3 = ( e3 & 3 ) << 6 | e4 ;
if ( e4 !== 64 ) {
o += String . fromCharCode ( c3 ) ;
}
}
return o ;
}
2022-03-20 01:54:41 +00:00
var has _buf = /*#__PURE__*/ ( function ( ) { return typeof Buffer !== 'undefined' && typeof process !== 'undefined' && typeof process . versions !== 'undefined' && ! ! process . versions . node ; } ) ( ) ;
2021-09-12 11:11:48 +00:00
2022-03-20 01:54:41 +00:00
var Buffer _from = /*#__PURE__*/ ( function ( ) {
if ( typeof Buffer !== 'undefined' ) {
var nbfs = ! Buffer . from ;
if ( ! nbfs ) try { Buffer . from ( "foo" , "utf8" ) ; } catch ( e ) { nbfs = true ; }
return nbfs ? function ( buf , enc ) { return ( enc ) ? new Buffer ( buf , enc ) : new Buffer ( buf ) ; } : Buffer . from . bind ( Buffer ) ;
}
return function ( ) { } ;
} ) ( ) ;
2022-07-10 04:12:15 +00:00
var buf _utf16le = /*#__PURE__*/ ( function ( ) {
if ( typeof Buffer === 'undefined' ) return false ;
var x = Buffer _from ( [ 65 , 0 ] ) ;
if ( ! x ) return false ;
var o = x . toString ( "utf16le" ) ;
return o . length == 1 ;
} ) ( ) ;
2021-09-12 11:11:48 +00:00
function new _raw _buf ( len /*:number*/ ) {
/* jshint -W056 */
2022-03-20 01:54:41 +00:00
if ( has _buf ) return Buffer . alloc ? Buffer . alloc ( len ) : new Buffer ( len ) ;
return typeof Uint8Array != "undefined" ? new Uint8Array ( len ) : new Array ( len ) ;
2021-09-12 11:11:48 +00:00
/* jshint +W056 */
}
function new _unsafe _buf ( len /*:number*/ ) {
/* jshint -W056 */
2022-03-20 01:54:41 +00:00
if ( has _buf ) return Buffer . allocUnsafe ? Buffer . allocUnsafe ( len ) : new Buffer ( len ) ;
return typeof Uint8Array != "undefined" ? new Uint8Array ( len ) : new Array ( len ) ;
2021-09-12 11:11:48 +00:00
/* jshint +W056 */
}
var s2a = function s2a ( s /*:string*/ ) /*:any*/ {
if ( has _buf ) return Buffer _from ( s , "binary" ) ;
return s . split ( "" ) . map ( function ( x /*:string*/ ) /*:number*/ { return x . charCodeAt ( 0 ) & 0xff ; } ) ;
} ;
function s2ab ( s /*:string*/ ) /*:any*/ {
if ( typeof ArrayBuffer === 'undefined' ) return s2a ( s ) ;
var buf = new ArrayBuffer ( s . length ) , view = new Uint8Array ( buf ) ;
for ( var i = 0 ; i != s . length ; ++ i ) view [ i ] = s . charCodeAt ( i ) & 0xFF ;
return buf ;
}
function a2s ( data /*:any*/ ) /*:string*/ {
if ( Array . isArray ( data ) ) return data . map ( function ( c ) { return String . fromCharCode ( c ) ; } ) . join ( "" ) ;
var o /*:Array<string>*/ = [ ] ; for ( var i = 0 ; i < data . length ; ++ i ) o [ i ] = String . fromCharCode ( data [ i ] ) ; return o . join ( "" ) ;
}
function a2u ( data /*:Array<number>*/ ) /*:Uint8Array*/ {
if ( typeof Uint8Array === 'undefined' ) throw new Error ( "Unsupported" ) ;
return new Uint8Array ( data ) ;
}
function ab2a ( data /*:ArrayBuffer|Uint8Array*/ ) /*:Array<number>*/ {
if ( typeof ArrayBuffer == 'undefined' ) throw new Error ( "Unsupported" ) ;
if ( data instanceof ArrayBuffer ) return ab2a ( new Uint8Array ( data ) ) ;
/*:: if(data instanceof ArrayBuffer) throw new Error("unreachable"); */
var o = new Array ( data . length ) ;
for ( var i = 0 ; i < data . length ; ++ i ) o [ i ] = data [ i ] ;
return o ;
}
2022-03-20 01:54:41 +00:00
var bconcat = has _buf ? function ( bufs ) { return Buffer . concat ( bufs . map ( function ( buf ) { return Buffer . isBuffer ( buf ) ? buf : Buffer _from ( buf ) ; } ) ) ; } : function ( bufs ) {
if ( typeof Uint8Array !== "undefined" ) {
var i = 0 , maxlen = 0 ;
for ( i = 0 ; i < bufs . length ; ++ i ) maxlen += bufs [ i ] . length ;
var o = new Uint8Array ( maxlen ) ;
var len = 0 ;
for ( i = 0 , maxlen = 0 ; i < bufs . length ; maxlen += len , ++ i ) {
len = bufs [ i ] . length ;
if ( bufs [ i ] instanceof Uint8Array ) o . set ( bufs [ i ] , maxlen ) ;
2022-09-22 09:05:24 +00:00
else if ( typeof bufs [ i ] == "string" ) o . set ( new Uint8Array ( s2a ( bufs [ i ] ) ) , maxlen ) ;
2022-03-20 01:54:41 +00:00
else o . set ( new Uint8Array ( bufs [ i ] ) , maxlen ) ;
}
return o ;
}
return [ ] . concat . apply ( [ ] , bufs . map ( function ( buf ) { return Array . isArray ( buf ) ? buf : [ ] . slice . call ( buf ) ; } ) ) ;
} ;
2022-02-10 12:40:50 +00:00
function utf8decode ( content /*:string*/ ) {
2022-02-15 07:18:15 +00:00
var out = [ ] , widx = 0 , L = content . length + 250 ;
2022-02-10 12:40:50 +00:00
var o = new _raw _buf ( content . length + 255 ) ;
for ( var ridx = 0 ; ridx < content . length ; ++ ridx ) {
var c = content . charCodeAt ( ridx ) ;
if ( c < 0x80 ) o [ widx ++ ] = c ;
else if ( c < 0x800 ) {
o [ widx ++ ] = ( 192 | ( ( c >> 6 ) & 31 ) ) ;
o [ widx ++ ] = ( 128 | ( c & 63 ) ) ;
} else if ( c >= 0xD800 && c < 0xE000 ) {
c = ( c & 1023 ) + 64 ;
2022-02-13 09:35:34 +00:00
var d = content . charCodeAt ( ++ ridx ) & 1023 ;
2022-02-10 12:40:50 +00:00
o [ widx ++ ] = ( 240 | ( ( c >> 8 ) & 7 ) ) ;
o [ widx ++ ] = ( 128 | ( ( c >> 2 ) & 63 ) ) ;
o [ widx ++ ] = ( 128 | ( ( d >> 6 ) & 15 ) | ( ( c & 3 ) << 4 ) ) ;
o [ widx ++ ] = ( 128 | ( d & 63 ) ) ;
} else {
o [ widx ++ ] = ( 224 | ( ( c >> 12 ) & 15 ) ) ;
o [ widx ++ ] = ( 128 | ( ( c >> 6 ) & 63 ) ) ;
o [ widx ++ ] = ( 128 | ( c & 63 ) ) ;
}
2022-02-15 07:18:15 +00:00
if ( widx > L ) {
2022-02-10 12:40:50 +00:00
out . push ( o . slice ( 0 , widx ) ) ;
widx = 0 ;
o = new _raw _buf ( 65535 ) ;
2022-02-15 07:18:15 +00:00
L = 65530 ;
2022-02-10 12:40:50 +00:00
}
}
out . push ( o . slice ( 0 , widx ) ) ;
return bconcat ( out ) ;
}
2021-09-12 11:11:48 +00:00
var chr0 = /\u0000/g , chr1 = /[\u0001-\u0006]/g ;
/ * : :
declare type Block = any ;
declare type BufArray = {
newblk ( sz : number ) : Block ;
next ( sz : number ) : Block ;
end ( ) : any ;
push ( buf : Block ) : void ;
} ;
type RecordHopperCB = { ( d : any , Rn : string , RT : number ) : ? boolean ; } ;
type EvertType = { [ string ] : string } ;
type EvertNumType = { [ string ] : number } ;
type EvertArrType = { [ string ] : Array < string > } ;
type StringConv = { ( string ) : string } ;
* /
/* ssf.js (C) 2013-present SheetJS -- http://sheetjs.com */
/*jshint -W041 */
function _strrev ( x /*:string*/ ) /*:string*/ { var o = "" , i = x . length - 1 ; while ( i >= 0 ) o += x . charAt ( i -- ) ; return o ; }
function pad0 ( v /*:any*/ , d /*:number*/ ) /*:string*/ { var t = "" + v ; return t . length >= d ? t : fill ( '0' , d - t . length ) + t ; }
function pad _ ( v /*:any*/ , d /*:number*/ ) /*:string*/ { var t = "" + v ; return t . length >= d ? t : fill ( ' ' , d - t . length ) + t ; }
function rpad _ ( v /*:any*/ , d /*:number*/ ) /*:string*/ { var t = "" + v ; return t . length >= d ? t : t + fill ( ' ' , d - t . length ) ; }
function pad0r1 ( v /*:any*/ , d /*:number*/ ) /*:string*/ { var t = "" + Math . round ( v ) ; return t . length >= d ? t : fill ( '0' , d - t . length ) + t ; }
function pad0r2 ( v /*:any*/ , d /*:number*/ ) /*:string*/ { var t = "" + v ; return t . length >= d ? t : fill ( '0' , d - t . length ) + t ; }
2022-03-20 01:54:41 +00:00
var p2 _32 = /*#__PURE__*/ Math . pow ( 2 , 32 ) ;
2021-09-12 11:11:48 +00:00
function pad0r ( v /*:any*/ , d /*:number*/ ) /*:string*/ { if ( v > p2 _32 || v < - p2 _32 ) return pad0r1 ( v , d ) ; var i = Math . round ( v ) ; return pad0r2 ( i , d ) ; }
2022-03-20 01:54:41 +00:00
/* yes, in 2022 this is still faster than string compare */
function SSF _isgeneral ( s /*:string*/ , i /*:?number*/ ) /*:boolean*/ { i = i || 0 ; return s . length >= 7 + i && ( s . charCodeAt ( i ) | 32 ) === 103 && ( s . charCodeAt ( i + 1 ) | 32 ) === 101 && ( s . charCodeAt ( i + 2 ) | 32 ) === 110 && ( s . charCodeAt ( i + 3 ) | 32 ) === 101 && ( s . charCodeAt ( i + 4 ) | 32 ) === 114 && ( s . charCodeAt ( i + 5 ) | 32 ) === 97 && ( s . charCodeAt ( i + 6 ) | 32 ) === 108 ; }
2021-09-12 11:11:48 +00:00
var days /*:Array<Array<string> >*/ = [
[ 'Sun' , 'Sunday' ] ,
[ 'Mon' , 'Monday' ] ,
[ 'Tue' , 'Tuesday' ] ,
[ 'Wed' , 'Wednesday' ] ,
[ 'Thu' , 'Thursday' ] ,
[ 'Fri' , 'Friday' ] ,
[ 'Sat' , 'Saturday' ]
] ;
var months /*:Array<Array<string> >*/ = [
[ 'J' , 'Jan' , 'January' ] ,
[ 'F' , 'Feb' , 'February' ] ,
[ 'M' , 'Mar' , 'March' ] ,
[ 'A' , 'Apr' , 'April' ] ,
[ 'M' , 'May' , 'May' ] ,
[ 'J' , 'Jun' , 'June' ] ,
[ 'J' , 'Jul' , 'July' ] ,
[ 'A' , 'Aug' , 'August' ] ,
[ 'S' , 'Sep' , 'September' ] ,
[ 'O' , 'Oct' , 'October' ] ,
[ 'N' , 'Nov' , 'November' ] ,
[ 'D' , 'Dec' , 'December' ]
] ;
2022-03-20 01:54:41 +00:00
function SSF _init _table ( t /*:any*/ ) {
if ( ! t ) t = { } ;
2021-09-12 11:11:48 +00:00
t [ 0 ] = 'General' ;
t [ 1 ] = '0' ;
t [ 2 ] = '0.00' ;
t [ 3 ] = '#,##0' ;
t [ 4 ] = '#,##0.00' ;
t [ 9 ] = '0%' ;
t [ 10 ] = '0.00%' ;
t [ 11 ] = '0.00E+00' ;
t [ 12 ] = '# ?/?' ;
t [ 13 ] = '# ??/??' ;
t [ 14 ] = 'm/d/yy' ;
t [ 15 ] = 'd-mmm-yy' ;
t [ 16 ] = 'd-mmm' ;
t [ 17 ] = 'mmm-yy' ;
t [ 18 ] = 'h:mm AM/PM' ;
t [ 19 ] = 'h:mm:ss AM/PM' ;
t [ 20 ] = 'h:mm' ;
t [ 21 ] = 'h:mm:ss' ;
t [ 22 ] = 'm/d/yy h:mm' ;
t [ 37 ] = '#,##0 ;(#,##0)' ;
t [ 38 ] = '#,##0 ;[Red](#,##0)' ;
t [ 39 ] = '#,##0.00;(#,##0.00)' ;
t [ 40 ] = '#,##0.00;[Red](#,##0.00)' ;
t [ 45 ] = 'mm:ss' ;
t [ 46 ] = '[h]:mm:ss' ;
t [ 47 ] = 'mmss.0' ;
t [ 48 ] = '##0.0E+0' ;
t [ 49 ] = '@' ;
t [ 56 ] = '"上午/下午 "hh"時"mm"分"ss"秒 "' ;
2022-03-20 01:54:41 +00:00
return t ;
}
/* repeated to satiate webpack */
var table _fmt = {
0 : 'General' ,
1 : '0' ,
2 : '0.00' ,
3 : '#,##0' ,
4 : '#,##0.00' ,
9 : '0%' ,
10 : '0.00%' ,
11 : '0.00E+00' ,
12 : '# ?/?' ,
13 : '# ??/??' ,
14 : 'm/d/yy' ,
15 : 'd-mmm-yy' ,
16 : 'd-mmm' ,
17 : 'mmm-yy' ,
18 : 'h:mm AM/PM' ,
19 : 'h:mm:ss AM/PM' ,
20 : 'h:mm' ,
21 : 'h:mm:ss' ,
22 : 'm/d/yy h:mm' ,
37 : '#,##0 ;(#,##0)' ,
38 : '#,##0 ;[Red](#,##0)' ,
39 : '#,##0.00;(#,##0.00)' ,
40 : '#,##0.00;[Red](#,##0.00)' ,
45 : 'mm:ss' ,
46 : '[h]:mm:ss' ,
47 : 'mmss.0' ,
48 : '##0.0E+0' ,
49 : '@' ,
56 : '"上午/下午 "hh"時"mm"分"ss"秒 "'
} ;
2021-09-12 11:11:48 +00:00
/* Defaults determined by systematically testing in Excel 2019 */
/* These formats appear to default to other formats in the table */
2022-03-20 01:54:41 +00:00
var SSF _default _map = {
5 : 37 , 6 : 38 , 7 : 39 , 8 : 40 , // 5 -> 37 ... 8 -> 40
2021-09-12 11:11:48 +00:00
2022-03-20 01:54:41 +00:00
23 : 0 , 24 : 0 , 25 : 0 , 26 : 0 , // 23 -> 0 ... 26 -> 0
2021-09-12 11:11:48 +00:00
2022-03-20 01:54:41 +00:00
27 : 14 , 28 : 14 , 29 : 14 , 30 : 14 , 31 : 14 , // 27 -> 14 ... 31 -> 14
2021-09-12 11:11:48 +00:00
2022-03-20 01:54:41 +00:00
50 : 14 , 51 : 14 , 52 : 14 , 53 : 14 , 54 : 14 , // 50 -> 14 ... 58 -> 14
55 : 14 , 56 : 14 , 57 : 14 , 58 : 14 ,
59 : 1 , 60 : 2 , 61 : 3 , 62 : 4 , // 59 -> 1 ... 62 -> 4
2021-09-12 11:11:48 +00:00
2022-03-20 01:54:41 +00:00
67 : 9 , 68 : 10 , // 67 -> 9 ... 68 -> 10
69 : 12 , 70 : 13 , 71 : 14 , // 69 -> 12 ... 71 -> 14
72 : 14 , 73 : 15 , 74 : 16 , 75 : 17 , // 72 -> 14 ... 75 -> 17
76 : 20 , 77 : 21 , 78 : 22 , // 76 -> 20 ... 78 -> 22
79 : 45 , 80 : 46 , 81 : 47 , // 79 -> 45 ... 81 -> 47
82 : 0 // 82 -> 0 ... 65536 -> 0 (omitted)
} ;
2021-09-12 11:11:48 +00:00
/* These formats technically refer to Accounting formats with no equivalent */
2022-03-20 01:54:41 +00:00
var SSF _default _str = {
2022-03-11 05:29:05 +00:00
// 5 -- Currency, 0 decimal, black negative
5 : '"$"#,##0_);\\("$"#,##0\\)' ,
63 : '"$"#,##0_);\\("$"#,##0\\)' ,
// 6 -- Currency, 0 decimal, red negative
6 : '"$"#,##0_);[Red]\\("$"#,##0\\)' ,
64 : '"$"#,##0_);[Red]\\("$"#,##0\\)' ,
// 7 -- Currency, 2 decimal, black negative
7 : '"$"#,##0.00_);\\("$"#,##0.00\\)' ,
65 : '"$"#,##0.00_);\\("$"#,##0.00\\)' ,
// 8 -- Currency, 2 decimal, red negative
8 : '"$"#,##0.00_);[Red]\\("$"#,##0.00\\)' ,
66 : '"$"#,##0.00_);[Red]\\("$"#,##0.00\\)' ,
// 41 -- Accounting, 0 decimal, No Symbol
41 : '_(* #,##0_);_(* \\(#,##0\\);_(* "-"_);_(@_)' ,
// 42 -- Accounting, 0 decimal, $ Symbol
42 : '_("$"* #,##0_);_("$"* \\(#,##0\\);_("$"* "-"_);_(@_)' ,
// 43 -- Accounting, 2 decimal, No Symbol
43 : '_(* #,##0.00_);_(* \\(#,##0.00\\);_(* "-"??_);_(@_)' ,
// 44 -- Accounting, 2 decimal, $ Symbol
44 : '_("$"* #,##0.00_);_("$"* \\(#,##0.00\\);_("$"* "-"??_);_(@_)'
} ;
2022-03-20 01:54:41 +00:00
function SSF _frac ( x /*:number*/ , D /*:number*/ , mixed /*:?boolean*/ ) /*:Array<number>*/ {
2021-09-12 11:11:48 +00:00
var sgn = x < 0 ? - 1 : 1 ;
var B = x * sgn ;
var P _2 = 0 , P _1 = 1 , P = 0 ;
var Q _2 = 1 , Q _1 = 0 , Q = 0 ;
var A = Math . floor ( B ) ;
while ( Q _1 < D ) {
A = Math . floor ( B ) ;
P = A * P _1 + P _2 ;
Q = A * Q _1 + Q _2 ;
if ( ( B - A ) < 0.00000005 ) break ;
B = 1 / ( B - A ) ;
P _2 = P _1 ; P _1 = P ;
Q _2 = Q _1 ; Q _1 = Q ;
}
if ( Q > D ) { if ( Q _1 > D ) { Q = Q _2 ; P = P _2 ; } else { Q = Q _1 ; P = P _1 ; } }
if ( ! mixed ) return [ 0 , sgn * P , Q ] ;
var q = Math . floor ( sgn * P / Q ) ;
return [ q , sgn * P - q * Q , Q ] ;
}
2022-03-20 01:54:41 +00:00
function SSF _parse _date _code ( v /*:number*/ , opts /*:?any*/ , b2 /*:?boolean*/ ) {
2021-09-12 11:11:48 +00:00
if ( v > 2958465 || v < 0 ) return null ;
var date = ( v | 0 ) , time = Math . floor ( 86400 * ( v - date ) ) , dow = 0 ;
var dout = [ ] ;
var out = { D : date , T : time , u : 86400 * ( v - date ) - time , y : 0 , m : 0 , d : 0 , H : 0 , M : 0 , S : 0 , q : 0 } ;
if ( Math . abs ( out . u ) < 1e-6 ) out . u = 0 ;
if ( opts && opts . date1904 ) date += 1462 ;
if ( out . u > 0.9999 ) {
out . u = 0 ;
if ( ++ time == 86400 ) { out . T = time = 0 ; ++ date ; ++ out . D ; }
}
if ( date === 60 ) { dout = b2 ? [ 1317 , 10 , 29 ] : [ 1900 , 2 , 29 ] ; dow = 3 ; }
else if ( date === 0 ) { dout = b2 ? [ 1317 , 8 , 29 ] : [ 1900 , 1 , 0 ] ; dow = 6 ; }
else {
if ( date > 60 ) -- date ;
/* 1 = Jan 1 1900 in Gregorian */
var d = new Date ( 1900 , 0 , 1 ) ;
d . setDate ( d . getDate ( ) + date - 1 ) ;
dout = [ d . getFullYear ( ) , d . getMonth ( ) + 1 , d . getDate ( ) ] ;
dow = d . getDay ( ) ;
if ( date < 60 ) dow = ( dow + 6 ) % 7 ;
2022-03-20 01:54:41 +00:00
if ( b2 ) dow = SSF _fix _hijri ( d , dout ) ;
2021-09-12 11:11:48 +00:00
}
out . y = dout [ 0 ] ; out . m = dout [ 1 ] ; out . d = dout [ 2 ] ;
out . S = time % 60 ; time = Math . floor ( time / 60 ) ;
out . M = time % 60 ; time = Math . floor ( time / 60 ) ;
out . H = time ;
out . q = dow ;
return out ;
}
2022-03-20 01:54:41 +00:00
var SSFbasedate = /*#__PURE__*/ new Date ( 1899 , 11 , 31 , 0 , 0 , 0 ) ;
var SSFdnthresh = /*#__PURE__*/ SSFbasedate . getTime ( ) ;
var SSFbase1904 = /*#__PURE__*/ new Date ( 1900 , 2 , 1 , 0 , 0 , 0 ) ;
2021-09-12 11:11:48 +00:00
function datenum _local ( v /*:Date*/ , date1904 /*:?boolean*/ ) /*:number*/ {
2022-03-20 01:54:41 +00:00
var epoch = /*#__PURE__*/ v . getTime ( ) ;
2021-09-12 11:11:48 +00:00
if ( date1904 ) epoch -= 1461 * 24 * 60 * 60 * 1000 ;
2022-03-20 01:54:41 +00:00
else if ( v >= SSFbase1904 ) epoch += 24 * 60 * 60 * 1000 ;
return ( epoch - ( SSFdnthresh + ( /*#__PURE__*/ v . getTimezoneOffset ( ) - /*#__PURE__*/ SSFbasedate . getTimezoneOffset ( ) ) * 60000 ) ) / ( 24 * 60 * 60 * 1000 ) ;
2021-09-12 11:11:48 +00:00
}
/* ECMA-376 18.8.30 numFmt*/
/* Note: `toPrecision` uses standard form when prec > E and E >= -6 */
2022-03-20 01:54:41 +00:00
/* exponent >= -9 and <= 9 */
function SSF _strip _decimal ( o /*:string*/ ) /*:string*/ {
return ( o . indexOf ( "." ) == - 1 ) ? o : o . replace ( /(?:\.0*|(\.\d*[1-9])0+)$/ , "$1" ) ;
}
2021-09-12 11:11:48 +00:00
2022-03-20 01:54:41 +00:00
/* General Exponential always shows 2 digits exp and trims the mantissa */
function SSF _normalize _exp ( o /*:string*/ ) /*:string*/ {
if ( o . indexOf ( "E" ) == - 1 ) return o ;
return o . replace ( /(?:\.0*|(\.\d*[1-9])0+)[Ee]/ , "$1E" ) . replace ( /(E[+-])(\d)$/ , "$10$2" ) ;
}
2021-09-12 11:11:48 +00:00
2022-03-20 01:54:41 +00:00
/* exponent >= -9 and <= 9 */
function SSF _small _exp ( v /*:number*/ ) /*:string*/ {
var w = ( v < 0 ? 12 : 11 ) ;
var o = SSF _strip _decimal ( v . toFixed ( 12 ) ) ; if ( o . length <= w ) return o ;
o = v . toPrecision ( 10 ) ; if ( o . length <= w ) return o ;
return v . toExponential ( 5 ) ;
}
2021-09-12 11:11:48 +00:00
2022-03-20 01:54:41 +00:00
/* exponent >= 11 or <= -10 likely exponential */
function SSF _large _exp ( v /*:number*/ ) /*:string*/ {
var o = SSF _strip _decimal ( v . toFixed ( 11 ) ) ;
return ( o . length > ( v < 0 ? 12 : 11 ) || o === "0" || o === "-0" ) ? v . toPrecision ( 6 ) : o ;
}
2021-09-12 11:11:48 +00:00
2022-03-20 01:54:41 +00:00
function SSF _general _num ( v /*:number*/ ) /*:string*/ {
var V = Math . floor ( Math . log ( Math . abs ( v ) ) * Math . LOG10E ) , o ;
2021-09-12 11:11:48 +00:00
2022-03-20 01:54:41 +00:00
if ( V >= - 4 && V <= - 1 ) o = v . toPrecision ( 10 + V ) ;
else if ( Math . abs ( V ) <= 9 ) o = SSF _small _exp ( v ) ;
else if ( V === 10 ) o = v . toFixed ( 10 ) . substr ( 0 , 12 ) ;
else o = SSF _large _exp ( v ) ;
2021-09-12 11:11:48 +00:00
2022-03-20 01:54:41 +00:00
return SSF _strip _decimal ( SSF _normalize _exp ( o . toUpperCase ( ) ) ) ;
}
2021-09-12 11:11:48 +00:00
/ *
"General" rules :
- text is passed through ( "@" )
- booleans are rendered as TRUE / FALSE
- "up to 11 characters" displayed for numbers
- Default date format ( code 14 ) used for Dates
2022-03-20 01:54:41 +00:00
The longest 32 - bit integer text is "-2147483648" , exactly 11 chars
2021-09-12 11:11:48 +00:00
TODO : technically the display depends on the width of the cell
* /
2022-03-20 01:54:41 +00:00
function SSF _general ( v /*:any*/ , opts /*:any*/ ) {
2021-09-12 11:11:48 +00:00
switch ( typeof v ) {
case 'string' : return v ;
case 'boolean' : return v ? "TRUE" : "FALSE" ;
2022-03-20 01:54:41 +00:00
case 'number' : return ( v | 0 ) === v ? v . toString ( 10 ) : SSF _general _num ( v ) ;
2021-09-12 11:11:48 +00:00
case 'undefined' : return "" ;
case 'object' :
if ( v == null ) return "" ;
2022-03-20 01:54:41 +00:00
if ( v instanceof Date ) return SSF _format ( 14 , datenum _local ( v , opts && opts . date1904 ) , opts ) ;
2021-09-12 11:11:48 +00:00
}
throw new Error ( "unsupported value in General format: " + v ) ;
}
2022-03-20 01:54:41 +00:00
function SSF _fix _hijri ( date /*:Date*/ , o /*:[number, number, number]*/ ) {
2021-09-12 11:11:48 +00:00
/* TODO: properly adjust y/m/d and */
o [ 0 ] -= 581 ;
var dow = date . getDay ( ) ;
if ( date < 60 ) dow = ( dow + 6 ) % 7 ;
return dow ;
}
//var THAI_DIGITS = "\u0E50\u0E51\u0E52\u0E53\u0E54\u0E55\u0E56\u0E57\u0E58\u0E59".split("");
2022-03-20 01:54:41 +00:00
function SSF _write _date ( type /*:number*/ , fmt /*:string*/ , val , ss0 /*:?number*/ ) /*:string*/ {
2021-09-12 11:11:48 +00:00
var o = "" , ss = 0 , tt = 0 , y = val . y , out , outl = 0 ;
switch ( type ) {
case 98 : /* 'b' buddhist year */
y = val . y + 543 ;
/* falls through */
case 121 : /* 'y' year */
switch ( fmt . length ) {
case 1 : case 2 : out = y % 100 ; outl = 2 ; break ;
default : out = y % 10000 ; outl = 4 ; break ;
} break ;
case 109 : /* 'm' month */
switch ( fmt . length ) {
case 1 : case 2 : out = val . m ; outl = fmt . length ; break ;
case 3 : return months [ val . m - 1 ] [ 1 ] ;
case 5 : return months [ val . m - 1 ] [ 0 ] ;
default : return months [ val . m - 1 ] [ 2 ] ;
} break ;
case 100 : /* 'd' day */
switch ( fmt . length ) {
case 1 : case 2 : out = val . d ; outl = fmt . length ; break ;
case 3 : return days [ val . q ] [ 0 ] ;
default : return days [ val . q ] [ 1 ] ;
} break ;
case 104 : /* 'h' 12-hour */
switch ( fmt . length ) {
case 1 : case 2 : out = 1 + ( val . H + 11 ) % 12 ; outl = fmt . length ; break ;
default : throw 'bad hour format: ' + fmt ;
} break ;
case 72 : /* 'H' 24-hour */
switch ( fmt . length ) {
case 1 : case 2 : out = val . H ; outl = fmt . length ; break ;
default : throw 'bad hour format: ' + fmt ;
} break ;
case 77 : /* 'M' minutes */
switch ( fmt . length ) {
case 1 : case 2 : out = val . M ; outl = fmt . length ; break ;
default : throw 'bad minute format: ' + fmt ;
} break ;
case 115 : /* 's' seconds */
if ( fmt != 's' && fmt != 'ss' && fmt != '.0' && fmt != '.00' && fmt != '.000' ) throw 'bad second format: ' + fmt ;
if ( val . u === 0 && ( fmt == "s" || fmt == "ss" ) ) return pad0 ( val . S , fmt . length ) ;
/*::if(!ss0) ss0 = 0; */
if ( ss0 >= 2 ) tt = ss0 === 3 ? 1000 : 100 ;
else tt = ss0 === 1 ? 10 : 1 ;
ss = Math . round ( ( tt ) * ( val . S + val . u ) ) ;
if ( ss >= 60 * tt ) ss = 0 ;
if ( fmt === 's' ) return ss === 0 ? "0" : "" + ss / tt ;
o = pad0 ( ss , 2 + ss0 ) ;
if ( fmt === 'ss' ) return o . substr ( 0 , 2 ) ;
return "." + o . substr ( 2 , fmt . length - 1 ) ;
case 90 : /* 'Z' absolute time */
switch ( fmt ) {
case '[h]' : case '[hh]' : out = val . D * 24 + val . H ; break ;
case '[m]' : case '[mm]' : out = ( val . D * 24 + val . H ) * 60 + val . M ; break ;
case '[s]' : case '[ss]' : out = ( ( val . D * 24 + val . H ) * 60 + val . M ) * 60 + Math . round ( val . S + val . u ) ; break ;
default : throw 'bad abstime format: ' + fmt ;
} outl = fmt . length === 3 ? 1 : 2 ; break ;
case 101 : /* 'e' era */
out = y ; outl = 1 ; break ;
}
var outstr = outl > 0 ? pad0 ( out , outl ) : "" ;
return outstr ;
}
2022-03-20 01:54:41 +00:00
/*jshint -W086 */
2021-09-12 11:11:48 +00:00
/*jshint +W086 */
function commaify ( s /*:string*/ ) /*:string*/ {
var w = 3 ;
if ( s . length <= w ) return s ;
var j = ( s . length % w ) , o = s . substr ( 0 , j ) ;
for ( ; j != s . length ; j += w ) o += ( o . length > 0 ? "," : "" ) + s . substr ( j , w ) ;
return o ;
}
var pct1 = /%/g ;
function write _num _pct ( type /*:string*/ , fmt /*:string*/ , val /*:number*/ ) /*:string*/ {
var sfmt = fmt . replace ( pct1 , "" ) , mul = fmt . length - sfmt . length ;
return write _num ( type , sfmt , val * Math . pow ( 10 , 2 * mul ) ) + fill ( "%" , mul ) ;
}
2022-03-20 01:54:41 +00:00
2021-09-12 11:11:48 +00:00
function write _num _cm ( type /*:string*/ , fmt /*:string*/ , val /*:number*/ ) /*:string*/ {
var idx = fmt . length - 1 ;
while ( fmt . charCodeAt ( idx - 1 ) === 44 ) -- idx ;
return write _num ( type , fmt . substr ( 0 , idx ) , val / Math . pow ( 10 , 3 * ( fmt . length - idx ) ) ) ;
}
2022-03-20 01:54:41 +00:00
2021-09-12 11:11:48 +00:00
function write _num _exp ( fmt /*:string*/ , val /*:number*/ ) /*:string*/ {
var o /*:string*/ ;
var idx = fmt . indexOf ( "E" ) - fmt . indexOf ( "." ) - 1 ;
if ( fmt . match ( /^#+0.0E\+0$/ ) ) {
if ( val == 0 ) return "0.0E+0" ;
else if ( val < 0 ) return "-" + write _num _exp ( fmt , - val ) ;
var period = fmt . indexOf ( "." ) ; if ( period === - 1 ) period = fmt . indexOf ( 'E' ) ;
var ee = Math . floor ( Math . log ( val ) * Math . LOG10E ) % period ;
if ( ee < 0 ) ee += period ;
o = ( val / Math . pow ( 10 , ee ) ) . toPrecision ( idx + 1 + ( period + ee ) % period ) ;
if ( o . indexOf ( "e" ) === - 1 ) {
var fakee = Math . floor ( Math . log ( val ) * Math . LOG10E ) ;
if ( o . indexOf ( "." ) === - 1 ) o = o . charAt ( 0 ) + "." + o . substr ( 1 ) + "E+" + ( fakee - o . length + ee ) ;
else o += "E+" + ( fakee - ee ) ;
while ( o . substr ( 0 , 2 ) === "0." ) {
o = o . charAt ( 0 ) + o . substr ( 2 , period ) + "." + o . substr ( 2 + period ) ;
o = o . replace ( /^0+([1-9])/ , "$1" ) . replace ( /^0+\./ , "0." ) ;
}
o = o . replace ( /\+-/ , "-" ) ;
}
o = o . replace ( /^([+-]?)(\d*)\.(\d*)[Ee]/ , function ( $$ , $1 , $2 , $3 ) { return $1 + $2 + $3 . substr ( 0 , ( period + ee ) % period ) + "." + $3 . substr ( ee ) + "E" ; } ) ;
} else o = val . toExponential ( idx ) ;
if ( fmt . match ( /E\+00$/ ) && o . match ( /e[+-]\d$/ ) ) o = o . substr ( 0 , o . length - 1 ) + "0" + o . charAt ( o . length - 1 ) ;
if ( fmt . match ( /E\-/ ) && o . match ( /e\+/ ) ) o = o . replace ( /e\+/ , "e" ) ;
return o . replace ( "e" , "E" ) ;
}
var frac1 = /# (\?+)( ?)\/( ?)(\d+)/ ;
function write _num _f1 ( r /*:Array<string>*/ , aval /*:number*/ , sign /*:string*/ ) /*:string*/ {
var den = parseInt ( r [ 4 ] , 10 ) , rr = Math . round ( aval * den ) , base = Math . floor ( rr / den ) ;
var myn = ( rr - base * den ) , myd = den ;
return sign + ( base === 0 ? "" : "" + base ) + " " + ( myn === 0 ? fill ( " " , r [ 1 ] . length + 1 + r [ 4 ] . length ) : pad _ ( myn , r [ 1 ] . length ) + r [ 2 ] + "/" + r [ 3 ] + pad0 ( myd , r [ 4 ] . length ) ) ;
}
function write _num _f2 ( r /*:Array<string>*/ , aval /*:number*/ , sign /*:string*/ ) /*:string*/ {
return sign + ( aval === 0 ? "" : "" + aval ) + fill ( " " , r [ 1 ] . length + 2 + r [ 4 ] . length ) ;
}
var dec1 = /^#*0*\.([0#]+)/ ;
var closeparen = /\).*[0#]/ ;
var phone = /\(###\) ###\\?-####/ ;
function hashq ( str /*:string*/ ) /*:string*/ {
var o = "" , cc ;
for ( var i = 0 ; i != str . length ; ++ i ) switch ( ( cc = str . charCodeAt ( i ) ) ) {
case 35 : break ;
case 63 : o += " " ; break ;
case 48 : o += "0" ; break ;
default : o += String . fromCharCode ( cc ) ;
}
return o ;
}
function rnd ( val /*:number*/ , d /*:number*/ ) /*:string*/ { var dd = Math . pow ( 10 , d ) ; return "" + ( Math . round ( val * dd ) / dd ) ; }
function dec ( val /*:number*/ , d /*:number*/ ) /*:number*/ {
var _frac = val - Math . floor ( val ) , dd = Math . pow ( 10 , d ) ;
if ( d < ( '' + Math . round ( _frac * dd ) ) . length ) return 0 ;
return Math . round ( _frac * dd ) ;
}
function carry ( val /*:number*/ , d /*:number*/ ) /*:number*/ {
if ( d < ( '' + Math . round ( ( val - Math . floor ( val ) ) * Math . pow ( 10 , d ) ) ) . length ) {
return 1 ;
}
return 0 ;
}
function flr ( val /*:number*/ ) /*:string*/ {
if ( val < 2147483647 && val > - 2147483648 ) return "" + ( val >= 0 ? ( val | 0 ) : ( val - 1 | 0 ) ) ;
return "" + Math . floor ( val ) ;
}
function write _num _flt ( type /*:string*/ , fmt /*:string*/ , val /*:number*/ ) /*:string*/ {
if ( type . charCodeAt ( 0 ) === 40 && ! fmt . match ( closeparen ) ) {
var ffmt = fmt . replace ( /\( */ , "" ) . replace ( / \)/ , "" ) . replace ( /\)/ , "" ) ;
if ( val >= 0 ) return write _num _flt ( 'n' , ffmt , val ) ;
return '(' + write _num _flt ( 'n' , ffmt , - val ) + ')' ;
}
if ( fmt . charCodeAt ( fmt . length - 1 ) === 44 ) return write _num _cm ( type , fmt , val ) ;
if ( fmt . indexOf ( '%' ) !== - 1 ) return write _num _pct ( type , fmt , val ) ;
if ( fmt . indexOf ( 'E' ) !== - 1 ) return write _num _exp ( fmt , val ) ;
if ( fmt . charCodeAt ( 0 ) === 36 ) return "$" + write _num _flt ( type , fmt . substr ( fmt . charAt ( 1 ) == ' ' ? 2 : 1 ) , val ) ;
var o ;
var r /*:?Array<string>*/ , ri , ff , aval = Math . abs ( val ) , sign = val < 0 ? "-" : "" ;
if ( fmt . match ( /^00+$/ ) ) return sign + pad0r ( aval , fmt . length ) ;
if ( fmt . match ( /^[#?]+$/ ) ) {
o = pad0r ( val , 0 ) ; if ( o === "0" ) o = "" ;
return o . length > fmt . length ? o : hashq ( fmt . substr ( 0 , fmt . length - o . length ) ) + o ;
}
if ( ( r = fmt . match ( frac1 ) ) ) return write _num _f1 ( r , aval , sign ) ;
if ( fmt . match ( /^#+0+$/ ) ) return sign + pad0r ( aval , fmt . length - fmt . indexOf ( "0" ) ) ;
if ( ( r = fmt . match ( dec1 ) ) ) {
o = rnd ( val , r [ 1 ] . length ) . replace ( /^([^\.]+)$/ , "$1." + hashq ( r [ 1 ] ) ) . replace ( /\.$/ , "." + hashq ( r [ 1 ] ) ) . replace ( /\.(\d*)$/ , function ( $$ , $1 ) { return "." + $1 + fill ( "0" , hashq ( /*::(*/ r /*::||[""])*/ [ 1 ] ) . length - $1 . length ) ; } ) ;
return fmt . indexOf ( "0." ) !== - 1 ? o : o . replace ( /^0\./ , "." ) ;
}
fmt = fmt . replace ( /^#+([0.])/ , "$1" ) ;
if ( ( r = fmt . match ( /^(0*)\.(#*)$/ ) ) ) {
return sign + rnd ( aval , r [ 2 ] . length ) . replace ( /\.(\d*[1-9])0*$/ , ".$1" ) . replace ( /^(-?\d*)$/ , "$1." ) . replace ( /^0\./ , r [ 1 ] . length ? "0." : "." ) ;
}
if ( ( r = fmt . match ( /^#{1,3},##0(\.?)$/ ) ) ) return sign + commaify ( pad0r ( aval , 0 ) ) ;
if ( ( r = fmt . match ( /^#,##0\.([#0]*0)$/ ) ) ) {
return val < 0 ? "-" + write _num _flt ( type , fmt , - val ) : commaify ( "" + ( Math . floor ( val ) + carry ( val , r [ 1 ] . length ) ) ) + "." + pad0 ( dec ( val , r [ 1 ] . length ) , r [ 1 ] . length ) ;
}
if ( ( r = fmt . match ( /^#,#*,#0/ ) ) ) return write _num _flt ( type , fmt . replace ( /^#,#*,/ , "" ) , val ) ;
if ( ( r = fmt . match ( /^([0#]+)(\\?-([0#]+))+$/ ) ) ) {
o = _strrev ( write _num _flt ( type , fmt . replace ( /[\\-]/g , "" ) , val ) ) ;
ri = 0 ;
return _strrev ( _strrev ( fmt . replace ( /\\/g , "" ) ) . replace ( /[0#]/g , function ( x ) { return ri < o . length ? o . charAt ( ri ++ ) : x === '0' ? '0' : "" ; } ) ) ;
}
if ( fmt . match ( phone ) ) {
o = write _num _flt ( type , "##########" , val ) ;
return "(" + o . substr ( 0 , 3 ) + ") " + o . substr ( 3 , 3 ) + "-" + o . substr ( 6 ) ;
}
var oa = "" ;
if ( ( r = fmt . match ( /^([#0?]+)( ?)\/( ?)([#0?]+)/ ) ) ) {
ri = Math . min ( /*::String(*/ r [ 4 ] /*::)*/ . length , 7 ) ;
2022-03-20 01:54:41 +00:00
ff = SSF _frac ( aval , Math . pow ( 10 , ri ) - 1 , false ) ;
2021-09-12 11:11:48 +00:00
o = "" + sign ;
oa = write _num ( "n" , /*::String(*/ r [ 1 ] /*::)*/ , ff [ 1 ] ) ;
if ( oa . charAt ( oa . length - 1 ) == " " ) oa = oa . substr ( 0 , oa . length - 1 ) + "0" ;
o += oa + /*::String(*/ r [ 2 ] /*::)*/ + "/" + /*::String(*/ r [ 3 ] /*::)*/ ;
oa = rpad _ ( ff [ 2 ] , ri ) ;
if ( oa . length < r [ 4 ] . length ) oa = hashq ( r [ 4 ] . substr ( r [ 4 ] . length - oa . length ) ) + oa ;
o += oa ;
return o ;
}
if ( ( r = fmt . match ( /^# ([#0?]+)( ?)\/( ?)([#0?]+)/ ) ) ) {
ri = Math . min ( Math . max ( r [ 1 ] . length , r [ 4 ] . length ) , 7 ) ;
2022-03-20 01:54:41 +00:00
ff = SSF _frac ( aval , Math . pow ( 10 , ri ) - 1 , true ) ;
2021-09-12 11:11:48 +00:00
return sign + ( ff [ 0 ] || ( ff [ 1 ] ? "" : "0" ) ) + " " + ( ff [ 1 ] ? pad _ ( ff [ 1 ] , ri ) + r [ 2 ] + "/" + r [ 3 ] + rpad _ ( ff [ 2 ] , ri ) : fill ( " " , 2 * ri + 1 + r [ 2 ] . length + r [ 3 ] . length ) ) ;
}
if ( ( r = fmt . match ( /^[#0?]+$/ ) ) ) {
o = pad0r ( val , 0 ) ;
if ( fmt . length <= o . length ) return o ;
return hashq ( fmt . substr ( 0 , fmt . length - o . length ) ) + o ;
}
if ( ( r = fmt . match ( /^([#0?]+)\.([#0]+)$/ ) ) ) {
o = "" + val . toFixed ( Math . min ( r [ 2 ] . length , 10 ) ) . replace ( /([^0])0+$/ , "$1" ) ;
ri = o . indexOf ( "." ) ;
var lres = fmt . indexOf ( "." ) - ri , rres = fmt . length - o . length - lres ;
return hashq ( fmt . substr ( 0 , lres ) + o + fmt . substr ( fmt . length - rres ) ) ;
}
if ( ( r = fmt . match ( /^00,000\.([#0]*0)$/ ) ) ) {
ri = dec ( val , r [ 1 ] . length ) ;
return val < 0 ? "-" + write _num _flt ( type , fmt , - val ) : commaify ( flr ( val ) ) . replace ( /^\d,\d{3}$/ , "0$&" ) . replace ( /^\d*$/ , function ( $$ ) { return "00," + ( $$ . length < 3 ? pad0 ( 0 , 3 - $$ . length ) : "" ) + $$ ; } ) + "." + pad0 ( ri , r [ 1 ] . length ) ;
}
switch ( fmt ) {
case "###,##0.00" : return write _num _flt ( type , "#,##0.00" , val ) ;
case "###,###" :
case "##,###" :
case "#,###" : var x = commaify ( pad0r ( aval , 0 ) ) ; return x !== "0" ? sign + x : "" ;
case "###,###.00" : return write _num _flt ( type , "###,##0.00" , val ) . replace ( /^0\./ , "." ) ;
case "#,###.00" : return write _num _flt ( type , "#,##0.00" , val ) . replace ( /^0\./ , "." ) ;
default :
}
throw new Error ( "unsupported format |" + fmt + "|" ) ;
}
function write _num _cm2 ( type /*:string*/ , fmt /*:string*/ , val /*:number*/ ) /*:string*/ {
var idx = fmt . length - 1 ;
while ( fmt . charCodeAt ( idx - 1 ) === 44 ) -- idx ;
return write _num ( type , fmt . substr ( 0 , idx ) , val / Math . pow ( 10 , 3 * ( fmt . length - idx ) ) ) ;
}
function write _num _pct2 ( type /*:string*/ , fmt /*:string*/ , val /*:number*/ ) /*:string*/ {
var sfmt = fmt . replace ( pct1 , "" ) , mul = fmt . length - sfmt . length ;
return write _num ( type , sfmt , val * Math . pow ( 10 , 2 * mul ) ) + fill ( "%" , mul ) ;
}
function write _num _exp2 ( fmt /*:string*/ , val /*:number*/ ) /*:string*/ {
var o /*:string*/ ;
var idx = fmt . indexOf ( "E" ) - fmt . indexOf ( "." ) - 1 ;
if ( fmt . match ( /^#+0.0E\+0$/ ) ) {
if ( val == 0 ) return "0.0E+0" ;
else if ( val < 0 ) return "-" + write _num _exp2 ( fmt , - val ) ;
var period = fmt . indexOf ( "." ) ; if ( period === - 1 ) period = fmt . indexOf ( 'E' ) ;
var ee = Math . floor ( Math . log ( val ) * Math . LOG10E ) % period ;
if ( ee < 0 ) ee += period ;
o = ( val / Math . pow ( 10 , ee ) ) . toPrecision ( idx + 1 + ( period + ee ) % period ) ;
if ( ! o . match ( /[Ee]/ ) ) {
var fakee = Math . floor ( Math . log ( val ) * Math . LOG10E ) ;
if ( o . indexOf ( "." ) === - 1 ) o = o . charAt ( 0 ) + "." + o . substr ( 1 ) + "E+" + ( fakee - o . length + ee ) ;
else o += "E+" + ( fakee - ee ) ;
o = o . replace ( /\+-/ , "-" ) ;
}
o = o . replace ( /^([+-]?)(\d*)\.(\d*)[Ee]/ , function ( $$ , $1 , $2 , $3 ) { return $1 + $2 + $3 . substr ( 0 , ( period + ee ) % period ) + "." + $3 . substr ( ee ) + "E" ; } ) ;
} else o = val . toExponential ( idx ) ;
if ( fmt . match ( /E\+00$/ ) && o . match ( /e[+-]\d$/ ) ) o = o . substr ( 0 , o . length - 1 ) + "0" + o . charAt ( o . length - 1 ) ;
if ( fmt . match ( /E\-/ ) && o . match ( /e\+/ ) ) o = o . replace ( /e\+/ , "e" ) ;
return o . replace ( "e" , "E" ) ;
}
function write _num _int ( type /*:string*/ , fmt /*:string*/ , val /*:number*/ ) /*:string*/ {
if ( type . charCodeAt ( 0 ) === 40 && ! fmt . match ( closeparen ) ) {
var ffmt = fmt . replace ( /\( */ , "" ) . replace ( / \)/ , "" ) . replace ( /\)/ , "" ) ;
if ( val >= 0 ) return write _num _int ( 'n' , ffmt , val ) ;
return '(' + write _num _int ( 'n' , ffmt , - val ) + ')' ;
}
if ( fmt . charCodeAt ( fmt . length - 1 ) === 44 ) return write _num _cm2 ( type , fmt , val ) ;
if ( fmt . indexOf ( '%' ) !== - 1 ) return write _num _pct2 ( type , fmt , val ) ;
if ( fmt . indexOf ( 'E' ) !== - 1 ) return write _num _exp2 ( fmt , val ) ;
if ( fmt . charCodeAt ( 0 ) === 36 ) return "$" + write _num _int ( type , fmt . substr ( fmt . charAt ( 1 ) == ' ' ? 2 : 1 ) , val ) ;
var o ;
var r /*:?Array<string>*/ , ri , ff , aval = Math . abs ( val ) , sign = val < 0 ? "-" : "" ;
if ( fmt . match ( /^00+$/ ) ) return sign + pad0 ( aval , fmt . length ) ;
if ( fmt . match ( /^[#?]+$/ ) ) {
o = ( "" + val ) ; if ( val === 0 ) o = "" ;
return o . length > fmt . length ? o : hashq ( fmt . substr ( 0 , fmt . length - o . length ) ) + o ;
}
if ( ( r = fmt . match ( frac1 ) ) ) return write _num _f2 ( r , aval , sign ) ;
if ( fmt . match ( /^#+0+$/ ) ) return sign + pad0 ( aval , fmt . length - fmt . indexOf ( "0" ) ) ;
if ( ( r = fmt . match ( dec1 ) ) ) {
/*:: if(!Array.isArray(r)) throw new Error("unreachable"); */
o = ( "" + val ) . replace ( /^([^\.]+)$/ , "$1." + hashq ( r [ 1 ] ) ) . replace ( /\.$/ , "." + hashq ( r [ 1 ] ) ) ;
o = o . replace ( /\.(\d*)$/ , function ( $$ , $1 ) {
/*:: if(!Array.isArray(r)) throw new Error("unreachable"); */
return "." + $1 + fill ( "0" , hashq ( r [ 1 ] ) . length - $1 . length ) ; } ) ;
return fmt . indexOf ( "0." ) !== - 1 ? o : o . replace ( /^0\./ , "." ) ;
}
fmt = fmt . replace ( /^#+([0.])/ , "$1" ) ;
if ( ( r = fmt . match ( /^(0*)\.(#*)$/ ) ) ) {
return sign + ( "" + aval ) . replace ( /\.(\d*[1-9])0*$/ , ".$1" ) . replace ( /^(-?\d*)$/ , "$1." ) . replace ( /^0\./ , r [ 1 ] . length ? "0." : "." ) ;
}
if ( ( r = fmt . match ( /^#{1,3},##0(\.?)$/ ) ) ) return sign + commaify ( ( "" + aval ) ) ;
if ( ( r = fmt . match ( /^#,##0\.([#0]*0)$/ ) ) ) {
return val < 0 ? "-" + write _num _int ( type , fmt , - val ) : commaify ( ( "" + val ) ) + "." + fill ( '0' , r [ 1 ] . length ) ;
}
if ( ( r = fmt . match ( /^#,#*,#0/ ) ) ) return write _num _int ( type , fmt . replace ( /^#,#*,/ , "" ) , val ) ;
if ( ( r = fmt . match ( /^([0#]+)(\\?-([0#]+))+$/ ) ) ) {
o = _strrev ( write _num _int ( type , fmt . replace ( /[\\-]/g , "" ) , val ) ) ;
ri = 0 ;
return _strrev ( _strrev ( fmt . replace ( /\\/g , "" ) ) . replace ( /[0#]/g , function ( x ) { return ri < o . length ? o . charAt ( ri ++ ) : x === '0' ? '0' : "" ; } ) ) ;
}
if ( fmt . match ( phone ) ) {
o = write _num _int ( type , "##########" , val ) ;
return "(" + o . substr ( 0 , 3 ) + ") " + o . substr ( 3 , 3 ) + "-" + o . substr ( 6 ) ;
}
var oa = "" ;
if ( ( r = fmt . match ( /^([#0?]+)( ?)\/( ?)([#0?]+)/ ) ) ) {
ri = Math . min ( /*::String(*/ r [ 4 ] /*::)*/ . length , 7 ) ;
2022-03-20 01:54:41 +00:00
ff = SSF _frac ( aval , Math . pow ( 10 , ri ) - 1 , false ) ;
2021-09-12 11:11:48 +00:00
o = "" + sign ;
oa = write _num ( "n" , /*::String(*/ r [ 1 ] /*::)*/ , ff [ 1 ] ) ;
if ( oa . charAt ( oa . length - 1 ) == " " ) oa = oa . substr ( 0 , oa . length - 1 ) + "0" ;
o += oa + /*::String(*/ r [ 2 ] /*::)*/ + "/" + /*::String(*/ r [ 3 ] /*::)*/ ;
oa = rpad _ ( ff [ 2 ] , ri ) ;
if ( oa . length < r [ 4 ] . length ) oa = hashq ( r [ 4 ] . substr ( r [ 4 ] . length - oa . length ) ) + oa ;
o += oa ;
return o ;
}
if ( ( r = fmt . match ( /^# ([#0?]+)( ?)\/( ?)([#0?]+)/ ) ) ) {
ri = Math . min ( Math . max ( r [ 1 ] . length , r [ 4 ] . length ) , 7 ) ;
2022-03-20 01:54:41 +00:00
ff = SSF _frac ( aval , Math . pow ( 10 , ri ) - 1 , true ) ;
2021-09-12 11:11:48 +00:00
return sign + ( ff [ 0 ] || ( ff [ 1 ] ? "" : "0" ) ) + " " + ( ff [ 1 ] ? pad _ ( ff [ 1 ] , ri ) + r [ 2 ] + "/" + r [ 3 ] + rpad _ ( ff [ 2 ] , ri ) : fill ( " " , 2 * ri + 1 + r [ 2 ] . length + r [ 3 ] . length ) ) ;
}
if ( ( r = fmt . match ( /^[#0?]+$/ ) ) ) {
o = "" + val ;
if ( fmt . length <= o . length ) return o ;
return hashq ( fmt . substr ( 0 , fmt . length - o . length ) ) + o ;
}
if ( ( r = fmt . match ( /^([#0]+)\.([#0]+)$/ ) ) ) {
o = "" + val . toFixed ( Math . min ( r [ 2 ] . length , 10 ) ) . replace ( /([^0])0+$/ , "$1" ) ;
ri = o . indexOf ( "." ) ;
var lres = fmt . indexOf ( "." ) - ri , rres = fmt . length - o . length - lres ;
return hashq ( fmt . substr ( 0 , lres ) + o + fmt . substr ( fmt . length - rres ) ) ;
}
if ( ( r = fmt . match ( /^00,000\.([#0]*0)$/ ) ) ) {
return val < 0 ? "-" + write _num _int ( type , fmt , - val ) : commaify ( "" + val ) . replace ( /^\d,\d{3}$/ , "0$&" ) . replace ( /^\d*$/ , function ( $$ ) { return "00," + ( $$ . length < 3 ? pad0 ( 0 , 3 - $$ . length ) : "" ) + $$ ; } ) + "." + pad0 ( 0 , r [ 1 ] . length ) ;
}
switch ( fmt ) {
case "###,###" :
case "##,###" :
case "#,###" : var x = commaify ( "" + aval ) ; return x !== "0" ? sign + x : "" ;
default :
if ( fmt . match ( /\.[0#?]*$/ ) ) return write _num _int ( type , fmt . slice ( 0 , fmt . lastIndexOf ( "." ) ) , val ) + hashq ( fmt . slice ( fmt . lastIndexOf ( "." ) ) ) ;
}
throw new Error ( "unsupported format |" + fmt + "|" ) ;
}
2022-03-20 01:54:41 +00:00
function write _num ( type /*:string*/ , fmt /*:string*/ , val /*:number*/ ) /*:string*/ {
2021-09-12 11:11:48 +00:00
return ( val | 0 ) === val ? write _num _int ( type , fmt , val ) : write _num _flt ( type , fmt , val ) ;
2022-03-20 01:54:41 +00:00
}
function SSF _split _fmt ( fmt /*:string*/ ) /*:Array<string>*/ {
2021-09-12 11:11:48 +00:00
var out /*:Array<string>*/ = [ ] ;
var in _str = false /*, cc*/ ;
for ( var i = 0 , j = 0 ; i < fmt . length ; ++ i ) switch ( ( /*cc=*/ fmt . charCodeAt ( i ) ) ) {
case 34 : /* '"' */
in _str = ! in _str ; break ;
case 95 : case 42 : case 92 : /* '_' '*' '\\' */
++ i ; break ;
case 59 : /* ';' */
out [ out . length ] = fmt . substr ( j , i - j ) ;
j = i + 1 ;
}
out [ out . length ] = fmt . substr ( j ) ;
if ( in _str === true ) throw new Error ( "Format |" + fmt + "| unterminated string " ) ;
return out ;
}
2022-03-20 01:54:41 +00:00
var SSF _abstime = /\[[HhMmSs\u0E0A\u0E19\u0E17]*\]/ ;
2021-09-12 11:11:48 +00:00
function fmt _is _date ( fmt /*:string*/ ) /*:boolean*/ {
var i = 0 , /*cc = 0,*/ c = "" , o = "" ;
while ( i < fmt . length ) {
switch ( ( c = fmt . charAt ( i ) ) ) {
2022-03-20 01:54:41 +00:00
case 'G' : if ( SSF _isgeneral ( fmt , i ) ) i += 6 ; i ++ ; break ;
2021-09-12 11:11:48 +00:00
case '"' : for ( ; ( /*cc=*/ fmt . charCodeAt ( ++ i ) ) !== 34 && i < fmt . length ; ) { /*empty*/ } ++ i ; break ;
case '\\' : i += 2 ; break ;
case '_' : i += 2 ; break ;
case '@' : ++ i ; break ;
case 'B' : case 'b' :
if ( fmt . charAt ( i + 1 ) === "1" || fmt . charAt ( i + 1 ) === "2" ) return true ;
/* falls through */
case 'M' : case 'D' : case 'Y' : case 'H' : case 'S' : case 'E' :
/* falls through */
case 'm' : case 'd' : case 'y' : case 'h' : case 's' : case 'e' : case 'g' : return true ;
case 'A' : case 'a' : case '上' :
if ( fmt . substr ( i , 3 ) . toUpperCase ( ) === "A/P" ) return true ;
if ( fmt . substr ( i , 5 ) . toUpperCase ( ) === "AM/PM" ) return true ;
if ( fmt . substr ( i , 5 ) . toUpperCase ( ) === "上午/下午" ) return true ;
++ i ; break ;
case '[' :
o = c ;
while ( fmt . charAt ( i ++ ) !== ']' && i < fmt . length ) o += fmt . charAt ( i ) ;
2022-03-20 01:54:41 +00:00
if ( o . match ( SSF _abstime ) ) return true ;
2021-09-12 11:11:48 +00:00
break ;
case '.' :
/* falls through */
case '0' : case '#' :
while ( i < fmt . length && ( "0#?.,E+-%" . indexOf ( c = fmt . charAt ( ++ i ) ) > - 1 || ( c == '\\' && fmt . charAt ( i + 1 ) == "-" && "0#" . indexOf ( fmt . charAt ( i + 2 ) ) > - 1 ) ) ) { /* empty */ }
break ;
case '?' : while ( fmt . charAt ( ++ i ) === c ) { /* empty */ } break ;
case '*' : ++ i ; if ( fmt . charAt ( i ) == ' ' || fmt . charAt ( i ) == '*' ) ++ i ; break ;
case '(' : case ')' : ++ i ; break ;
case '1' : case '2' : case '3' : case '4' : case '5' : case '6' : case '7' : case '8' : case '9' :
while ( i < fmt . length && "0123456789" . indexOf ( fmt . charAt ( ++ i ) ) > - 1 ) { /* empty */ } break ;
case ' ' : ++ i ; break ;
default : ++ i ; break ;
}
}
return false ;
}
2022-03-20 01:54:41 +00:00
2021-09-12 11:11:48 +00:00
function eval _fmt ( fmt /*:string*/ , v /*:any*/ , opts /*:any*/ , flen /*:number*/ ) {
var out = [ ] , o = "" , i = 0 , c = "" , lst = 't' , dt , j , cc ;
var hr = 'H' ;
/* Tokenize */
while ( i < fmt . length ) {
switch ( ( c = fmt . charAt ( i ) ) ) {
case 'G' : /* General */
2022-03-20 01:54:41 +00:00
if ( ! SSF _isgeneral ( fmt , i ) ) throw new Error ( 'unrecognized character ' + c + ' in ' + fmt ) ;
2021-09-12 11:11:48 +00:00
out [ out . length ] = { t : 'G' , v : 'General' } ; i += 7 ; break ;
case '"' : /* Literal text */
for ( o = "" ; ( cc = fmt . charCodeAt ( ++ i ) ) !== 34 && i < fmt . length ; ) o += String . fromCharCode ( cc ) ;
out [ out . length ] = { t : 't' , v : o } ; ++ i ; break ;
case '\\' : var w = fmt . charAt ( ++ i ) , t = ( w === "(" || w === ")" ) ? w : 't' ;
out [ out . length ] = { t : t , v : w } ; ++ i ; break ;
case '_' : out [ out . length ] = { t : 't' , v : " " } ; i += 2 ; break ;
case '@' : /* Text Placeholder */
out [ out . length ] = { t : 'T' , v : v } ; ++ i ; break ;
case 'B' : case 'b' :
if ( fmt . charAt ( i + 1 ) === "1" || fmt . charAt ( i + 1 ) === "2" ) {
2022-03-20 01:54:41 +00:00
if ( dt == null ) { dt = SSF _parse _date _code ( v , opts , fmt . charAt ( i + 1 ) === "2" ) ; if ( dt == null ) return "" ; }
2021-09-12 11:11:48 +00:00
out [ out . length ] = { t : 'X' , v : fmt . substr ( i , 2 ) } ; lst = c ; i += 2 ; break ;
}
/* falls through */
case 'M' : case 'D' : case 'Y' : case 'H' : case 'S' : case 'E' :
c = c . toLowerCase ( ) ;
/* falls through */
case 'm' : case 'd' : case 'y' : case 'h' : case 's' : case 'e' : case 'g' :
if ( v < 0 ) return "" ;
2022-03-20 01:54:41 +00:00
if ( dt == null ) { dt = SSF _parse _date _code ( v , opts ) ; if ( dt == null ) return "" ; }
2021-09-12 11:11:48 +00:00
o = c ; while ( ++ i < fmt . length && fmt . charAt ( i ) . toLowerCase ( ) === c ) o += c ;
if ( c === 'm' && lst . toLowerCase ( ) === 'h' ) c = 'M' ;
if ( c === 'h' ) c = hr ;
out [ out . length ] = { t : c , v : o } ; lst = c ; break ;
case 'A' : case 'a' : case '上' :
var q = { t : c , v : c } ;
2022-03-20 01:54:41 +00:00
if ( dt == null ) dt = SSF _parse _date _code ( v , opts ) ;
2022-04-11 04:11:47 +00:00
if ( fmt . substr ( i , 3 ) . toUpperCase ( ) === "A/P" ) { if ( dt != null ) q . v = dt . H >= 12 ? fmt . charAt ( i + 2 ) : c ; q . t = 'T' ; hr = 'h' ; i += 3 ; }
2021-09-12 11:11:48 +00:00
else if ( fmt . substr ( i , 5 ) . toUpperCase ( ) === "AM/PM" ) { if ( dt != null ) q . v = dt . H >= 12 ? "PM" : "AM" ; q . t = 'T' ; i += 5 ; hr = 'h' ; }
else if ( fmt . substr ( i , 5 ) . toUpperCase ( ) === "上午/下午" ) { if ( dt != null ) q . v = dt . H >= 12 ? "下午" : "上午" ; q . t = 'T' ; i += 5 ; hr = 'h' ; }
else { q . t = "t" ; ++ i ; }
if ( dt == null && q . t === 'T' ) return "" ;
out [ out . length ] = q ; lst = c ; break ;
case '[' :
o = c ;
while ( fmt . charAt ( i ++ ) !== ']' && i < fmt . length ) o += fmt . charAt ( i ) ;
if ( o . slice ( - 1 ) !== ']' ) throw 'unterminated "[" block: |' + o + '|' ;
2022-03-20 01:54:41 +00:00
if ( o . match ( SSF _abstime ) ) {
if ( dt == null ) { dt = SSF _parse _date _code ( v , opts ) ; if ( dt == null ) return "" ; }
2021-09-12 11:11:48 +00:00
out [ out . length ] = { t : 'Z' , v : o . toLowerCase ( ) } ;
lst = o . charAt ( 1 ) ;
} else if ( o . indexOf ( "$" ) > - 1 ) {
o = ( o . match ( /\$([^-\[\]]*)/ ) || [ ] ) [ 1 ] || "$" ;
if ( ! fmt _is _date ( fmt ) ) out [ out . length ] = { t : 't' , v : o } ;
}
break ;
/* Numbers */
case '.' :
if ( dt != null ) {
o = c ; while ( ++ i < fmt . length && ( c = fmt . charAt ( i ) ) === "0" ) o += c ;
out [ out . length ] = { t : 's' , v : o } ; break ;
}
/* falls through */
case '0' : case '#' :
o = c ; while ( ++ i < fmt . length && "0#?.,E+-%" . indexOf ( c = fmt . charAt ( i ) ) > - 1 ) o += c ;
out [ out . length ] = { t : 'n' , v : o } ; break ;
case '?' :
o = c ; while ( fmt . charAt ( ++ i ) === c ) o += c ;
out [ out . length ] = { t : c , v : o } ; lst = c ; break ;
case '*' : ++ i ; if ( fmt . charAt ( i ) == ' ' || fmt . charAt ( i ) == '*' ) ++ i ; break ; // **
case '(' : case ')' : out [ out . length ] = { t : ( flen === 1 ? 't' : c ) , v : c } ; ++ i ; break ;
case '1' : case '2' : case '3' : case '4' : case '5' : case '6' : case '7' : case '8' : case '9' :
o = c ; while ( i < fmt . length && "0123456789" . indexOf ( fmt . charAt ( ++ i ) ) > - 1 ) o += fmt . charAt ( i ) ;
out [ out . length ] = { t : 'D' , v : o } ; break ;
case ' ' : out [ out . length ] = { t : c , v : c } ; ++ i ; break ;
case '$' : out [ out . length ] = { t : 't' , v : '$' } ; ++ i ; break ;
default :
if ( ",$-+/():!^&'~{}<>=€acfijklopqrtuvwxzP" . indexOf ( c ) === - 1 ) throw new Error ( 'unrecognized character ' + c + ' in ' + fmt ) ;
out [ out . length ] = { t : 't' , v : c } ; ++ i ; break ;
}
}
/* Scan for date/time parts */
var bt = 0 , ss0 = 0 , ssm ;
for ( i = out . length - 1 , lst = 't' ; i >= 0 ; -- i ) {
switch ( out [ i ] . t ) {
case 'h' : case 'H' : out [ i ] . t = hr ; lst = 'h' ; if ( bt < 1 ) bt = 1 ; break ;
case 's' :
if ( ( ssm = out [ i ] . v . match ( /\.0+$/ ) ) ) ss0 = Math . max ( ss0 , ssm [ 0 ] . length - 1 ) ;
if ( bt < 3 ) bt = 3 ;
/* falls through */
case 'd' : case 'y' : case 'M' : case 'e' : lst = out [ i ] . t ; break ;
case 'm' : if ( lst === 's' ) { out [ i ] . t = 'M' ; if ( bt < 2 ) bt = 2 ; } break ;
case 'X' : /*if(out[i].v === "B2");*/
break ;
case 'Z' :
if ( bt < 1 && out [ i ] . v . match ( /[Hh]/ ) ) bt = 1 ;
if ( bt < 2 && out [ i ] . v . match ( /[Mm]/ ) ) bt = 2 ;
if ( bt < 3 && out [ i ] . v . match ( /[Ss]/ ) ) bt = 3 ;
}
}
/* time rounding depends on presence of minute / second / usec fields */
switch ( bt ) {
case 0 : break ;
case 1 :
/*::if(!dt) break;*/
if ( dt . u >= 0.5 ) { dt . u = 0 ; ++ dt . S ; }
if ( dt . S >= 60 ) { dt . S = 0 ; ++ dt . M ; }
if ( dt . M >= 60 ) { dt . M = 0 ; ++ dt . H ; }
break ;
case 2 :
/*::if(!dt) break;*/
if ( dt . u >= 0.5 ) { dt . u = 0 ; ++ dt . S ; }
if ( dt . S >= 60 ) { dt . S = 0 ; ++ dt . M ; }
break ;
}
/* replace fields */
var nstr = "" , jj ;
for ( i = 0 ; i < out . length ; ++ i ) {
switch ( out [ i ] . t ) {
case 't' : case 'T' : case ' ' : case 'D' : break ;
case 'X' : out [ i ] . v = "" ; out [ i ] . t = ";" ; break ;
case 'd' : case 'm' : case 'y' : case 'h' : case 'H' : case 'M' : case 's' : case 'e' : case 'b' : case 'Z' :
/*::if(!dt) throw "unreachable"; */
2022-03-20 01:54:41 +00:00
out [ i ] . v = SSF _write _date ( out [ i ] . t . charCodeAt ( 0 ) , out [ i ] . v , dt , ss0 ) ;
2021-09-12 11:11:48 +00:00
out [ i ] . t = 't' ; break ;
case 'n' : case '?' :
jj = i + 1 ;
while ( out [ jj ] != null && (
( c = out [ jj ] . t ) === "?" || c === "D" ||
( ( c === " " || c === "t" ) && out [ jj + 1 ] != null && ( out [ jj + 1 ] . t === '?' || out [ jj + 1 ] . t === "t" && out [ jj + 1 ] . v === '/' ) ) ||
( out [ i ] . t === '(' && ( c === ' ' || c === 'n' || c === ')' ) ) ||
( c === 't' && ( out [ jj ] . v === '/' || out [ jj ] . v === ' ' && out [ jj + 1 ] != null && out [ jj + 1 ] . t == '?' ) )
) ) {
out [ i ] . v += out [ jj ] . v ;
out [ jj ] = { v : "" , t : ";" } ; ++ jj ;
}
nstr += out [ i ] . v ;
i = jj - 1 ; break ;
2022-03-20 01:54:41 +00:00
case 'G' : out [ i ] . t = 't' ; out [ i ] . v = SSF _general ( v , opts ) ; break ;
2021-09-12 11:11:48 +00:00
}
}
var vv = "" , myv , ostr ;
if ( nstr . length > 0 ) {
if ( nstr . charCodeAt ( 0 ) == 40 ) /* '(' */ {
myv = ( v < 0 && nstr . charCodeAt ( 0 ) === 45 ? - v : v ) ;
ostr = write _num ( 'n' , nstr , myv ) ;
} else {
myv = ( v < 0 && flen > 1 ? - v : v ) ;
ostr = write _num ( 'n' , nstr , myv ) ;
if ( myv < 0 && out [ 0 ] && out [ 0 ] . t == 't' ) {
ostr = ostr . substr ( 1 ) ;
out [ 0 ] . v = "-" + out [ 0 ] . v ;
}
}
jj = ostr . length - 1 ;
var decpt = out . length ;
for ( i = 0 ; i < out . length ; ++ i ) if ( out [ i ] != null && out [ i ] . t != 't' && out [ i ] . v . indexOf ( "." ) > - 1 ) { decpt = i ; break ; }
var lasti = out . length ;
if ( decpt === out . length && ostr . indexOf ( "E" ) === - 1 ) {
for ( i = out . length - 1 ; i >= 0 ; -- i ) {
if ( out [ i ] == null || 'n?' . indexOf ( out [ i ] . t ) === - 1 ) continue ;
if ( jj >= out [ i ] . v . length - 1 ) { jj -= out [ i ] . v . length ; out [ i ] . v = ostr . substr ( jj + 1 , out [ i ] . v . length ) ; }
else if ( jj < 0 ) out [ i ] . v = "" ;
else { out [ i ] . v = ostr . substr ( 0 , jj + 1 ) ; jj = - 1 ; }
out [ i ] . t = 't' ;
lasti = i ;
}
if ( jj >= 0 && lasti < out . length ) out [ lasti ] . v = ostr . substr ( 0 , jj + 1 ) + out [ lasti ] . v ;
}
else if ( decpt !== out . length && ostr . indexOf ( "E" ) === - 1 ) {
jj = ostr . indexOf ( "." ) - 1 ;
for ( i = decpt ; i >= 0 ; -- i ) {
if ( out [ i ] == null || 'n?' . indexOf ( out [ i ] . t ) === - 1 ) continue ;
j = out [ i ] . v . indexOf ( "." ) > - 1 && i === decpt ? out [ i ] . v . indexOf ( "." ) - 1 : out [ i ] . v . length - 1 ;
vv = out [ i ] . v . substr ( j + 1 ) ;
for ( ; j >= 0 ; -- j ) {
if ( jj >= 0 && ( out [ i ] . v . charAt ( j ) === "0" || out [ i ] . v . charAt ( j ) === "#" ) ) vv = ostr . charAt ( jj -- ) + vv ;
}
out [ i ] . v = vv ;
out [ i ] . t = 't' ;
lasti = i ;
}
if ( jj >= 0 && lasti < out . length ) out [ lasti ] . v = ostr . substr ( 0 , jj + 1 ) + out [ lasti ] . v ;
jj = ostr . indexOf ( "." ) + 1 ;
for ( i = decpt ; i < out . length ; ++ i ) {
if ( out [ i ] == null || ( 'n?(' . indexOf ( out [ i ] . t ) === - 1 && i !== decpt ) ) continue ;
j = out [ i ] . v . indexOf ( "." ) > - 1 && i === decpt ? out [ i ] . v . indexOf ( "." ) + 1 : 0 ;
vv = out [ i ] . v . substr ( 0 , j ) ;
for ( ; j < out [ i ] . v . length ; ++ j ) {
if ( jj < ostr . length ) vv += ostr . charAt ( jj ++ ) ;
}
out [ i ] . v = vv ;
out [ i ] . t = 't' ;
lasti = i ;
}
}
}
for ( i = 0 ; i < out . length ; ++ i ) if ( out [ i ] != null && 'n?' . indexOf ( out [ i ] . t ) > - 1 ) {
myv = ( flen > 1 && v < 0 && i > 0 && out [ i - 1 ] . v === "-" ? - v : v ) ;
out [ i ] . v = write _num ( out [ i ] . t , out [ i ] . v , myv ) ;
out [ i ] . t = 't' ;
}
var retval = "" ;
for ( i = 0 ; i !== out . length ; ++ i ) if ( out [ i ] != null ) retval += out [ i ] . v ;
return retval ;
}
2022-03-20 01:54:41 +00:00
2021-09-12 11:11:48 +00:00
var cfregex2 = /\[(=|>[=]?|<[>=]?)(-?\d+(?:\.\d*)?)\]/ ;
function chkcond ( v , rr ) {
if ( rr == null ) return false ;
var thresh = parseFloat ( rr [ 2 ] ) ;
switch ( rr [ 1 ] ) {
case "=" : if ( v == thresh ) return true ; break ;
case ">" : if ( v > thresh ) return true ; break ;
case "<" : if ( v < thresh ) return true ; break ;
case "<>" : if ( v != thresh ) return true ; break ;
case ">=" : if ( v >= thresh ) return true ; break ;
case "<=" : if ( v <= thresh ) return true ; break ;
}
return false ;
}
function choose _fmt ( f /*:string*/ , v /*:any*/ ) {
2022-03-20 01:54:41 +00:00
var fmt = SSF _split _fmt ( f ) ;
2021-09-12 11:11:48 +00:00
var l = fmt . length , lat = fmt [ l - 1 ] . indexOf ( "@" ) ;
if ( l < 4 && lat > - 1 ) -- l ;
if ( fmt . length > 4 ) throw new Error ( "cannot find right format for |" + fmt . join ( "|" ) + "|" ) ;
if ( typeof v !== "number" ) return [ 4 , fmt . length === 4 || lat > - 1 ? fmt [ fmt . length - 1 ] : "@" ] ;
switch ( fmt . length ) {
case 1 : fmt = lat > - 1 ? [ "General" , "General" , "General" , fmt [ 0 ] ] : [ fmt [ 0 ] , fmt [ 0 ] , fmt [ 0 ] , "@" ] ; break ;
case 2 : fmt = lat > - 1 ? [ fmt [ 0 ] , fmt [ 0 ] , fmt [ 0 ] , fmt [ 1 ] ] : [ fmt [ 0 ] , fmt [ 1 ] , fmt [ 0 ] , "@" ] ; break ;
case 3 : fmt = lat > - 1 ? [ fmt [ 0 ] , fmt [ 1 ] , fmt [ 0 ] , fmt [ 2 ] ] : [ fmt [ 0 ] , fmt [ 1 ] , fmt [ 2 ] , "@" ] ; break ;
case 4 : break ;
}
var ff = v > 0 ? fmt [ 0 ] : v < 0 ? fmt [ 1 ] : fmt [ 2 ] ;
if ( fmt [ 0 ] . indexOf ( "[" ) === - 1 && fmt [ 1 ] . indexOf ( "[" ) === - 1 ) return [ l , ff ] ;
2022-03-20 01:54:41 +00:00
if ( fmt [ 0 ] . match ( /\[[=<>]/ ) != null || fmt [ 1 ] . match ( /\[[=<>]/ ) != null ) {
2021-09-12 11:11:48 +00:00
var m1 = fmt [ 0 ] . match ( cfregex2 ) ;
var m2 = fmt [ 1 ] . match ( cfregex2 ) ;
return chkcond ( v , m1 ) ? [ l , fmt [ 0 ] ] : chkcond ( v , m2 ) ? [ l , fmt [ 1 ] ] : [ l , fmt [ m1 != null && m2 != null ? 2 : 1 ] ] ;
}
return [ l , ff ] ;
}
2022-03-20 01:54:41 +00:00
function SSF _format ( fmt /*:string|number*/ , v /*:any*/ , o /*:?any*/ ) {
2021-09-12 11:11:48 +00:00
if ( o == null ) o = { } ;
var sfmt = "" ;
switch ( typeof fmt ) {
case "string" :
if ( fmt == "m/d/yy" && o . dateNF ) sfmt = o . dateNF ;
else sfmt = fmt ;
break ;
case "number" :
if ( fmt == 14 && o . dateNF ) sfmt = o . dateNF ;
else sfmt = ( o . table != null ? ( o . table /*:any*/ ) : table _fmt ) [ fmt ] ;
2022-03-20 01:54:41 +00:00
if ( sfmt == null ) sfmt = ( o . table && o . table [ SSF _default _map [ fmt ] ] ) || table _fmt [ SSF _default _map [ fmt ] ] ;
if ( sfmt == null ) sfmt = SSF _default _str [ fmt ] || "General" ;
2021-09-12 11:11:48 +00:00
break ;
}
2022-03-20 01:54:41 +00:00
if ( SSF _isgeneral ( sfmt , 0 ) ) return SSF _general ( v , o ) ;
2021-09-12 11:11:48 +00:00
if ( v instanceof Date ) v = datenum _local ( v , o . date1904 ) ;
var f = choose _fmt ( sfmt , v ) ;
2022-03-20 01:54:41 +00:00
if ( SSF _isgeneral ( f [ 1 ] ) ) return SSF _general ( v , o ) ;
2021-09-12 11:11:48 +00:00
if ( v === true ) v = "TRUE" ; else if ( v === false ) v = "FALSE" ;
else if ( v === "" || v == null ) return "" ;
return eval _fmt ( f [ 1 ] , v , o , f [ 0 ] ) ;
}
2022-03-20 01:54:41 +00:00
function SSF _load ( fmt /*:string*/ , idx /*:?number*/ ) /*:number*/ {
2021-09-12 11:11:48 +00:00
if ( typeof idx != 'number' ) {
idx = + idx || - 1 ;
/*::if(typeof idx != 'number') return 0x188; */
for ( var i = 0 ; i < 0x0188 ; ++ i ) {
/*::if(typeof idx != 'number') return 0x188; */
if ( table _fmt [ i ] == undefined ) { if ( idx < 0 ) idx = i ; continue ; }
if ( table _fmt [ i ] == fmt ) { idx = i ; break ; }
}
/*::if(typeof idx != 'number') return 0x188; */
if ( idx < 0 ) idx = 0x187 ;
}
/*::if(typeof idx != 'number') return 0x188; */
table _fmt [ idx ] = fmt ;
return idx ;
}
2022-03-20 01:54:41 +00:00
function SSF _load _table ( tbl /*:SSFTable*/ ) /*:void*/ {
2021-09-12 11:11:48 +00:00
for ( var i = 0 ; i != 0x0188 ; ++ i )
2022-03-20 01:54:41 +00:00
if ( tbl [ i ] !== undefined ) SSF _load ( tbl [ i ] , i ) ;
}
function make _ssf ( ) {
table _fmt = SSF _init _table ( ) ;
2022-03-12 14:05:57 +00:00
}
2022-03-20 01:54:41 +00:00
var SSF = {
format : SSF _format ,
load : SSF _load ,
_table : table _fmt ,
load _table : SSF _load _table ,
parse _date _code : SSF _parse _date _code ,
is _date : fmt _is _date ,
get _table : function get _table ( ) { return SSF . _table = table _fmt ; }
} ;
2021-09-12 11:11:48 +00:00
var SSFImplicit /*{[number]:string}*/ = ( {
"5" : '"$"#,##0_);\\("$"#,##0\\)' ,
"6" : '"$"#,##0_);[Red]\\("$"#,##0\\)' ,
"7" : '"$"#,##0.00_);\\("$"#,##0.00\\)' ,
"8" : '"$"#,##0.00_);[Red]\\("$"#,##0.00\\)' ,
"23" : 'General' , "24" : 'General' , "25" : 'General' , "26" : 'General' ,
"27" : 'm/d/yy' , "28" : 'm/d/yy' , "29" : 'm/d/yy' , "30" : 'm/d/yy' , "31" : 'm/d/yy' ,
"32" : 'h:mm:ss' , "33" : 'h:mm:ss' , "34" : 'h:mm:ss' , "35" : 'h:mm:ss' ,
"36" : 'm/d/yy' ,
"41" : '_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)' ,
"42" : '_("$"* #,##0_);_("$"* \(#,##0\);_("$"* "-"_);_(@_)' ,
"43" : '_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_)' ,
"44" : '_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)' ,
"50" : 'm/d/yy' , "51" : 'm/d/yy' , "52" : 'm/d/yy' , "53" : 'm/d/yy' , "54" : 'm/d/yy' ,
"55" : 'm/d/yy' , "56" : 'm/d/yy' , "57" : 'm/d/yy' , "58" : 'm/d/yy' ,
"59" : '0' ,
"60" : '0.00' ,
"61" : '#,##0' ,
"62" : '#,##0.00' ,
"63" : '"$"#,##0_);\\("$"#,##0\\)' ,
"64" : '"$"#,##0_);[Red]\\("$"#,##0\\)' ,
"65" : '"$"#,##0.00_);\\("$"#,##0.00\\)' ,
"66" : '"$"#,##0.00_);[Red]\\("$"#,##0.00\\)' ,
"67" : '0%' ,
"68" : '0.00%' ,
"69" : '# ?/?' ,
"70" : '# ??/??' ,
"71" : 'm/d/yy' ,
"72" : 'm/d/yy' ,
"73" : 'd-mmm-yy' ,
"74" : 'd-mmm' ,
"75" : 'mmm-yy' ,
"76" : 'h:mm' ,
"77" : 'h:mm:ss' ,
"78" : 'm/d/yy h:mm' ,
"79" : 'mm:ss' ,
"80" : '[h]:mm:ss' ,
"81" : 'mmss.0'
} /*:any*/ ) ;
/* dateNF parse TODO: move to SSF */
var dateNFregex = /[dD]+|[mM]+|[yYeE]+|[Hh]+|[Ss]+/g ;
function dateNF _regex ( dateNF /*:string|number*/ ) /*:RegExp*/ {
2022-03-20 01:54:41 +00:00
var fmt = typeof dateNF == "number" ? table _fmt [ dateNF ] : dateNF ;
2021-09-12 11:11:48 +00:00
fmt = fmt . replace ( dateNFregex , "(\\d+)" ) ;
return new RegExp ( "^" + fmt + "$" ) ;
}
function dateNF _fix ( str /*:string*/ , dateNF /*:string*/ , match /*:Array<string>*/ ) /*:string*/ {
var Y = - 1 , m = - 1 , d = - 1 , H = - 1 , M = - 1 , S = - 1 ;
( dateNF . match ( dateNFregex ) || [ ] ) . forEach ( function ( n , i ) {
var v = parseInt ( match [ i + 1 ] , 10 ) ;
switch ( n . toLowerCase ( ) . charAt ( 0 ) ) {
case 'y' : Y = v ; break ; case 'd' : d = v ; break ;
case 'h' : H = v ; break ; case 's' : S = v ; break ;
case 'm' : if ( H >= 0 ) M = v ; else m = v ; break ;
}
} ) ;
if ( S >= 0 && M == - 1 && m >= 0 ) { M = m ; m = - 1 ; }
var datestr = ( ( "" + ( Y >= 0 ? Y : new Date ( ) . getFullYear ( ) ) ) . slice ( - 4 ) + "-" + ( "00" + ( m >= 1 ? m : 1 ) ) . slice ( - 2 ) + "-" + ( "00" + ( d >= 1 ? d : 1 ) ) . slice ( - 2 ) ) ;
if ( datestr . length == 7 ) datestr = "0" + datestr ;
if ( datestr . length == 8 ) datestr = "20" + datestr ;
var timestr = ( ( "00" + ( H >= 0 ? H : 0 ) ) . slice ( - 2 ) + ":" + ( "00" + ( M >= 0 ? M : 0 ) ) . slice ( - 2 ) + ":" + ( "00" + ( S >= 0 ? S : 0 ) ) . slice ( - 2 ) ) ;
if ( H == - 1 && M == - 1 && S == - 1 ) return datestr ;
if ( Y == - 1 && m == - 1 && d == - 1 ) return timestr ;
return datestr + "T" + timestr ;
}
2022-04-11 04:11:47 +00:00
/* table of bad formats written by third-party tools */
var bad _formats = {
"d.m" : "d\\.m" // Issue #2571 Google Sheets writes invalid format 'd.m', correct format is 'd"."m' or 'd\\.m'
} ;
function SSF _ _load ( fmt , idx ) {
return SSF _load ( bad _formats [ fmt ] || fmt , idx ) ;
}
2021-09-12 11:11:48 +00:00
/ * : :
declare var ReadShift : any ;
declare var CheckField : any ;
declare var prep _blob : any ;
declare var _ _readUInt32LE : any ;
declare var _ _readInt32LE : any ;
declare var _ _toBuffer : any ;
declare var _ _utf16le : any ;
declare var bconcat : any ;
declare var s2a : any ;
declare var chr0 : any ;
declare var chr1 : any ;
declare var has _buf : boolean ;
declare var new _buf : any ;
declare var new _raw _buf : any ;
declare var new _unsafe _buf : any ;
2022-02-14 01:28:13 +00:00
declare var Buffer _from : any ;
2021-09-12 11:11:48 +00:00
* /
/* cfb.js (C) 2013-present SheetJS -- http://sheetjs.com */
/* vim: set ts=2: */
/*jshint eqnull:true */
/*exported CFB */
2022-03-11 05:29:05 +00:00
/*global Uint8Array:false, Uint16Array:false */
2021-09-12 11:11:48 +00:00
/ * : :
type SectorEntry = {
name ? : string ;
nodes ? : Array < number > ;
data : RawBytes ;
} ;
type SectorList = {
[ k : string | number ] : SectorEntry ;
name : ? string ;
fat _addrs : Array < number > ;
ssz : number ;
}
type CFBFiles = { [ n : string ] : CFBEntry } ;
* /
/* crc32.js (C) 2014-present SheetJS -- http://sheetjs.com */
/* vim: set ts=2: */
/*exported CRC32 */
2022-03-12 14:05:57 +00:00
var CRC32 = /*#__PURE__*/ ( function ( ) {
2022-03-11 05:29:05 +00:00
var CRC32 = { } ;
2021-09-12 11:11:48 +00:00
CRC32 . version = '1.2.0' ;
/* see perf/crc32table.js */
/*global Int32Array */
function signed _crc _table ( ) /*:any*/ {
var c = 0 , table /*:Array<number>*/ = new Array ( 256 ) ;
for ( var n = 0 ; n != 256 ; ++ n ) {
c = n ;
c = ( ( c & 1 ) ? ( - 306674912 ^ ( c >>> 1 ) ) : ( c >>> 1 ) ) ;
c = ( ( c & 1 ) ? ( - 306674912 ^ ( c >>> 1 ) ) : ( c >>> 1 ) ) ;
c = ( ( c & 1 ) ? ( - 306674912 ^ ( c >>> 1 ) ) : ( c >>> 1 ) ) ;
c = ( ( c & 1 ) ? ( - 306674912 ^ ( c >>> 1 ) ) : ( c >>> 1 ) ) ;
c = ( ( c & 1 ) ? ( - 306674912 ^ ( c >>> 1 ) ) : ( c >>> 1 ) ) ;
c = ( ( c & 1 ) ? ( - 306674912 ^ ( c >>> 1 ) ) : ( c >>> 1 ) ) ;
c = ( ( c & 1 ) ? ( - 306674912 ^ ( c >>> 1 ) ) : ( c >>> 1 ) ) ;
c = ( ( c & 1 ) ? ( - 306674912 ^ ( c >>> 1 ) ) : ( c >>> 1 ) ) ;
table [ n ] = c ;
}
return typeof Int32Array !== 'undefined' ? new Int32Array ( table ) : table ;
}
2022-02-14 01:28:13 +00:00
var T0 = signed _crc _table ( ) ;
function slice _by _16 _tables ( T ) {
var c = 0 , v = 0 , n = 0 , table /*:Array<number>*/ = typeof Int32Array !== 'undefined' ? new Int32Array ( 4096 ) : new Array ( 4096 ) ;
2021-09-12 11:11:48 +00:00
2022-02-14 01:28:13 +00:00
for ( n = 0 ; n != 256 ; ++ n ) table [ n ] = T [ n ] ;
for ( n = 0 ; n != 256 ; ++ n ) {
v = T [ n ] ;
for ( c = 256 + n ; c < 4096 ; c += 256 ) v = table [ c ] = ( v >>> 8 ) ^ T [ v & 0xFF ] ;
2021-09-12 11:11:48 +00:00
}
2022-02-14 01:28:13 +00:00
var out = [ ] ;
2023-03-15 08:17:09 +00:00
for ( n = 1 ; n != 16 ; ++ n ) out [ n - 1 ] = typeof Int32Array !== 'undefined' && typeof table . subarray == "function" ? table . subarray ( n * 256 , n * 256 + 256 ) : table . slice ( n * 256 , n * 256 + 256 ) ;
2022-02-14 01:28:13 +00:00
return out ;
2021-09-12 11:11:48 +00:00
}
2022-02-14 01:28:13 +00:00
var TT = slice _by _16 _tables ( T0 ) ;
var T1 = TT [ 0 ] , T2 = TT [ 1 ] , T3 = TT [ 2 ] , T4 = TT [ 3 ] , T5 = TT [ 4 ] ;
var T6 = TT [ 5 ] , T7 = TT [ 6 ] , T8 = TT [ 7 ] , T9 = TT [ 8 ] , Ta = TT [ 9 ] ;
var Tb = TT [ 10 ] , Tc = TT [ 11 ] , Td = TT [ 12 ] , Te = TT [ 13 ] , Tf = TT [ 14 ] ;
function crc32 _bstr ( bstr /*:string*/ , seed /*:number*/ ) /*:number*/ {
var C = seed /*:: ? 0 : 0 */ ^ - 1 ;
for ( var i = 0 , L = bstr . length ; i < L ; ) C = ( C >>> 8 ) ^ T0 [ ( C ^ bstr . charCodeAt ( i ++ ) ) & 0xFF ] ;
return ~ C ;
}
function crc32 _buf ( B /*:Uint8Array|Array<number>*/ , seed /*:number*/ ) /*:number*/ {
var C = seed /*:: ? 0 : 0 */ ^ - 1 , L = B . length - 15 , i = 0 ;
for ( ; i < L ; ) C =
Tf [ B [ i ++ ] ^ ( C & 255 ) ] ^
Te [ B [ i ++ ] ^ ( ( C >> 8 ) & 255 ) ] ^
Td [ B [ i ++ ] ^ ( ( C >> 16 ) & 255 ) ] ^
Tc [ B [ i ++ ] ^ ( C >>> 24 ) ] ^
Tb [ B [ i ++ ] ] ^ Ta [ B [ i ++ ] ] ^ T9 [ B [ i ++ ] ] ^ T8 [ B [ i ++ ] ] ^
T7 [ B [ i ++ ] ] ^ T6 [ B [ i ++ ] ] ^ T5 [ B [ i ++ ] ] ^ T4 [ B [ i ++ ] ] ^
T3 [ B [ i ++ ] ] ^ T2 [ B [ i ++ ] ] ^ T1 [ B [ i ++ ] ] ^ T0 [ B [ i ++ ] ] ;
L += 15 ;
while ( i < L ) C = ( C >>> 8 ) ^ T0 [ ( C ^ B [ i ++ ] ) & 0xFF ] ;
return ~ C ;
2021-09-12 11:11:48 +00:00
}
function crc32 _str ( str /*:string*/ , seed /*:number*/ ) /*:number*/ {
var C = seed ^ - 1 ;
2022-02-14 01:28:13 +00:00
for ( var i = 0 , L = str . length , c = 0 , d = 0 ; i < L ; ) {
2021-09-12 11:11:48 +00:00
c = str . charCodeAt ( i ++ ) ;
if ( c < 0x80 ) {
2022-02-14 01:28:13 +00:00
C = ( C >>> 8 ) ^ T0 [ ( C ^ c ) & 0xFF ] ;
2021-09-12 11:11:48 +00:00
} else if ( c < 0x800 ) {
2022-02-14 01:28:13 +00:00
C = ( C >>> 8 ) ^ T0 [ ( C ^ ( 192 | ( ( c >> 6 ) & 31 ) ) ) & 0xFF ] ;
C = ( C >>> 8 ) ^ T0 [ ( C ^ ( 128 | ( c & 63 ) ) ) & 0xFF ] ;
2021-09-12 11:11:48 +00:00
} else if ( c >= 0xD800 && c < 0xE000 ) {
c = ( c & 1023 ) + 64 ; d = str . charCodeAt ( i ++ ) & 1023 ;
2022-02-14 01:28:13 +00:00
C = ( C >>> 8 ) ^ T0 [ ( C ^ ( 240 | ( ( c >> 8 ) & 7 ) ) ) & 0xFF ] ;
C = ( C >>> 8 ) ^ T0 [ ( C ^ ( 128 | ( ( c >> 2 ) & 63 ) ) ) & 0xFF ] ;
C = ( C >>> 8 ) ^ T0 [ ( C ^ ( 128 | ( ( d >> 6 ) & 15 ) | ( ( c & 3 ) << 4 ) ) ) & 0xFF ] ;
C = ( C >>> 8 ) ^ T0 [ ( C ^ ( 128 | ( d & 63 ) ) ) & 0xFF ] ;
2021-09-12 11:11:48 +00:00
} else {
2022-02-14 01:28:13 +00:00
C = ( C >>> 8 ) ^ T0 [ ( C ^ ( 224 | ( ( c >> 12 ) & 15 ) ) ) & 0xFF ] ;
C = ( C >>> 8 ) ^ T0 [ ( C ^ ( 128 | ( ( c >> 6 ) & 63 ) ) ) & 0xFF ] ;
C = ( C >>> 8 ) ^ T0 [ ( C ^ ( 128 | ( c & 63 ) ) ) & 0xFF ] ;
2021-09-12 11:11:48 +00:00
}
}
2022-02-14 01:28:13 +00:00
return ~ C ;
2021-09-12 11:11:48 +00:00
}
2022-02-14 01:28:13 +00:00
CRC32 . table = T0 ;
2021-09-12 11:11:48 +00:00
CRC32 . bstr = crc32 _bstr ;
CRC32 . buf = crc32 _buf ;
CRC32 . str = crc32 _str ;
2022-03-11 05:29:05 +00:00
return CRC32 ;
} ) ( ) ;
2021-09-12 11:11:48 +00:00
/* [MS-CFB] v20171201 */
2022-03-12 14:05:57 +00:00
var CFB = /*#__PURE__*/ ( function _CFB ( ) {
2022-05-22 23:51:41 +00:00
var exports /*:CFBModule*/ = /*::(*/ { } /*:: :any)*/ ;
exports . version = '1.2.2' ;
2021-09-12 11:11:48 +00:00
/* [MS-CFB] 2.6.4 */
function namecmp ( l /*:string*/ , r /*:string*/ ) /*:number*/ {
var L = l . split ( "/" ) , R = r . split ( "/" ) ;
for ( var i = 0 , c = 0 , Z = Math . min ( L . length , R . length ) ; i < Z ; ++ i ) {
if ( ( c = L [ i ] . length - R [ i ] . length ) ) return c ;
if ( L [ i ] != R [ i ] ) return L [ i ] < R [ i ] ? - 1 : 1 ;
}
return L . length - R . length ;
}
function dirname ( p /*:string*/ ) /*:string*/ {
if ( p . charAt ( p . length - 1 ) == "/" ) return ( p . slice ( 0 , - 1 ) . indexOf ( "/" ) === - 1 ) ? p : dirname ( p . slice ( 0 , - 1 ) ) ;
var c = p . lastIndexOf ( "/" ) ;
return ( c === - 1 ) ? p : p . slice ( 0 , c + 1 ) ;
}
function filename ( p /*:string*/ ) /*:string*/ {
if ( p . charAt ( p . length - 1 ) == "/" ) return filename ( p . slice ( 0 , - 1 ) ) ;
var c = p . lastIndexOf ( "/" ) ;
return ( c === - 1 ) ? p : p . slice ( c + 1 ) ;
}
/* -------------------------------------------------------------------------- */
/ * D O S D a t e f o r m a t :
high | YYYYYYYm . mmmddddd . HHHHHMMM . MMMSSSSS | low
add 1980 to stored year
stored second should be doubled
* /
/* write JS date to buf as a DOS date */
function write _dos _date ( buf /*:CFBlob*/ , date /*:Date|string*/ ) {
if ( typeof date === "string" ) date = new Date ( date ) ;
var hms /*:number*/ = date . getHours ( ) ;
hms = hms << 6 | date . getMinutes ( ) ;
hms = hms << 5 | ( date . getSeconds ( ) >>> 1 ) ;
buf . write _shift ( 2 , hms ) ;
var ymd /*:number*/ = ( date . getFullYear ( ) - 1980 ) ;
ymd = ymd << 4 | ( date . getMonth ( ) + 1 ) ;
ymd = ymd << 5 | date . getDate ( ) ;
buf . write _shift ( 2 , ymd ) ;
}
/* read four bytes from buf and interpret as a DOS date */
function parse _dos _date ( buf /*:CFBlob*/ ) /*:Date*/ {
var hms = buf . read _shift ( 2 ) & 0xFFFF ;
var ymd = buf . read _shift ( 2 ) & 0xFFFF ;
var val = new Date ( ) ;
var d = ymd & 0x1F ; ymd >>>= 5 ;
var m = ymd & 0x0F ; ymd >>>= 4 ;
val . setMilliseconds ( 0 ) ;
val . setFullYear ( ymd + 1980 ) ;
val . setMonth ( m - 1 ) ;
val . setDate ( d ) ;
var S = hms & 0x1F ; hms >>>= 5 ;
var M = hms & 0x3F ; hms >>>= 6 ;
val . setHours ( hms ) ;
val . setMinutes ( M ) ;
val . setSeconds ( S << 1 ) ;
return val ;
}
function parse _extra _field ( blob /*:CFBlob*/ ) /*:any*/ {
prep _blob ( blob , 0 ) ;
var o = /*::(*/ { } /*:: :any)*/ ;
var flags = 0 ;
while ( blob . l <= blob . length - 4 ) {
var type = blob . read _shift ( 2 ) ;
var sz = blob . read _shift ( 2 ) , tgt = blob . l + sz ;
var p = { } ;
switch ( type ) {
/* UNIX-style Timestamps */
case 0x5455 : {
flags = blob . read _shift ( 1 ) ;
if ( flags & 1 ) p . mtime = blob . read _shift ( 4 ) ;
/* for some reason, CD flag corresponds to LFH */
if ( sz > 5 ) {
if ( flags & 2 ) p . atime = blob . read _shift ( 4 ) ;
if ( flags & 4 ) p . ctime = blob . read _shift ( 4 ) ;
}
if ( p . mtime ) p . mt = new Date ( p . mtime * 1000 ) ;
2022-09-06 06:18:12 +00:00
} break ;
/* ZIP64 Extended Information Field */
case 0x0001 : {
var sz1 = blob . read _shift ( 4 ) , sz2 = blob . read _shift ( 4 ) ;
p . usz = ( sz2 * Math . pow ( 2 , 32 ) + sz1 ) ;
sz1 = blob . read _shift ( 4 ) ; sz2 = blob . read _shift ( 4 ) ;
p . csz = ( sz2 * Math . pow ( 2 , 32 ) + sz1 ) ;
// NOTE: volume fields are skipped
} break ;
2021-09-12 11:11:48 +00:00
}
blob . l = tgt ;
o [ type ] = p ;
}
return o ;
}
var fs /*:: = require('fs'); */ ;
2022-05-22 23:51:41 +00:00
function get _fs ( ) { return fs || ( fs = _fs ) ; }
2021-09-12 11:11:48 +00:00
function parse ( file /*:RawBytes*/ , options /*:CFBReadOpts*/ ) /*:CFBContainer*/ {
if ( file [ 0 ] == 0x50 && file [ 1 ] == 0x4b ) return parse _zip ( file , options ) ;
2022-02-14 01:28:13 +00:00
if ( ( file [ 0 ] | 0x20 ) == 0x6d && ( file [ 1 ] | 0x20 ) == 0x69 ) return parse _mad ( file , options ) ;
2021-09-12 11:11:48 +00:00
if ( file . length < 512 ) throw new Error ( "CFB file size " + file . length + " < 512" ) ;
var mver = 3 ;
var ssz = 512 ;
var nmfs = 0 ; // number of mini FAT sectors
var difat _sec _cnt = 0 ;
var dir _start = 0 ;
var minifat _start = 0 ;
var difat _start = 0 ;
var fat _addrs /*:Array<number>*/ = [ ] ; // locations of FAT sectors
/* [MS-CFB] 2.2 Compound File Header */
var blob /*:CFBlob*/ = /*::(*/ file . slice ( 0 , 512 ) /*:: :any)*/ ;
prep _blob ( blob , 0 ) ;
/* major version */
var mv = check _get _mver ( blob ) ;
mver = mv [ 0 ] ;
switch ( mver ) {
case 3 : ssz = 512 ; break ; case 4 : ssz = 4096 ; break ;
case 0 : if ( mv [ 1 ] == 0 ) return parse _zip ( file , options ) ;
/* falls through */
default : throw new Error ( "Major Version: Expected 3 or 4 saw " + mver ) ;
}
/* reprocess header */
if ( ssz !== 512 ) { blob = /*::(*/ file . slice ( 0 , ssz ) /*:: :any)*/ ; prep _blob ( blob , 28 /* blob.l */ ) ; }
/* Save header for final object */
var header /*:RawBytes*/ = file . slice ( 0 , ssz ) ;
check _shifts ( blob , mver ) ;
// Number of Directory Sectors
var dir _cnt /*:number*/ = blob . read _shift ( 4 , 'i' ) ;
if ( mver === 3 && dir _cnt !== 0 ) throw new Error ( '# Directory Sectors: Expected 0 saw ' + dir _cnt ) ;
// Number of FAT Sectors
blob . l += 4 ;
// First Directory Sector Location
dir _start = blob . read _shift ( 4 , 'i' ) ;
// Transaction Signature
blob . l += 4 ;
// Mini Stream Cutoff Size
blob . chk ( '00100000' , 'Mini Stream Cutoff Size: ' ) ;
// First Mini FAT Sector Location
minifat _start = blob . read _shift ( 4 , 'i' ) ;
// Number of Mini FAT Sectors
nmfs = blob . read _shift ( 4 , 'i' ) ;
// First DIFAT sector location
difat _start = blob . read _shift ( 4 , 'i' ) ;
// Number of DIFAT Sectors
difat _sec _cnt = blob . read _shift ( 4 , 'i' ) ;
// Grab FAT Sector Locations
for ( var q = - 1 , j = 0 ; j < 109 ; ++ j ) { /* 109 = (512 - blob.l)>>>2; */
q = blob . read _shift ( 4 , 'i' ) ;
if ( q < 0 ) break ;
fat _addrs [ j ] = q ;
}
/** Break the file up into sectors */
var sectors /*:Array<RawBytes>*/ = sectorify ( file , ssz ) ;
sleuth _fat ( difat _start , difat _sec _cnt , sectors , ssz , fat _addrs ) ;
/** Chains */
var sector _list /*:SectorList*/ = make _sector _list ( sectors , dir _start , fat _addrs , ssz ) ;
2022-10-24 01:05:59 +00:00
if ( dir _start < sector _list . length ) sector _list [ dir _start ] . name = "!Directory" ;
2021-09-12 11:11:48 +00:00
if ( nmfs > 0 && minifat _start !== ENDOFCHAIN ) sector _list [ minifat _start ] . name = "!MiniFAT" ;
sector _list [ fat _addrs [ 0 ] ] . name = "!FAT" ;
sector _list . fat _addrs = fat _addrs ;
sector _list . ssz = ssz ;
/* [MS-CFB] 2.6.1 Compound File Directory Entry */
var files /*:CFBFiles*/ = { } , Paths /*:Array<string>*/ = [ ] , FileIndex /*:CFBFileIndex*/ = [ ] , FullPaths /*:Array<string>*/ = [ ] ;
read _directory ( dir _start , sector _list , sectors , Paths , nmfs , files , FileIndex , minifat _start ) ;
build _full _paths ( FileIndex , FullPaths , Paths ) ;
Paths . shift ( ) ;
var o = {
FileIndex : FileIndex ,
FullPaths : FullPaths
} ;
// $FlowIgnore
if ( options && options . raw ) o . raw = { header : header , sectors : sectors } ;
return o ;
} // parse
/* [MS-CFB] 2.2 Compound File Header -- read up to major version */
function check _get _mver ( blob /*:CFBlob*/ ) /*:[number, number]*/ {
if ( blob [ blob . l ] == 0x50 && blob [ blob . l + 1 ] == 0x4b ) return [ 0 , 0 ] ;
// header signature 8
blob . chk ( HEADER _SIGNATURE , 'Header Signature: ' ) ;
// clsid 16
//blob.chk(HEADER_CLSID, 'CLSID: ');
blob . l += 16 ;
// minor version 2
var mver /*:number*/ = blob . read _shift ( 2 , 'u' ) ;
return [ blob . read _shift ( 2 , 'u' ) , mver ] ;
}
function check _shifts ( blob /*:CFBlob*/ , mver /*:number*/ ) /*:void*/ {
var shift = 0x09 ;
// Byte Order
//blob.chk('feff', 'Byte Order: '); // note: some writers put 0xffff
blob . l += 2 ;
// Sector Shift
switch ( ( shift = blob . read _shift ( 2 ) ) ) {
case 0x09 : if ( mver != 3 ) throw new Error ( 'Sector Shift: Expected 9 saw ' + shift ) ; break ;
case 0x0c : if ( mver != 4 ) throw new Error ( 'Sector Shift: Expected 12 saw ' + shift ) ; break ;
default : throw new Error ( 'Sector Shift: Expected 9 or 12 saw ' + shift ) ;
}
// Mini Sector Shift
blob . chk ( '0600' , 'Mini Sector Shift: ' ) ;
// Reserved
blob . chk ( '000000000000' , 'Reserved: ' ) ;
}
/** Break the file up into sectors */
function sectorify ( file /*:RawBytes*/ , ssz /*:number*/ ) /*:Array<RawBytes>*/ {
var nsectors = Math . ceil ( file . length / ssz ) - 1 ;
var sectors /*:Array<RawBytes>*/ = [ ] ;
for ( var i = 1 ; i < nsectors ; ++ i ) sectors [ i - 1 ] = file . slice ( i * ssz , ( i + 1 ) * ssz ) ;
sectors [ nsectors - 1 ] = file . slice ( nsectors * ssz ) ;
return sectors ;
}
/* [MS-CFB] 2.6.4 Red-Black Tree */
function build _full _paths ( FI /*:CFBFileIndex*/ , FP /*:Array<string>*/ , Paths /*:Array<string>*/ ) /*:void*/ {
var i = 0 , L = 0 , R = 0 , C = 0 , j = 0 , pl = Paths . length ;
var dad /*:Array<number>*/ = [ ] , q /*:Array<number>*/ = [ ] ;
for ( ; i < pl ; ++ i ) { dad [ i ] = q [ i ] = i ; FP [ i ] = Paths [ i ] ; }
for ( ; j < q . length ; ++ j ) {
i = q [ j ] ;
L = FI [ i ] . L ; R = FI [ i ] . R ; C = FI [ i ] . C ;
if ( dad [ i ] === i ) {
if ( L !== - 1 /*NOSTREAM*/ && dad [ L ] !== L ) dad [ i ] = dad [ L ] ;
if ( R !== - 1 && dad [ R ] !== R ) dad [ i ] = dad [ R ] ;
}
if ( C !== - 1 /*NOSTREAM*/ ) dad [ C ] = i ;
if ( L !== - 1 && i != dad [ i ] ) { dad [ L ] = dad [ i ] ; if ( q . lastIndexOf ( L ) < j ) q . push ( L ) ; }
if ( R !== - 1 && i != dad [ i ] ) { dad [ R ] = dad [ i ] ; if ( q . lastIndexOf ( R ) < j ) q . push ( R ) ; }
}
for ( i = 1 ; i < pl ; ++ i ) if ( dad [ i ] === i ) {
if ( R !== - 1 /*NOSTREAM*/ && dad [ R ] !== R ) dad [ i ] = dad [ R ] ;
else if ( L !== - 1 && dad [ L ] !== L ) dad [ i ] = dad [ L ] ;
}
for ( i = 1 ; i < pl ; ++ i ) {
if ( FI [ i ] . type === 0 /* unknown */ ) continue ;
j = i ;
if ( j != dad [ j ] ) do {
j = dad [ j ] ;
FP [ i ] = FP [ j ] + "/" + FP [ i ] ;
} while ( j !== 0 && - 1 !== dad [ j ] && j != dad [ j ] ) ;
dad [ i ] = - 1 ;
}
FP [ 0 ] += "/" ;
for ( i = 1 ; i < pl ; ++ i ) {
if ( FI [ i ] . type !== 2 /* stream */ ) FP [ i ] += "/" ;
}
}
function get _mfat _entry ( entry /*:CFBEntry*/ , payload /*:RawBytes*/ , mini /*:?RawBytes*/ ) /*:CFBlob*/ {
var start = entry . start , size = entry . size ;
//return (payload.slice(start*MSSZ, start*MSSZ + size)/*:any*/);
var o = [ ] ;
var idx = start ;
while ( mini && size > 0 && idx >= 0 ) {
o . push ( payload . slice ( idx * MSSZ , idx * MSSZ + MSSZ ) ) ;
size -= MSSZ ;
idx = _ _readInt32LE ( mini , idx * 4 ) ;
}
if ( o . length === 0 ) return ( new _buf ( 0 ) /*:any*/ ) ;
return ( bconcat ( o ) . slice ( 0 , entry . size ) /*:any*/ ) ;
}
/ * * C h a s e d o w n t h e r e s t o f t h e D I F A T c h a i n t o b u i l d a c o m p r e h e n s i v e l i s t
DIFAT chains by storing the next sector number as the last 32 bits * /
function sleuth _fat ( idx /*:number*/ , cnt /*:number*/ , sectors /*:Array<RawBytes>*/ , ssz /*:number*/ , fat _addrs ) /*:void*/ {
var q /*:number*/ = ENDOFCHAIN ;
if ( idx === ENDOFCHAIN ) {
if ( cnt !== 0 ) throw new Error ( "DIFAT chain shorter than expected" ) ;
} else if ( idx !== - 1 /*FREESECT*/ ) {
var sector = sectors [ idx ] , m = ( ssz >>> 2 ) - 1 ;
if ( ! sector ) return ;
for ( var i = 0 ; i < m ; ++ i ) {
if ( ( q = _ _readInt32LE ( sector , i * 4 ) ) === ENDOFCHAIN ) break ;
fat _addrs . push ( q ) ;
}
2022-05-22 23:51:41 +00:00
if ( cnt >= 1 ) sleuth _fat ( _ _readInt32LE ( sector , ssz - 4 ) , cnt - 1 , sectors , ssz , fat _addrs ) ;
2021-09-12 11:11:48 +00:00
}
}
/** Follow the linked list of sectors for a given starting point */
function get _sector _list ( sectors /*:Array<RawBytes>*/ , start /*:number*/ , fat _addrs /*:Array<number>*/ , ssz /*:number*/ , chkd /*:?Array<boolean>*/ ) /*:SectorEntry*/ {
var buf /*:Array<number>*/ = [ ] , buf _chain /*:Array<any>*/ = [ ] ;
if ( ! chkd ) chkd = [ ] ;
var modulus = ssz - 1 , j = 0 , jj = 0 ;
for ( j = start ; j >= 0 ; ) {
chkd [ j ] = true ;
buf [ buf . length ] = j ;
buf _chain . push ( sectors [ j ] ) ;
var addr = fat _addrs [ Math . floor ( j * 4 / ssz ) ] ;
jj = ( ( j * 4 ) & modulus ) ;
if ( ssz < 4 + jj ) throw new Error ( "FAT boundary crossed: " + j + " 4 " + ssz ) ;
if ( ! sectors [ addr ] ) break ;
j = _ _readInt32LE ( sectors [ addr ] , jj ) ;
}
return { nodes : buf , data : _ _toBuffer ( [ buf _chain ] ) } ;
}
/** Chase down the sector linked lists */
function make _sector _list ( sectors /*:Array<RawBytes>*/ , dir _start /*:number*/ , fat _addrs /*:Array<number>*/ , ssz /*:number*/ ) /*:SectorList*/ {
var sl = sectors . length , sector _list /*:SectorList*/ = ( [ ] /*:any*/ ) ;
var chkd /*:Array<boolean>*/ = [ ] , buf /*:Array<number>*/ = [ ] , buf _chain /*:Array<RawBytes>*/ = [ ] ;
var modulus = ssz - 1 , i = 0 , j = 0 , k = 0 , jj = 0 ;
for ( i = 0 ; i < sl ; ++ i ) {
buf = ( [ ] /*:Array<number>*/ ) ;
k = ( i + dir _start ) ; if ( k >= sl ) k -= sl ;
if ( chkd [ k ] ) continue ;
buf _chain = [ ] ;
var seen = [ ] ;
for ( j = k ; j >= 0 ; ) {
seen [ j ] = true ;
chkd [ j ] = true ;
buf [ buf . length ] = j ;
buf _chain . push ( sectors [ j ] ) ;
var addr /*:number*/ = fat _addrs [ Math . floor ( j * 4 / ssz ) ] ;
jj = ( ( j * 4 ) & modulus ) ;
if ( ssz < 4 + jj ) throw new Error ( "FAT boundary crossed: " + j + " 4 " + ssz ) ;
if ( ! sectors [ addr ] ) break ;
j = _ _readInt32LE ( sectors [ addr ] , jj ) ;
if ( seen [ j ] ) break ;
}
sector _list [ k ] = ( { nodes : buf , data : _ _toBuffer ( [ buf _chain ] ) } /*:SectorEntry*/ ) ;
}
return sector _list ;
}
/* [MS-CFB] 2.6.1 Compound File Directory Entry */
function read _directory ( dir _start /*:number*/ , sector _list /*:SectorList*/ , sectors /*:Array<RawBytes>*/ , Paths /*:Array<string>*/ , nmfs , files , FileIndex , mini ) {
var minifat _store = 0 , pl = ( Paths . length ? 2 : 0 ) ;
var sector = sector _list [ dir _start ] . data ;
var i = 0 , namelen = 0 , name ;
for ( ; i < sector . length ; i += 128 ) {
var blob /*:CFBlob*/ = /*::(*/ sector . slice ( i , i + 128 ) /*:: :any)*/ ;
prep _blob ( blob , 64 ) ;
namelen = blob . read _shift ( 2 ) ;
name = _ _utf16le ( blob , 0 , namelen - pl ) ;
Paths . push ( name ) ;
var o /*:CFBEntry*/ = ( {
name : name ,
type : blob . read _shift ( 1 ) ,
color : blob . read _shift ( 1 ) ,
L : blob . read _shift ( 4 , 'i' ) ,
R : blob . read _shift ( 4 , 'i' ) ,
C : blob . read _shift ( 4 , 'i' ) ,
clsid : blob . read _shift ( 16 ) ,
state : blob . read _shift ( 4 , 'i' ) ,
start : 0 ,
size : 0
} ) ;
var ctime /*:number*/ = blob . read _shift ( 2 ) + blob . read _shift ( 2 ) + blob . read _shift ( 2 ) + blob . read _shift ( 2 ) ;
if ( ctime !== 0 ) o . ct = read _date ( blob , blob . l - 8 ) ;
var mtime /*:number*/ = blob . read _shift ( 2 ) + blob . read _shift ( 2 ) + blob . read _shift ( 2 ) + blob . read _shift ( 2 ) ;
if ( mtime !== 0 ) o . mt = read _date ( blob , blob . l - 8 ) ;
o . start = blob . read _shift ( 4 , 'i' ) ;
o . size = blob . read _shift ( 4 , 'i' ) ;
if ( o . size < 0 && o . start < 0 ) { o . size = o . type = 0 ; o . start = ENDOFCHAIN ; o . name = "" ; }
if ( o . type === 5 ) { /* root */
minifat _store = o . start ;
if ( nmfs > 0 && minifat _store !== ENDOFCHAIN ) sector _list [ minifat _store ] . name = "!StreamData" ;
/*minifat_size = o.size;*/
} else if ( o . size >= 4096 /* MSCSZ */ ) {
o . storage = 'fat' ;
if ( sector _list [ o . start ] === undefined ) sector _list [ o . start ] = get _sector _list ( sectors , o . start , sector _list . fat _addrs , sector _list . ssz ) ;
sector _list [ o . start ] . name = o . name ;
o . content = ( sector _list [ o . start ] . data . slice ( 0 , o . size ) /*:any*/ ) ;
} else {
o . storage = 'minifat' ;
if ( o . size < 0 ) o . size = 0 ;
else if ( minifat _store !== ENDOFCHAIN && o . start !== ENDOFCHAIN && sector _list [ minifat _store ] ) {
o . content = get _mfat _entry ( o , sector _list [ minifat _store ] . data , ( sector _list [ mini ] || { } ) . data ) ;
}
}
if ( o . content ) prep _blob ( o . content , 0 ) ;
files [ name ] = o ;
FileIndex . push ( o ) ;
}
}
function read _date ( blob /*:RawBytes|CFBlob*/ , offset /*:number*/ ) /*:Date*/ {
return new Date ( ( ( ( _ _readUInt32LE ( blob , offset + 4 ) / 1e7 ) * Math . pow ( 2 , 32 ) + _ _readUInt32LE ( blob , offset ) / 1e7 ) - 11644473600 ) * 1000 ) ;
}
function read _file ( filename /*:string*/ , options /*:CFBReadOpts*/ ) {
get _fs ( ) ;
return parse ( fs . readFileSync ( filename ) , options ) ;
}
function read ( blob /*:RawBytes|string*/ , options /*:CFBReadOpts*/ ) {
2022-02-14 01:28:13 +00:00
var type = options && options . type ;
if ( ! type ) {
if ( has _buf && Buffer . isBuffer ( blob ) ) type = "buffer" ;
}
switch ( type || "base64" ) {
2021-09-12 11:11:48 +00:00
case "file" : /*:: if(typeof blob !== 'string') throw "Must pass a filename when type='file'"; */ return read _file ( blob , options ) ;
2022-03-22 20:08:08 +00:00
case "base64" : /*:: if(typeof blob !== 'string') throw "Must pass a base64-encoded binary string when type='file'"; */ return parse ( s2a ( Base64 _decode ( blob ) ) , options ) ;
2021-09-12 11:11:48 +00:00
case "binary" : /*:: if(typeof blob !== 'string') throw "Must pass a binary string when type='file'"; */ return parse ( s2a ( blob ) , options ) ;
}
return parse ( /*::typeof blob == 'string' ? new Buffer(blob, 'utf-8') : */ blob , options ) ;
}
function init _cfb ( cfb /*:CFBContainer*/ , opts /*:?any*/ ) /*:void*/ {
var o = opts || { } , root = o . root || "Root Entry" ;
if ( ! cfb . FullPaths ) cfb . FullPaths = [ ] ;
if ( ! cfb . FileIndex ) cfb . FileIndex = [ ] ;
if ( cfb . FullPaths . length !== cfb . FileIndex . length ) throw new Error ( "inconsistent CFB structure" ) ;
if ( cfb . FullPaths . length === 0 ) {
cfb . FullPaths [ 0 ] = root + "/" ;
cfb . FileIndex [ 0 ] = ( { name : root , type : 5 } /*:any*/ ) ;
}
if ( o . CLSID ) cfb . FileIndex [ 0 ] . clsid = o . CLSID ;
seed _cfb ( cfb ) ;
}
function seed _cfb ( cfb /*:CFBContainer*/ ) /*:void*/ {
var nm = "\u0001Sh33tJ5" ;
if ( CFB . find ( cfb , "/" + nm ) ) return ;
var p = new _buf ( 4 ) ; p [ 0 ] = 55 ; p [ 1 ] = p [ 3 ] = 50 ; p [ 2 ] = 54 ;
cfb . FileIndex . push ( ( { name : nm , type : 2 , content : p , size : 4 , L : 69 , R : 69 , C : 69 } /*:any*/ ) ) ;
cfb . FullPaths . push ( cfb . FullPaths [ 0 ] + nm ) ;
rebuild _cfb ( cfb ) ;
}
function rebuild _cfb ( cfb /*:CFBContainer*/ , f /*:?boolean*/ ) /*:void*/ {
init _cfb ( cfb ) ;
var gc = false , s = false ;
for ( var i = cfb . FullPaths . length - 1 ; i >= 0 ; -- i ) {
var _file = cfb . FileIndex [ i ] ;
switch ( _file . type ) {
case 0 :
if ( s ) gc = true ;
else { cfb . FileIndex . pop ( ) ; cfb . FullPaths . pop ( ) ; }
break ;
case 1 : case 2 : case 5 :
s = true ;
if ( isNaN ( _file . R * _file . L * _file . C ) ) gc = true ;
if ( _file . R > - 1 && _file . L > - 1 && _file . R == _file . L ) gc = true ;
break ;
default : gc = true ; break ;
}
}
if ( ! gc && ! f ) return ;
var now = new Date ( 1987 , 1 , 19 ) , j = 0 ;
2022-02-14 01:28:13 +00:00
// Track which names exist
var fullPaths = Object . create ? Object . create ( null ) : { } ;
2021-09-12 11:11:48 +00:00
var data /*:Array<[string, CFBEntry]>*/ = [ ] ;
for ( i = 0 ; i < cfb . FullPaths . length ; ++ i ) {
2022-02-14 01:28:13 +00:00
fullPaths [ cfb . FullPaths [ i ] ] = true ;
2021-09-12 11:11:48 +00:00
if ( cfb . FileIndex [ i ] . type === 0 ) continue ;
data . push ( [ cfb . FullPaths [ i ] , cfb . FileIndex [ i ] ] ) ;
}
for ( i = 0 ; i < data . length ; ++ i ) {
var dad = dirname ( data [ i ] [ 0 ] ) ;
2022-02-14 01:28:13 +00:00
s = fullPaths [ dad ] ;
2022-05-22 23:51:41 +00:00
while ( ! s ) {
while ( dirname ( dad ) && ! fullPaths [ dirname ( dad ) ] ) dad = dirname ( dad ) ;
2022-02-14 01:28:13 +00:00
data . push ( [ dad , ( {
name : filename ( dad ) . replace ( "/" , "" ) ,
type : 1 ,
clsid : HEADER _CLSID ,
ct : now , mt : now ,
content : null
} /*:any*/ ) ] ) ;
2022-05-22 23:51:41 +00:00
2022-02-14 01:28:13 +00:00
// Add name to set
fullPaths [ dad ] = true ;
2022-05-22 23:51:41 +00:00
dad = dirname ( data [ i ] [ 0 ] ) ;
s = fullPaths [ dad ] ;
2022-02-14 01:28:13 +00:00
}
2021-09-12 11:11:48 +00:00
}
data . sort ( function ( x , y ) { return namecmp ( x [ 0 ] , y [ 0 ] ) ; } ) ;
cfb . FullPaths = [ ] ; cfb . FileIndex = [ ] ;
for ( i = 0 ; i < data . length ; ++ i ) { cfb . FullPaths [ i ] = data [ i ] [ 0 ] ; cfb . FileIndex [ i ] = data [ i ] [ 1 ] ; }
for ( i = 0 ; i < data . length ; ++ i ) {
var elt = cfb . FileIndex [ i ] ;
var nm = cfb . FullPaths [ i ] ;
elt . name = filename ( nm ) . replace ( "/" , "" ) ;
elt . L = elt . R = elt . C = - ( elt . color = 1 ) ;
elt . size = elt . content ? elt . content . length : 0 ;
elt . start = 0 ;
elt . clsid = ( elt . clsid || HEADER _CLSID ) ;
if ( i === 0 ) {
elt . C = data . length > 1 ? 1 : - 1 ;
elt . size = 0 ;
elt . type = 5 ;
} else if ( nm . slice ( - 1 ) == "/" ) {
for ( j = i + 1 ; j < data . length ; ++ j ) if ( dirname ( cfb . FullPaths [ j ] ) == nm ) break ;
elt . C = j >= data . length ? - 1 : j ;
for ( j = i + 1 ; j < data . length ; ++ j ) if ( dirname ( cfb . FullPaths [ j ] ) == dirname ( nm ) ) break ;
elt . R = j >= data . length ? - 1 : j ;
elt . type = 1 ;
} else {
if ( dirname ( cfb . FullPaths [ i + 1 ] || "" ) == dirname ( nm ) ) elt . R = i + 1 ;
elt . type = 2 ;
}
}
}
2022-02-14 01:28:13 +00:00
function _write ( cfb /*:CFBContainer*/ , options /*:CFBWriteOpts*/ ) /*:RawBytes|string*/ {
2021-09-12 11:11:48 +00:00
var _opts = options || { } ;
2022-02-14 01:28:13 +00:00
/* MAD is order-sensitive, skip rebuild and sort */
if ( _opts . fileType == 'mad' ) return write _mad ( cfb , _opts ) ;
2021-09-12 11:11:48 +00:00
rebuild _cfb ( cfb ) ;
2022-02-14 01:28:13 +00:00
switch ( _opts . fileType ) {
case 'zip' : return write _zip ( cfb , _opts ) ;
//case 'mad': return write_mad(cfb, _opts);
}
2021-09-12 11:11:48 +00:00
var L = ( function ( cfb /*:CFBContainer*/ ) /*:Array<number>*/ {
var mini _size = 0 , fat _size = 0 ;
for ( var i = 0 ; i < cfb . FileIndex . length ; ++ i ) {
var file = cfb . FileIndex [ i ] ;
if ( ! file . content ) continue ;
var flen = file . content . length ;
if ( flen > 0 ) {
if ( flen < 0x1000 ) mini _size += ( flen + 0x3F ) >> 6 ;
else fat _size += ( flen + 0x01FF ) >> 9 ;
}
}
var dir _cnt = ( cfb . FullPaths . length + 3 ) >> 2 ;
var mini _cnt = ( mini _size + 7 ) >> 3 ;
var mfat _cnt = ( mini _size + 0x7F ) >> 7 ;
var fat _base = mini _cnt + fat _size + dir _cnt + mfat _cnt ;
var fat _cnt = ( fat _base + 0x7F ) >> 7 ;
var difat _cnt = fat _cnt <= 109 ? 0 : Math . ceil ( ( fat _cnt - 109 ) / 0x7F ) ;
while ( ( ( fat _base + fat _cnt + difat _cnt + 0x7F ) >> 7 ) > fat _cnt ) difat _cnt = ++ fat _cnt <= 109 ? 0 : Math . ceil ( ( fat _cnt - 109 ) / 0x7F ) ;
var L = [ 1 , difat _cnt , fat _cnt , mfat _cnt , dir _cnt , fat _size , mini _size , 0 ] ;
cfb . FileIndex [ 0 ] . size = mini _size << 6 ;
L [ 7 ] = ( cfb . FileIndex [ 0 ] . start = L [ 0 ] + L [ 1 ] + L [ 2 ] + L [ 3 ] + L [ 4 ] + L [ 5 ] ) + ( ( L [ 6 ] + 7 ) >> 3 ) ;
return L ;
} ) ( cfb ) ;
var o = new _buf ( L [ 7 ] << 9 ) ;
var i = 0 , T = 0 ;
{
for ( i = 0 ; i < 8 ; ++ i ) o . write _shift ( 1 , HEADER _SIG [ i ] ) ;
for ( i = 0 ; i < 8 ; ++ i ) o . write _shift ( 2 , 0 ) ;
o . write _shift ( 2 , 0x003E ) ;
o . write _shift ( 2 , 0x0003 ) ;
o . write _shift ( 2 , 0xFFFE ) ;
o . write _shift ( 2 , 0x0009 ) ;
o . write _shift ( 2 , 0x0006 ) ;
for ( i = 0 ; i < 3 ; ++ i ) o . write _shift ( 2 , 0 ) ;
o . write _shift ( 4 , 0 ) ;
o . write _shift ( 4 , L [ 2 ] ) ;
o . write _shift ( 4 , L [ 0 ] + L [ 1 ] + L [ 2 ] + L [ 3 ] - 1 ) ;
o . write _shift ( 4 , 0 ) ;
o . write _shift ( 4 , 1 << 12 ) ;
o . write _shift ( 4 , L [ 3 ] ? L [ 0 ] + L [ 1 ] + L [ 2 ] - 1 : ENDOFCHAIN ) ;
o . write _shift ( 4 , L [ 3 ] ) ;
o . write _shift ( - 4 , L [ 1 ] ? L [ 0 ] - 1 : ENDOFCHAIN ) ;
o . write _shift ( 4 , L [ 1 ] ) ;
for ( i = 0 ; i < 109 ; ++ i ) o . write _shift ( - 4 , i < L [ 2 ] ? L [ 1 ] + i : - 1 ) ;
}
if ( L [ 1 ] ) {
for ( T = 0 ; T < L [ 1 ] ; ++ T ) {
for ( ; i < 236 + T * 127 ; ++ i ) o . write _shift ( - 4 , i < L [ 2 ] ? L [ 1 ] + i : - 1 ) ;
o . write _shift ( - 4 , T === L [ 1 ] - 1 ? ENDOFCHAIN : T + 1 ) ;
}
}
var chainit = function ( w /*:number*/ ) /*:void*/ {
for ( T += w ; i < T - 1 ; ++ i ) o . write _shift ( - 4 , i + 1 ) ;
if ( w ) { ++ i ; o . write _shift ( - 4 , ENDOFCHAIN ) ; }
} ;
T = i = 0 ;
for ( T += L [ 1 ] ; i < T ; ++ i ) o . write _shift ( - 4 , consts . DIFSECT ) ;
for ( T += L [ 2 ] ; i < T ; ++ i ) o . write _shift ( - 4 , consts . FATSECT ) ;
chainit ( L [ 3 ] ) ;
chainit ( L [ 4 ] ) ;
var j /*:number*/ = 0 , flen /*:number*/ = 0 ;
var file /*:CFBEntry*/ = cfb . FileIndex [ 0 ] ;
for ( ; j < cfb . FileIndex . length ; ++ j ) {
file = cfb . FileIndex [ j ] ;
if ( ! file . content ) continue ;
/*:: if(file.content == null) throw new Error("unreachable"); */
flen = file . content . length ;
if ( flen < 0x1000 ) continue ;
file . start = T ;
chainit ( ( flen + 0x01FF ) >> 9 ) ;
}
chainit ( ( L [ 6 ] + 7 ) >> 3 ) ;
while ( o . l & 0x1FF ) o . write _shift ( - 4 , consts . ENDOFCHAIN ) ;
T = i = 0 ;
for ( j = 0 ; j < cfb . FileIndex . length ; ++ j ) {
file = cfb . FileIndex [ j ] ;
if ( ! file . content ) continue ;
/*:: if(file.content == null) throw new Error("unreachable"); */
flen = file . content . length ;
if ( ! flen || flen >= 0x1000 ) continue ;
file . start = T ;
chainit ( ( flen + 0x3F ) >> 6 ) ;
}
while ( o . l & 0x1FF ) o . write _shift ( - 4 , consts . ENDOFCHAIN ) ;
for ( i = 0 ; i < L [ 4 ] << 2 ; ++ i ) {
var nm = cfb . FullPaths [ i ] ;
if ( ! nm || nm . length === 0 ) {
for ( j = 0 ; j < 17 ; ++ j ) o . write _shift ( 4 , 0 ) ;
for ( j = 0 ; j < 3 ; ++ j ) o . write _shift ( 4 , - 1 ) ;
for ( j = 0 ; j < 12 ; ++ j ) o . write _shift ( 4 , 0 ) ;
continue ;
}
file = cfb . FileIndex [ i ] ;
if ( i === 0 ) file . start = file . size ? file . start - 1 : ENDOFCHAIN ;
var _nm /*:string*/ = ( i === 0 && _opts . root ) || file . name ;
2022-05-22 23:51:41 +00:00
if ( _nm . length > 32 ) {
console . error ( "Name " + _nm + " will be truncated to " + _nm . slice ( 0 , 32 ) ) ;
_nm = _nm . slice ( 0 , 32 ) ;
}
2021-09-12 11:11:48 +00:00
flen = 2 * ( _nm . length + 1 ) ;
o . write _shift ( 64 , _nm , "utf16le" ) ;
o . write _shift ( 2 , flen ) ;
o . write _shift ( 1 , file . type ) ;
o . write _shift ( 1 , file . color ) ;
o . write _shift ( - 4 , file . L ) ;
o . write _shift ( - 4 , file . R ) ;
o . write _shift ( - 4 , file . C ) ;
if ( ! file . clsid ) for ( j = 0 ; j < 4 ; ++ j ) o . write _shift ( 4 , 0 ) ;
else o . write _shift ( 16 , file . clsid , "hex" ) ;
o . write _shift ( 4 , file . state || 0 ) ;
o . write _shift ( 4 , 0 ) ; o . write _shift ( 4 , 0 ) ;
o . write _shift ( 4 , 0 ) ; o . write _shift ( 4 , 0 ) ;
o . write _shift ( 4 , file . start ) ;
o . write _shift ( 4 , file . size ) ; o . write _shift ( 4 , 0 ) ;
}
for ( i = 1 ; i < cfb . FileIndex . length ; ++ i ) {
file = cfb . FileIndex [ i ] ;
/*:: if(!file.content) throw new Error("unreachable"); */
if ( file . size >= 0x1000 ) {
o . l = ( file . start + 1 ) << 9 ;
2022-02-14 01:28:13 +00:00
if ( has _buf && Buffer . isBuffer ( file . content ) ) {
file . content . copy ( o , o . l , 0 , file . size ) ;
// o is a 0-filled Buffer so just set next offset
o . l += ( file . size + 511 ) & - 512 ;
} else {
for ( j = 0 ; j < file . size ; ++ j ) o . write _shift ( 1 , file . content [ j ] ) ;
for ( ; j & 0x1FF ; ++ j ) o . write _shift ( 1 , 0 ) ;
}
2021-09-12 11:11:48 +00:00
}
}
for ( i = 1 ; i < cfb . FileIndex . length ; ++ i ) {
file = cfb . FileIndex [ i ] ;
/*:: if(!file.content) throw new Error("unreachable"); */
if ( file . size > 0 && file . size < 0x1000 ) {
2022-02-14 01:28:13 +00:00
if ( has _buf && Buffer . isBuffer ( file . content ) ) {
file . content . copy ( o , o . l , 0 , file . size ) ;
// o is a 0-filled Buffer so just set next offset
o . l += ( file . size + 63 ) & - 64 ;
} else {
for ( j = 0 ; j < file . size ; ++ j ) o . write _shift ( 1 , file . content [ j ] ) ;
for ( ; j & 0x3F ; ++ j ) o . write _shift ( 1 , 0 ) ;
}
2021-09-12 11:11:48 +00:00
}
}
2022-02-14 01:28:13 +00:00
if ( has _buf ) {
o . l = o . length ;
} else {
// When using Buffer, already 0-filled
while ( o . l < o . length ) o . write _shift ( 1 , 0 ) ;
}
2021-09-12 11:11:48 +00:00
return o ;
}
/* [MS-CFB] 2.6.4 (Unicode 3.0.1 case conversion) */
function find ( cfb /*:CFBContainer*/ , path /*:string*/ ) /*:?CFBEntry*/ {
var UCFullPaths /*:Array<string>*/ = cfb . FullPaths . map ( function ( x ) { return x . toUpperCase ( ) ; } ) ;
var UCPaths /*:Array<string>*/ = UCFullPaths . map ( function ( x ) { var y = x . split ( "/" ) ; return y [ y . length - ( x . slice ( - 1 ) == "/" ? 2 : 1 ) ] ; } ) ;
var k /*:boolean*/ = false ;
if ( path . charCodeAt ( 0 ) === 47 /* "/" */ ) { k = true ; path = UCFullPaths [ 0 ] . slice ( 0 , - 1 ) + path ; }
else k = path . indexOf ( "/" ) !== - 1 ;
var UCPath /*:string*/ = path . toUpperCase ( ) ;
var w /*:number*/ = k === true ? UCFullPaths . indexOf ( UCPath ) : UCPaths . indexOf ( UCPath ) ;
if ( w !== - 1 ) return cfb . FileIndex [ w ] ;
var m = ! UCPath . match ( chr1 ) ;
UCPath = UCPath . replace ( chr0 , '' ) ;
if ( m ) UCPath = UCPath . replace ( chr1 , '!' ) ;
for ( w = 0 ; w < UCFullPaths . length ; ++ w ) {
if ( ( m ? UCFullPaths [ w ] . replace ( chr1 , '!' ) : UCFullPaths [ w ] ) . replace ( chr0 , '' ) == UCPath ) return cfb . FileIndex [ w ] ;
if ( ( m ? UCPaths [ w ] . replace ( chr1 , '!' ) : UCPaths [ w ] ) . replace ( chr0 , '' ) == UCPath ) return cfb . FileIndex [ w ] ;
}
return null ;
}
/** CFB Constants */
var MSSZ = 64 ; /* Mini Sector Size = 1<<6 */
//var MSCSZ = 4096; /* Mini Stream Cutoff Size */
/* 2.1 Compound File Sector Numbers and Types */
var ENDOFCHAIN = - 2 ;
/* 2.2 Compound File Header */
var HEADER _SIGNATURE = 'd0cf11e0a1b11ae1' ;
var HEADER _SIG = [ 0xD0 , 0xCF , 0x11 , 0xE0 , 0xA1 , 0xB1 , 0x1A , 0xE1 ] ;
var HEADER _CLSID = '00000000000000000000000000000000' ;
var consts = {
/* 2.1 Compund File Sector Numbers and Types */
MAXREGSECT : - 6 ,
DIFSECT : - 4 ,
FATSECT : - 3 ,
ENDOFCHAIN : ENDOFCHAIN ,
FREESECT : - 1 ,
/* 2.2 Compound File Header */
HEADER _SIGNATURE : HEADER _SIGNATURE ,
HEADER _MINOR _VERSION : '3e00' ,
MAXREGSID : - 6 ,
NOSTREAM : - 1 ,
HEADER _CLSID : HEADER _CLSID ,
/* 2.6.1 Compound File Directory Entry */
EntryTypes : [ 'unknown' , 'storage' , 'stream' , 'lockbytes' , 'property' , 'root' ]
} ;
function write _file ( cfb /*:CFBContainer*/ , filename /*:string*/ , options /*:CFBWriteOpts*/ ) /*:void*/ {
get _fs ( ) ;
var o = _write ( cfb , options ) ;
/*:: if(typeof Buffer == 'undefined' || !Buffer.isBuffer(o) || !(o instanceof Buffer)) throw new Error("unreachable"); */
fs . writeFileSync ( filename , o ) ;
}
function a2s ( o /*:RawBytes*/ ) /*:string*/ {
var out = new Array ( o . length ) ;
for ( var i = 0 ; i < o . length ; ++ i ) out [ i ] = String . fromCharCode ( o [ i ] ) ;
return out . join ( "" ) ;
}
function write ( cfb /*:CFBContainer*/ , options /*:CFBWriteOpts*/ ) /*:RawBytes|string*/ {
var o = _write ( cfb , options ) ;
2022-02-14 01:28:13 +00:00
switch ( options && options . type || "buffer" ) {
2021-09-12 11:11:48 +00:00
case "file" : get _fs ( ) ; fs . writeFileSync ( options . filename , ( o /*:any*/ ) ) ; return o ;
2022-02-14 01:28:13 +00:00
case "binary" : return typeof o == "string" ? o : a2s ( o ) ;
2022-03-22 20:08:08 +00:00
case "base64" : return Base64 _encode ( typeof o == "string" ? o : a2s ( o ) ) ;
2022-02-14 01:28:13 +00:00
case "buffer" : if ( has _buf ) return Buffer . isBuffer ( o ) ? o : Buffer _from ( o ) ;
/* falls through */
case "array" : return typeof o == "string" ? s2a ( o ) : o ;
2021-09-12 11:11:48 +00:00
}
return o ;
}
/* node < 8.1 zlib does not expose bytesRead, so default to pure JS */
var _zlib ;
function use _zlib ( zlib ) { try {
var InflateRaw = zlib . InflateRaw ;
var InflRaw = new InflateRaw ( ) ;
InflRaw . _processChunk ( new Uint8Array ( [ 3 , 0 ] ) , InflRaw . _finishFlushFlag ) ;
if ( InflRaw . bytesRead ) _zlib = zlib ;
else throw new Error ( "zlib does not expose bytesRead" ) ;
} catch ( e ) { console . error ( "cannot use native zlib: " + ( e . message || e ) ) ; } }
function _inflateRawSync ( payload , usz ) {
if ( ! _zlib ) return _inflate ( payload , usz ) ;
var InflateRaw = _zlib . InflateRaw ;
var InflRaw = new InflateRaw ( ) ;
var out = InflRaw . _processChunk ( payload . slice ( payload . l ) , InflRaw . _finishFlushFlag ) ;
payload . l += InflRaw . bytesRead ;
return out ;
}
function _deflateRawSync ( payload ) {
return _zlib ? _zlib . deflateRawSync ( payload ) : _deflate ( payload ) ;
}
var CLEN _ORDER = [ 16 , 17 , 18 , 0 , 8 , 7 , 9 , 6 , 10 , 5 , 11 , 4 , 12 , 3 , 13 , 2 , 14 , 1 , 15 ] ;
/* LEN_ID = [ 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285 ]; */
var LEN _LN = [ 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 13 , 15 , 17 , 19 , 23 , 27 , 31 , 35 , 43 , 51 , 59 , 67 , 83 , 99 , 115 , 131 , 163 , 195 , 227 , 258 ] ;
/* DST_ID = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 ]; */
var DST _LN = [ 1 , 2 , 3 , 4 , 5 , 7 , 9 , 13 , 17 , 25 , 33 , 49 , 65 , 97 , 129 , 193 , 257 , 385 , 513 , 769 , 1025 , 1537 , 2049 , 3073 , 4097 , 6145 , 8193 , 12289 , 16385 , 24577 ] ;
function bit _swap _8 ( n ) { var t = ( ( ( ( ( n << 1 ) | ( n << 11 ) ) & 0x22110 ) | ( ( ( n << 5 ) | ( n << 15 ) ) & 0x88440 ) ) ) ; return ( ( t >> 16 ) | ( t >> 8 ) | t ) & 0xFF ; }
var use _typed _arrays = typeof Uint8Array !== 'undefined' ;
var bitswap8 = use _typed _arrays ? new Uint8Array ( 1 << 8 ) : [ ] ;
for ( var q = 0 ; q < ( 1 << 8 ) ; ++ q ) bitswap8 [ q ] = bit _swap _8 ( q ) ;
function bit _swap _n ( n , b ) {
var rev = bitswap8 [ n & 0xFF ] ;
if ( b <= 8 ) return rev >>> ( 8 - b ) ;
rev = ( rev << 8 ) | bitswap8 [ ( n >> 8 ) & 0xFF ] ;
if ( b <= 16 ) return rev >>> ( 16 - b ) ;
rev = ( rev << 8 ) | bitswap8 [ ( n >> 16 ) & 0xFF ] ;
return rev >>> ( 24 - b ) ;
}
/* helpers for unaligned bit reads */
function read _bits _2 ( buf , bl ) { var w = ( bl & 7 ) , h = ( bl >>> 3 ) ; return ( ( buf [ h ] | ( w <= 6 ? 0 : buf [ h + 1 ] << 8 ) ) >>> w ) & 0x03 ; }
function read _bits _3 ( buf , bl ) { var w = ( bl & 7 ) , h = ( bl >>> 3 ) ; return ( ( buf [ h ] | ( w <= 5 ? 0 : buf [ h + 1 ] << 8 ) ) >>> w ) & 0x07 ; }
function read _bits _4 ( buf , bl ) { var w = ( bl & 7 ) , h = ( bl >>> 3 ) ; return ( ( buf [ h ] | ( w <= 4 ? 0 : buf [ h + 1 ] << 8 ) ) >>> w ) & 0x0F ; }
function read _bits _5 ( buf , bl ) { var w = ( bl & 7 ) , h = ( bl >>> 3 ) ; return ( ( buf [ h ] | ( w <= 3 ? 0 : buf [ h + 1 ] << 8 ) ) >>> w ) & 0x1F ; }
function read _bits _7 ( buf , bl ) { var w = ( bl & 7 ) , h = ( bl >>> 3 ) ; return ( ( buf [ h ] | ( w <= 1 ? 0 : buf [ h + 1 ] << 8 ) ) >>> w ) & 0x7F ; }
/* works up to n = 3 * 8 + 1 = 25 */
function read _bits _n ( buf , bl , n ) {
var w = ( bl & 7 ) , h = ( bl >>> 3 ) , f = ( ( 1 << n ) - 1 ) ;
var v = buf [ h ] >>> w ;
if ( n < 8 - w ) return v & f ;
v |= buf [ h + 1 ] << ( 8 - w ) ;
if ( n < 16 - w ) return v & f ;
v |= buf [ h + 2 ] << ( 16 - w ) ;
if ( n < 24 - w ) return v & f ;
v |= buf [ h + 3 ] << ( 24 - w ) ;
return v & f ;
}
2022-02-14 01:28:13 +00:00
/* helpers for unaligned bit writes */
function write _bits _3 ( buf , bl , v ) { var w = bl & 7 , h = bl >>> 3 ;
if ( w <= 5 ) buf [ h ] |= ( v & 7 ) << w ;
else {
buf [ h ] |= ( v << w ) & 0xFF ;
buf [ h + 1 ] = ( v & 7 ) >> ( 8 - w ) ;
}
return bl + 3 ;
}
function write _bits _1 ( buf , bl , v ) {
var w = bl & 7 , h = bl >>> 3 ;
v = ( v & 1 ) << w ;
buf [ h ] |= v ;
return bl + 1 ;
}
function write _bits _8 ( buf , bl , v ) {
var w = bl & 7 , h = bl >>> 3 ;
v <<= w ;
buf [ h ] |= v & 0xFF ; v >>>= 8 ;
buf [ h + 1 ] = v ;
return bl + 8 ;
}
function write _bits _16 ( buf , bl , v ) {
var w = bl & 7 , h = bl >>> 3 ;
v <<= w ;
buf [ h ] |= v & 0xFF ; v >>>= 8 ;
buf [ h + 1 ] = v & 0xFF ;
buf [ h + 2 ] = v >>> 8 ;
return bl + 16 ;
}
2021-09-12 11:11:48 +00:00
/* until ArrayBuffer#realloc is a thing, fake a realloc */
function realloc ( b , sz /*:number*/ ) {
var L = b . length , M = 2 * L > sz ? 2 * L : sz + 5 , i = 0 ;
if ( L >= sz ) return b ;
if ( has _buf ) {
var o = new _unsafe _buf ( M ) ;
// $FlowIgnore
if ( b . copy ) b . copy ( o ) ;
else for ( ; i < b . length ; ++ i ) o [ i ] = b [ i ] ;
return o ;
} else if ( use _typed _arrays ) {
var a = new Uint8Array ( M ) ;
if ( a . set ) a . set ( b ) ;
2022-02-14 01:28:13 +00:00
else for ( ; i < L ; ++ i ) a [ i ] = b [ i ] ;
2021-09-12 11:11:48 +00:00
return a ;
}
b . length = M ;
return b ;
}
/* zero-filled arrays for older browsers */
function zero _fill _array ( n ) {
var o = new Array ( n ) ;
for ( var i = 0 ; i < n ; ++ i ) o [ i ] = 0 ;
return o ;
2022-02-14 01:28:13 +00:00
}
2021-09-12 11:11:48 +00:00
/* build tree (used for literals and lengths) */
function build _tree ( clens , cmap , MAX /*:number*/ ) /*:number*/ {
var maxlen = 1 , w = 0 , i = 0 , j = 0 , ccode = 0 , L = clens . length ;
var bl _count = use _typed _arrays ? new Uint16Array ( 32 ) : zero _fill _array ( 32 ) ;
for ( i = 0 ; i < 32 ; ++ i ) bl _count [ i ] = 0 ;
for ( i = L ; i < MAX ; ++ i ) clens [ i ] = 0 ;
L = clens . length ;
var ctree = use _typed _arrays ? new Uint16Array ( L ) : zero _fill _array ( L ) ; // []
/* build code tree */
for ( i = 0 ; i < L ; ++ i ) {
bl _count [ ( w = clens [ i ] ) ] ++ ;
if ( maxlen < w ) maxlen = w ;
ctree [ i ] = 0 ;
}
bl _count [ 0 ] = 0 ;
for ( i = 1 ; i <= maxlen ; ++ i ) bl _count [ i + 16 ] = ( ccode = ( ccode + bl _count [ i - 1 ] ) << 1 ) ;
for ( i = 0 ; i < L ; ++ i ) {
ccode = clens [ i ] ;
if ( ccode != 0 ) ctree [ i ] = bl _count [ ccode + 16 ] ++ ;
}
/* cmap[maxlen + 4 bits] = (off&15) + (lit<<4) reverse mapping */
var cleni = 0 ;
for ( i = 0 ; i < L ; ++ i ) {
cleni = clens [ i ] ;
if ( cleni != 0 ) {
ccode = bit _swap _n ( ctree [ i ] , maxlen ) >> ( maxlen - cleni ) ;
for ( j = ( 1 << ( maxlen + 4 - cleni ) ) - 1 ; j >= 0 ; -- j )
cmap [ ccode | ( j << cleni ) ] = ( cleni & 15 ) | ( i << 4 ) ;
}
}
return maxlen ;
}
2022-02-14 01:28:13 +00:00
/* Fixed Huffman */
2021-09-12 11:11:48 +00:00
var fix _lmap = use _typed _arrays ? new Uint16Array ( 512 ) : zero _fill _array ( 512 ) ;
var fix _dmap = use _typed _arrays ? new Uint16Array ( 32 ) : zero _fill _array ( 32 ) ;
if ( ! use _typed _arrays ) {
for ( var i = 0 ; i < 512 ; ++ i ) fix _lmap [ i ] = 0 ;
for ( i = 0 ; i < 32 ; ++ i ) fix _dmap [ i ] = 0 ;
}
( function ( ) {
var dlens /*:Array<number>*/ = [ ] ;
var i = 0 ;
for ( ; i < 32 ; i ++ ) dlens . push ( 5 ) ;
build _tree ( dlens , fix _dmap , 32 ) ;
var clens /*:Array<number>*/ = [ ] ;
i = 0 ;
for ( ; i <= 143 ; i ++ ) clens . push ( 8 ) ;
for ( ; i <= 255 ; i ++ ) clens . push ( 9 ) ;
for ( ; i <= 279 ; i ++ ) clens . push ( 7 ) ;
for ( ; i <= 287 ; i ++ ) clens . push ( 8 ) ;
build _tree ( clens , fix _lmap , 288 ) ;
2022-03-12 14:05:57 +00:00
} ) ( ) ; var _deflateRaw = /*#__PURE__*/ ( function _deflateRawIIFE ( ) {
2022-02-14 01:28:13 +00:00
var DST _LN _RE = use _typed _arrays ? new Uint8Array ( 0x8000 ) : [ ] ;
var j = 0 , k = 0 ;
for ( ; j < DST _LN . length - 1 ; ++ j ) {
for ( ; k < DST _LN [ j + 1 ] ; ++ k ) DST _LN _RE [ k ] = j ;
}
for ( ; k < 32768 ; ++ k ) DST _LN _RE [ k ] = 29 ;
var LEN _LN _RE = use _typed _arrays ? new Uint8Array ( 0x103 ) : [ ] ;
for ( j = 0 , k = 0 ; j < LEN _LN . length - 1 ; ++ j ) {
for ( ; k < LEN _LN [ j + 1 ] ; ++ k ) LEN _LN _RE [ k ] = j ;
}
function write _stored ( data , out ) {
var boff = 0 ;
while ( boff < data . length ) {
var L = Math . min ( 0xFFFF , data . length - boff ) ;
var h = boff + L == data . length ;
out . write _shift ( 1 , + h ) ;
out . write _shift ( 2 , L ) ;
out . write _shift ( 2 , ( ~ L ) & 0xFFFF ) ;
while ( L -- > 0 ) out [ out . l ++ ] = data [ boff ++ ] ;
}
return out . l ;
}
/* Fixed Huffman */
function write _huff _fixed ( data , out ) {
var bl = 0 ;
var boff = 0 ;
var addrs = use _typed _arrays ? new Uint16Array ( 0x8000 ) : [ ] ;
while ( boff < data . length ) {
var L = /* data.length - boff; */ Math . min ( 0xFFFF , data . length - boff ) ;
/* write a stored block for short data */
if ( L < 10 ) {
bl = write _bits _3 ( out , bl , + ! ! ( boff + L == data . length ) ) ; // jshint ignore:line
if ( bl & 7 ) bl += 8 - ( bl & 7 ) ;
out . l = ( bl / 8 ) | 0 ;
out . write _shift ( 2 , L ) ;
out . write _shift ( 2 , ( ~ L ) & 0xFFFF ) ;
while ( L -- > 0 ) out [ out . l ++ ] = data [ boff ++ ] ;
bl = out . l * 8 ;
continue ;
}
bl = write _bits _3 ( out , bl , + ! ! ( boff + L == data . length ) + 2 ) ; // jshint ignore:line
var hash = 0 ;
while ( L -- > 0 ) {
var d = data [ boff ] ;
hash = ( ( hash << 5 ) ^ d ) & 0x7FFF ;
var match = - 1 , mlen = 0 ;
if ( ( match = addrs [ hash ] ) ) {
match |= boff & ~ 0x7FFF ;
if ( match > boff ) match -= 0x8000 ;
if ( match < boff ) while ( data [ match + mlen ] == data [ boff + mlen ] && mlen < 250 ) ++ mlen ;
}
if ( mlen > 2 ) {
/* Copy Token */
d = LEN _LN _RE [ mlen ] ;
if ( d <= 22 ) bl = write _bits _8 ( out , bl , bitswap8 [ d + 1 ] >> 1 ) - 1 ;
else {
write _bits _8 ( out , bl , 3 ) ;
bl += 5 ;
write _bits _8 ( out , bl , bitswap8 [ d - 23 ] >> 5 ) ;
bl += 3 ;
}
var len _eb = ( d < 8 ) ? 0 : ( ( d - 4 ) >> 2 ) ;
if ( len _eb > 0 ) {
write _bits _16 ( out , bl , mlen - LEN _LN [ d ] ) ;
bl += len _eb ;
}
d = DST _LN _RE [ boff - match ] ;
bl = write _bits _8 ( out , bl , bitswap8 [ d ] >> 3 ) ;
bl -= 3 ;
var dst _eb = d < 4 ? 0 : ( d - 2 ) >> 1 ;
if ( dst _eb > 0 ) {
write _bits _16 ( out , bl , boff - match - DST _LN [ d ] ) ;
bl += dst _eb ;
}
for ( var q = 0 ; q < mlen ; ++ q ) {
addrs [ hash ] = boff & 0x7FFF ;
hash = ( ( hash << 5 ) ^ data [ boff ] ) & 0x7FFF ;
++ boff ;
}
L -= mlen - 1 ;
} else {
/* Literal Token */
if ( d <= 143 ) d = d + 48 ;
else bl = write _bits _1 ( out , bl , 1 ) ;
bl = write _bits _8 ( out , bl , bitswap8 [ d ] ) ;
addrs [ hash ] = boff & 0x7FFF ;
++ boff ;
}
}
bl = write _bits _8 ( out , bl , 0 ) - 1 ;
}
out . l = ( ( bl + 7 ) / 8 ) | 0 ;
return out . l ;
}
return function _deflateRaw ( data , out ) {
if ( data . length < 8 ) return write _stored ( data , out ) ;
return write _huff _fixed ( data , out ) ;
} ;
2021-09-12 11:11:48 +00:00
} ) ( ) ;
2022-02-14 01:28:13 +00:00
function _deflate ( data ) {
var buf = new _buf ( 50 + Math . floor ( data . length * 1.1 ) ) ;
var off = _deflateRaw ( data , buf ) ;
return buf . slice ( 0 , off ) ;
}
/* modified inflate function also moves original read head */
2021-09-12 11:11:48 +00:00
var dyn _lmap = use _typed _arrays ? new Uint16Array ( 32768 ) : zero _fill _array ( 32768 ) ;
var dyn _dmap = use _typed _arrays ? new Uint16Array ( 32768 ) : zero _fill _array ( 32768 ) ;
var dyn _cmap = use _typed _arrays ? new Uint16Array ( 128 ) : zero _fill _array ( 128 ) ;
var dyn _len _1 = 1 , dyn _len _2 = 1 ;
/* 5.5.3 Expanding Huffman Codes */
function dyn ( data , boff /*:number*/ ) {
/* nomenclature from RFC1951 refers to bit values; these are offset by the implicit constant */
var _HLIT = read _bits _5 ( data , boff ) + 257 ; boff += 5 ;
var _HDIST = read _bits _5 ( data , boff ) + 1 ; boff += 5 ;
var _HCLEN = read _bits _4 ( data , boff ) + 4 ; boff += 4 ;
var w = 0 ;
/* grab and store code lengths */
var clens = use _typed _arrays ? new Uint8Array ( 19 ) : zero _fill _array ( 19 ) ;
var ctree = [ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] ;
var maxlen = 1 ;
var bl _count = use _typed _arrays ? new Uint8Array ( 8 ) : zero _fill _array ( 8 ) ;
var next _code = use _typed _arrays ? new Uint8Array ( 8 ) : zero _fill _array ( 8 ) ;
var L = clens . length ; /* 19 */
for ( var i = 0 ; i < _HCLEN ; ++ i ) {
clens [ CLEN _ORDER [ i ] ] = w = read _bits _3 ( data , boff ) ;
if ( maxlen < w ) maxlen = w ;
bl _count [ w ] ++ ;
boff += 3 ;
}
/* build code tree */
var ccode = 0 ;
bl _count [ 0 ] = 0 ;
for ( i = 1 ; i <= maxlen ; ++ i ) next _code [ i ] = ccode = ( ccode + bl _count [ i - 1 ] ) << 1 ;
for ( i = 0 ; i < L ; ++ i ) if ( ( ccode = clens [ i ] ) != 0 ) ctree [ i ] = next _code [ ccode ] ++ ;
/* cmap[7 bits from stream] = (off&7) + (lit<<3) */
var cleni = 0 ;
for ( i = 0 ; i < L ; ++ i ) {
cleni = clens [ i ] ;
if ( cleni != 0 ) {
ccode = bitswap8 [ ctree [ i ] ] >> ( 8 - cleni ) ;
for ( var j = ( 1 << ( 7 - cleni ) ) - 1 ; j >= 0 ; -- j ) dyn _cmap [ ccode | ( j << cleni ) ] = ( cleni & 7 ) | ( i << 3 ) ;
}
}
/* read literal and dist codes at once */
var hcodes /*:Array<number>*/ = [ ] ;
maxlen = 1 ;
for ( ; hcodes . length < _HLIT + _HDIST ; ) {
ccode = dyn _cmap [ read _bits _7 ( data , boff ) ] ;
boff += ccode & 7 ;
switch ( ( ccode >>>= 3 ) ) {
case 16 :
w = 3 + read _bits _2 ( data , boff ) ; boff += 2 ;
ccode = hcodes [ hcodes . length - 1 ] ;
while ( w -- > 0 ) hcodes . push ( ccode ) ;
break ;
case 17 :
w = 3 + read _bits _3 ( data , boff ) ; boff += 3 ;
while ( w -- > 0 ) hcodes . push ( 0 ) ;
break ;
case 18 :
w = 11 + read _bits _7 ( data , boff ) ; boff += 7 ;
while ( w -- > 0 ) hcodes . push ( 0 ) ;
break ;
default :
hcodes . push ( ccode ) ;
if ( maxlen < ccode ) maxlen = ccode ;
break ;
}
}
/* build literal / length trees */
var h1 = hcodes . slice ( 0 , _HLIT ) , h2 = hcodes . slice ( _HLIT ) ;
for ( i = _HLIT ; i < 286 ; ++ i ) h1 [ i ] = 0 ;
for ( i = _HDIST ; i < 30 ; ++ i ) h2 [ i ] = 0 ;
dyn _len _1 = build _tree ( h1 , dyn _lmap , 286 ) ;
dyn _len _2 = build _tree ( h2 , dyn _dmap , 30 ) ;
return boff ;
}
/* return [ data, bytesRead ] */
function inflate ( data , usz /*:number*/ ) {
/* shortcircuit for empty buffer [0x03, 0x00] */
if ( data [ 0 ] == 3 && ! ( data [ 1 ] & 0x3 ) ) { return [ new _raw _buf ( usz ) , 2 ] ; }
/* bit offset */
var boff = 0 ;
/* header includes final bit and type bits */
var header = 0 ;
var outbuf = new _unsafe _buf ( usz ? usz : ( 1 << 18 ) ) ;
var woff = 0 ;
var OL = outbuf . length >>> 0 ;
var max _len _1 = 0 , max _len _2 = 0 ;
while ( ( header & 1 ) == 0 ) {
header = read _bits _3 ( data , boff ) ; boff += 3 ;
if ( ( header >>> 1 ) == 0 ) {
/* Stored block */
if ( boff & 7 ) boff += 8 - ( boff & 7 ) ;
/* 2 bytes sz, 2 bytes bit inverse */
var sz = data [ boff >>> 3 ] | data [ ( boff >>> 3 ) + 1 ] << 8 ;
boff += 32 ;
/* push sz bytes */
2022-02-14 01:28:13 +00:00
if ( sz > 0 ) {
if ( ! usz && OL < woff + sz ) { outbuf = realloc ( outbuf , woff + sz ) ; OL = outbuf . length ; }
while ( sz -- > 0 ) { outbuf [ woff ++ ] = data [ boff >>> 3 ] ; boff += 8 ; }
}
2021-09-12 11:11:48 +00:00
continue ;
2022-02-14 01:28:13 +00:00
} else if ( ( header >> 1 ) == 1 ) {
2021-09-12 11:11:48 +00:00
/* Fixed Huffman */
max _len _1 = 9 ; max _len _2 = 5 ;
} else {
/* Dynamic Huffman */
boff = dyn ( data , boff ) ;
max _len _1 = dyn _len _1 ; max _len _2 = dyn _len _2 ;
}
for ( ; ; ) { // while(true) is apparently out of vogue in modern JS circles
2022-02-14 01:28:13 +00:00
if ( ! usz && ( OL < woff + 32767 ) ) { outbuf = realloc ( outbuf , woff + 32767 ) ; OL = outbuf . length ; }
2021-09-12 11:11:48 +00:00
/* ingest code and move read head */
var bits = read _bits _n ( data , boff , max _len _1 ) ;
var code = ( header >>> 1 ) == 1 ? fix _lmap [ bits ] : dyn _lmap [ bits ] ;
boff += code & 15 ; code >>>= 4 ;
/* 0-255 are literals, 256 is end of block token, 257+ are copy tokens */
if ( ( ( code >>> 8 ) & 0xFF ) === 0 ) outbuf [ woff ++ ] = code ;
else if ( code == 256 ) break ;
else {
code -= 257 ;
var len _eb = ( code < 8 ) ? 0 : ( ( code - 4 ) >> 2 ) ; if ( len _eb > 5 ) len _eb = 0 ;
var tgt = woff + LEN _LN [ code ] ;
/* length extra bits */
if ( len _eb > 0 ) {
tgt += read _bits _n ( data , boff , len _eb ) ;
boff += len _eb ;
}
/* dist code */
bits = read _bits _n ( data , boff , max _len _2 ) ;
code = ( header >>> 1 ) == 1 ? fix _dmap [ bits ] : dyn _dmap [ bits ] ;
boff += code & 15 ; code >>>= 4 ;
var dst _eb = ( code < 4 ? 0 : ( code - 2 ) >> 1 ) ;
var dst = DST _LN [ code ] ;
/* dist extra bits */
if ( dst _eb > 0 ) {
dst += read _bits _n ( data , boff , dst _eb ) ;
boff += dst _eb ;
}
/* in the common case, manual byte copy is faster than TA set / Buffer copy */
2022-02-14 01:28:13 +00:00
if ( ! usz && OL < tgt ) { outbuf = realloc ( outbuf , tgt + 100 ) ; OL = outbuf . length ; }
2021-09-12 11:11:48 +00:00
while ( woff < tgt ) { outbuf [ woff ] = outbuf [ woff - dst ] ; ++ woff ; }
}
}
}
2022-02-14 01:28:13 +00:00
if ( usz ) return [ outbuf , ( boff + 7 ) >>> 3 ] ;
return [ outbuf . slice ( 0 , woff ) , ( boff + 7 ) >>> 3 ] ;
2021-09-12 11:11:48 +00:00
}
function _inflate ( payload , usz ) {
var data = payload . slice ( payload . l || 0 ) ;
var out = inflate ( data , usz ) ;
payload . l += out [ 1 ] ;
return out [ 0 ] ;
}
function warn _or _throw ( wrn , msg ) {
if ( wrn ) { if ( typeof console !== 'undefined' ) console . error ( msg ) ; }
else throw new Error ( msg ) ;
}
function parse _zip ( file /*:RawBytes*/ , options /*:CFBReadOpts*/ ) /*:CFBContainer*/ {
var blob /*:CFBlob*/ = /*::(*/ file /*:: :any)*/ ;
prep _blob ( blob , 0 ) ;
var FileIndex /*:CFBFileIndex*/ = [ ] , FullPaths /*:Array<string>*/ = [ ] ;
var o = {
FileIndex : FileIndex ,
FullPaths : FullPaths
} ;
init _cfb ( o , { root : options . root } ) ;
/* find end of central directory, start just after signature */
var i = blob . length - 4 ;
while ( ( blob [ i ] != 0x50 || blob [ i + 1 ] != 0x4b || blob [ i + 2 ] != 0x05 || blob [ i + 3 ] != 0x06 ) && i >= 0 ) -- i ;
blob . l = i + 4 ;
/* parse end of central directory */
blob . l += 4 ;
var fcnt = blob . read _shift ( 2 ) ;
blob . l += 6 ;
var start _cd = blob . read _shift ( 4 ) ;
/* parse central directory */
blob . l = start _cd ;
for ( i = 0 ; i < fcnt ; ++ i ) {
/* trust local file header instead of CD entry */
blob . l += 20 ;
var csz = blob . read _shift ( 4 ) ;
var usz = blob . read _shift ( 4 ) ;
var namelen = blob . read _shift ( 2 ) ;
var efsz = blob . read _shift ( 2 ) ;
var fcsz = blob . read _shift ( 2 ) ;
blob . l += 8 ;
var offset = blob . read _shift ( 4 ) ;
var EF = parse _extra _field ( /*::(*/ blob . slice ( blob . l + namelen , blob . l + namelen + efsz ) /*:: :any)*/ ) ;
blob . l += namelen + efsz + fcsz ;
var L = blob . l ;
blob . l = offset + 4 ;
2022-09-06 06:18:12 +00:00
/* ZIP64 lengths */
if ( EF && EF [ 0x0001 ] ) {
if ( ( EF [ 0x0001 ] || { } ) . usz ) usz = EF [ 0x0001 ] . usz ;
if ( ( EF [ 0x0001 ] || { } ) . csz ) csz = EF [ 0x0001 ] . csz ;
}
2021-09-12 11:11:48 +00:00
parse _local _file ( blob , csz , usz , o , EF ) ;
blob . l = L ;
}
2022-05-22 23:51:41 +00:00
2021-09-12 11:11:48 +00:00
return o ;
}
/* head starts just after local file header signature */
function parse _local _file ( blob /*:CFBlob*/ , csz /*:number*/ , usz /*:number*/ , o /*:CFBContainer*/ , EF ) {
/* [local file header] */
blob . l += 2 ;
var flags = blob . read _shift ( 2 ) ;
var meth = blob . read _shift ( 2 ) ;
var date = parse _dos _date ( blob ) ;
if ( flags & 0x2041 ) throw new Error ( "Unsupported ZIP encryption" ) ;
var crc32 = blob . read _shift ( 4 ) ;
var _csz = blob . read _shift ( 4 ) ;
var _usz = blob . read _shift ( 4 ) ;
var namelen = blob . read _shift ( 2 ) ;
var efsz = blob . read _shift ( 2 ) ;
// TODO: flags & (1<<11) // UTF8
var name = "" ; for ( var i = 0 ; i < namelen ; ++ i ) name += String . fromCharCode ( blob [ blob . l ++ ] ) ;
if ( efsz ) {
var ef = parse _extra _field ( /*::(*/ blob . slice ( blob . l , blob . l + efsz ) /*:: :any)*/ ) ;
if ( ( ef [ 0x5455 ] || { } ) . mt ) date = ef [ 0x5455 ] . mt ;
2022-09-06 06:18:12 +00:00
if ( ( ef [ 0x0001 ] || { } ) . usz ) _usz = ef [ 0x0001 ] . usz ;
if ( ( ef [ 0x0001 ] || { } ) . csz ) _csz = ef [ 0x0001 ] . csz ;
if ( EF ) {
if ( ( EF [ 0x5455 ] || { } ) . mt ) date = EF [ 0x5455 ] . mt ;
if ( ( EF [ 0x0001 ] || { } ) . usz ) _usz = ef [ 0x0001 ] . usz ;
if ( ( EF [ 0x0001 ] || { } ) . csz ) _csz = ef [ 0x0001 ] . csz ;
}
2021-09-12 11:11:48 +00:00
}
blob . l += efsz ;
/* [encryption header] */
/* [file data] */
var data = blob . slice ( blob . l , blob . l + _csz ) ;
switch ( meth ) {
case 8 : data = _inflateRawSync ( blob , _usz ) ; break ;
2022-02-14 01:28:13 +00:00
case 0 : break ; // TODO: scan for magic number
2021-09-12 11:11:48 +00:00
default : throw new Error ( "Unsupported ZIP Compression method " + meth ) ;
}
/* [data descriptor] */
var wrn = false ;
if ( flags & 8 ) {
crc32 = blob . read _shift ( 4 ) ;
if ( crc32 == 0x08074b50 ) { crc32 = blob . read _shift ( 4 ) ; wrn = true ; }
_csz = blob . read _shift ( 4 ) ;
_usz = blob . read _shift ( 4 ) ;
}
if ( _csz != csz ) warn _or _throw ( wrn , "Bad compressed size: " + csz + " != " + _csz ) ;
if ( _usz != usz ) warn _or _throw ( wrn , "Bad uncompressed size: " + usz + " != " + _usz ) ;
2022-02-14 01:28:13 +00:00
//var _crc32 = CRC32.buf(data, 0);
//if((crc32>>0) != (_crc32>>0)) warn_or_throw(wrn, "Bad CRC32 checksum: " + crc32 + " != " + _crc32);
2021-09-12 11:11:48 +00:00
cfb _add ( o , name , data , { unsafe : true , mt : date } ) ;
}
function write _zip ( cfb /*:CFBContainer*/ , options /*:CFBWriteOpts*/ ) /*:RawBytes*/ {
var _opts = options || { } ;
var out = [ ] , cdirs = [ ] ;
var o /*:CFBlob*/ = new _buf ( 1 ) ;
var method = ( _opts . compression ? 8 : 0 ) , flags = 0 ;
var desc = false ;
if ( desc ) flags |= 8 ;
var i = 0 , j = 0 ;
var start _cd = 0 , fcnt = 0 ;
var root = cfb . FullPaths [ 0 ] , fp = root , fi = cfb . FileIndex [ 0 ] ;
var crcs = [ ] ;
var sz _cd = 0 ;
for ( i = 1 ; i < cfb . FullPaths . length ; ++ i ) {
fp = cfb . FullPaths [ i ] . slice ( root . length ) ; fi = cfb . FileIndex [ i ] ;
if ( ! fi . size || ! fi . content || fp == "\u0001Sh33tJ5" ) continue ;
var start = start _cd ;
/* TODO: CP437 filename */
var namebuf = new _buf ( fp . length ) ;
for ( j = 0 ; j < fp . length ; ++ j ) namebuf . write _shift ( 1 , fp . charCodeAt ( j ) & 0x7F ) ;
namebuf = namebuf . slice ( 0 , namebuf . l ) ;
2022-09-22 09:05:24 +00:00
crcs [ fcnt ] = typeof fi . content == "string" ? CRC32 . bstr ( fi . content , 0 ) : CRC32 . buf ( /*::((*/ fi . content /*::||[]):any)*/ , 0 ) ;
2021-09-12 11:11:48 +00:00
2022-09-22 09:05:24 +00:00
var outbuf = typeof fi . content == "string" ? s2a ( fi . content ) : fi . content /*::||[]*/ ;
2021-09-12 11:11:48 +00:00
if ( method == 8 ) outbuf = _deflateRawSync ( outbuf ) ;
/* local file header */
o = new _buf ( 30 ) ;
o . write _shift ( 4 , 0x04034b50 ) ;
o . write _shift ( 2 , 20 ) ;
o . write _shift ( 2 , flags ) ;
o . write _shift ( 2 , method ) ;
/* TODO: last mod file time/date */
if ( fi . mt ) write _dos _date ( o , fi . mt ) ;
else o . write _shift ( 4 , 0 ) ;
o . write _shift ( - 4 , ( flags & 8 ) ? 0 : crcs [ fcnt ] ) ;
o . write _shift ( 4 , ( flags & 8 ) ? 0 : outbuf . length ) ;
o . write _shift ( 4 , ( flags & 8 ) ? 0 : /*::(*/ fi . content /*::||[])*/ . length ) ;
o . write _shift ( 2 , namebuf . length ) ;
o . write _shift ( 2 , 0 ) ;
start _cd += o . length ;
out . push ( o ) ;
start _cd += namebuf . length ;
out . push ( namebuf ) ;
2022-02-14 01:28:13 +00:00
/* TODO: extra fields? */
2021-09-12 11:11:48 +00:00
/* TODO: encryption header ? */
2022-02-14 01:28:13 +00:00
2021-09-12 11:11:48 +00:00
start _cd += outbuf . length ;
out . push ( outbuf ) ;
/* data descriptor */
if ( flags & 8 ) {
o = new _buf ( 12 ) ;
o . write _shift ( - 4 , crcs [ fcnt ] ) ;
o . write _shift ( 4 , outbuf . length ) ;
o . write _shift ( 4 , /*::(*/ fi . content /*::||[])*/ . length ) ;
start _cd += o . l ;
out . push ( o ) ;
}
/* central directory */
o = new _buf ( 46 ) ;
o . write _shift ( 4 , 0x02014b50 ) ;
o . write _shift ( 2 , 0 ) ;
o . write _shift ( 2 , 20 ) ;
o . write _shift ( 2 , flags ) ;
o . write _shift ( 2 , method ) ;
o . write _shift ( 4 , 0 ) ; /* TODO: last mod file time/date */
o . write _shift ( - 4 , crcs [ fcnt ] ) ;
o . write _shift ( 4 , outbuf . length ) ;
o . write _shift ( 4 , /*::(*/ fi . content /*::||[])*/ . length ) ;
o . write _shift ( 2 , namebuf . length ) ;
o . write _shift ( 2 , 0 ) ;
o . write _shift ( 2 , 0 ) ;
o . write _shift ( 2 , 0 ) ;
o . write _shift ( 2 , 0 ) ;
o . write _shift ( 4 , 0 ) ;
o . write _shift ( 4 , start ) ;
sz _cd += o . l ;
cdirs . push ( o ) ;
sz _cd += namebuf . length ;
cdirs . push ( namebuf ) ;
++ fcnt ;
}
/* end of central directory */
o = new _buf ( 22 ) ;
o . write _shift ( 4 , 0x06054b50 ) ;
o . write _shift ( 2 , 0 ) ;
o . write _shift ( 2 , 0 ) ;
o . write _shift ( 2 , fcnt ) ;
o . write _shift ( 2 , fcnt ) ;
o . write _shift ( 4 , sz _cd ) ;
o . write _shift ( 4 , start _cd ) ;
o . write _shift ( 2 , 0 ) ;
return bconcat ( ( [ bconcat ( ( out /*:any*/ ) ) , bconcat ( cdirs ) , o ] /*:any*/ ) ) ;
}
2022-02-14 01:28:13 +00:00
var ContentTypeMap = ( {
"htm" : "text/html" ,
"xml" : "text/xml" ,
"gif" : "image/gif" ,
"jpg" : "image/jpeg" ,
"png" : "image/png" ,
"mso" : "application/x-mso" ,
"thmx" : "application/vnd.ms-officetheme" ,
"sh33tj5" : "application/octet-stream"
} /*:any*/ ) ;
function get _content _type ( fi /*:CFBEntry*/ , fp /*:string*/ ) /*:string*/ {
if ( fi . ctype ) return fi . ctype ;
var ext = fi . name || "" , m = ext . match ( /\.([^\.]+)$/ ) ;
if ( m && ContentTypeMap [ m [ 1 ] ] ) return ContentTypeMap [ m [ 1 ] ] ;
if ( fp ) {
m = ( ext = fp ) . match ( /[\.\\]([^\.\\])+$/ ) ;
if ( m && ContentTypeMap [ m [ 1 ] ] ) return ContentTypeMap [ m [ 1 ] ] ;
}
return "application/octet-stream" ;
}
/* 76 character chunks TODO: intertwine encoding */
function write _base64 _76 ( bstr /*:string*/ ) /*:string*/ {
2022-03-22 20:08:08 +00:00
var data = Base64 _encode ( bstr ) ;
2022-02-14 01:28:13 +00:00
var o = [ ] ;
for ( var i = 0 ; i < data . length ; i += 76 ) o . push ( data . slice ( i , i + 76 ) ) ;
return o . join ( "\r\n" ) + "\r\n" ;
}
/ *
Rules for QP :
- escape = # # applies for all non - display characters and literal "="
- space or tab at end of line must be encoded
- \ r \ n newlines can be preserved , but bare \ r and \ n must be escaped
- lines must not exceed 76 characters , use soft breaks = \ r \ n
TODO : Some files from word appear to write line extensions with bare equals :
` ` `
< table class = 3 DMsoTableGrid border = 3 D1 cellspacing = 3 D0 cellpadding = 3 D0 width =
= "70%"
` ` `
* /
function write _quoted _printable ( text /*:string*/ ) /*:string*/ {
var encoded = text . replace ( /[\x00-\x08\x0B\x0C\x0E-\x1F\x7E-\xFF=]/g , function ( c ) {
var w = c . charCodeAt ( 0 ) . toString ( 16 ) . toUpperCase ( ) ;
return "=" + ( w . length == 1 ? "0" + w : w ) ;
} ) ;
encoded = encoded . replace ( / $/mg , "=20" ) . replace ( /\t$/mg , "=09" ) ;
if ( encoded . charAt ( 0 ) == "\n" ) encoded = "=0D" + encoded . slice ( 1 ) ;
encoded = encoded . replace ( /\r(?!\n)/mg , "=0D" ) . replace ( /\n\n/mg , "\n=0A" ) . replace ( /([^\r\n])\n/mg , "$1=0A" ) ;
var o /*:Array<string>*/ = [ ] , split = encoded . split ( "\r\n" ) ;
for ( var si = 0 ; si < split . length ; ++ si ) {
var str = split [ si ] ;
if ( str . length == 0 ) { o . push ( "" ) ; continue ; }
for ( var i = 0 ; i < str . length ; ) {
var end = 76 ;
var tmp = str . slice ( i , i + end ) ;
if ( tmp . charAt ( end - 1 ) == "=" ) end -- ;
else if ( tmp . charAt ( end - 2 ) == "=" ) end -= 2 ;
else if ( tmp . charAt ( end - 3 ) == "=" ) end -= 3 ;
tmp = str . slice ( i , i + end ) ;
i += end ;
if ( i < str . length ) tmp += "=" ;
o . push ( tmp ) ;
}
}
return o . join ( "\r\n" ) ;
}
function parse _quoted _printable ( data /*:Array<string>*/ ) /*:RawBytes*/ {
var o = [ ] ;
/* unify long lines */
for ( var di = 0 ; di < data . length ; ++ di ) {
var line = data [ di ] ;
while ( di <= data . length && line . charAt ( line . length - 1 ) == "=" ) line = line . slice ( 0 , line . length - 1 ) + data [ ++ di ] ;
o . push ( line ) ;
}
/* decode */
for ( var oi = 0 ; oi < o . length ; ++ oi ) o [ oi ] = o [ oi ] . replace ( /[=][0-9A-Fa-f]{2}/g , function ( $$ ) { return String . fromCharCode ( parseInt ( $$ . slice ( 1 ) , 16 ) ) ; } ) ;
return s2a ( o . join ( "\r\n" ) ) ;
}
function parse _mime ( cfb /*:CFBContainer*/ , data /*:Array<string>*/ , root /*:string*/ ) /*:void*/ {
var fname = "" , cte = "" , ctype = "" , fdata ;
var di = 0 ;
for ( ; di < 10 ; ++ di ) {
var line = data [ di ] ;
if ( ! line || line . match ( /^\s*$/ ) ) break ;
var m = line . match ( /^(.*?):\s*([^\s].*)$/ ) ;
if ( m ) switch ( m [ 1 ] . toLowerCase ( ) ) {
case "content-location" : fname = m [ 2 ] . trim ( ) ; break ;
case "content-type" : ctype = m [ 2 ] . trim ( ) ; break ;
case "content-transfer-encoding" : cte = m [ 2 ] . trim ( ) ; break ;
}
}
++ di ;
switch ( cte . toLowerCase ( ) ) {
2022-03-22 20:08:08 +00:00
case 'base64' : fdata = s2a ( Base64 _decode ( data . slice ( di ) . join ( "" ) ) ) ; break ;
2022-02-14 01:28:13 +00:00
case 'quoted-printable' : fdata = parse _quoted _printable ( data . slice ( di ) ) ; break ;
default : throw new Error ( "Unsupported Content-Transfer-Encoding " + cte ) ;
}
var file = cfb _add ( cfb , fname . slice ( root . length ) , fdata , { unsafe : true } ) ;
if ( ctype ) file . ctype = ctype ;
}
function parse _mad ( file /*:RawBytes*/ , options /*:CFBReadOpts*/ ) /*:CFBContainer*/ {
if ( a2s ( file . slice ( 0 , 13 ) ) . toLowerCase ( ) != "mime-version:" ) throw new Error ( "Unsupported MAD header" ) ;
var root = ( options && options . root || "" ) ;
// $FlowIgnore
var data = ( has _buf && Buffer . isBuffer ( file ) ? file . toString ( "binary" ) : a2s ( file ) ) . split ( "\r\n" ) ;
var di = 0 , row = "" ;
/* if root is not specified, scan for the common prefix */
for ( di = 0 ; di < data . length ; ++ di ) {
row = data [ di ] ;
if ( ! /^Content-Location:/i . test ( row ) ) continue ;
row = row . slice ( row . indexOf ( "file" ) ) ;
if ( ! root ) root = row . slice ( 0 , row . lastIndexOf ( "/" ) + 1 ) ;
if ( row . slice ( 0 , root . length ) == root ) continue ;
while ( root . length > 0 ) {
root = root . slice ( 0 , root . length - 1 ) ;
root = root . slice ( 0 , root . lastIndexOf ( "/" ) + 1 ) ;
if ( row . slice ( 0 , root . length ) == root ) break ;
}
}
var mboundary = ( data [ 1 ] || "" ) . match ( /boundary="(.*?)"/ ) ;
if ( ! mboundary ) throw new Error ( "MAD cannot find boundary" ) ;
var boundary = "--" + ( mboundary [ 1 ] || "" ) ;
var FileIndex /*:CFBFileIndex*/ = [ ] , FullPaths /*:Array<string>*/ = [ ] ;
var o = {
FileIndex : FileIndex ,
FullPaths : FullPaths
} ;
init _cfb ( o ) ;
var start _di , fcnt = 0 ;
for ( di = 0 ; di < data . length ; ++ di ) {
var line = data [ di ] ;
if ( line !== boundary && line !== boundary + "--" ) continue ;
if ( fcnt ++ ) parse _mime ( o , data . slice ( start _di , di ) , root ) ;
start _di = di ;
}
return o ;
}
function write _mad ( cfb /*:CFBContainer*/ , options /*:CFBWriteOpts*/ ) /*:string*/ {
var opts = options || { } ;
var boundary = opts . boundary || "SheetJS" ;
boundary = '------=' + boundary ;
var out = [
'MIME-Version: 1.0' ,
'Content-Type: multipart/related; boundary="' + boundary . slice ( 2 ) + '"' ,
'' ,
'' ,
''
] ;
var root = cfb . FullPaths [ 0 ] , fp = root , fi = cfb . FileIndex [ 0 ] ;
for ( var i = 1 ; i < cfb . FullPaths . length ; ++ i ) {
fp = cfb . FullPaths [ i ] . slice ( root . length ) ;
fi = cfb . FileIndex [ i ] ;
if ( ! fi . size || ! fi . content || fp == "\u0001Sh33tJ5" ) continue ;
/* Normalize filename */
fp = fp . replace ( /[\x00-\x08\x0B\x0C\x0E-\x1F\x7E-\xFF]/g , function ( c ) {
return "_x" + c . charCodeAt ( 0 ) . toString ( 16 ) + "_" ;
} ) . replace ( /[\u0080-\uFFFF]/g , function ( u ) {
return "_u" + u . charCodeAt ( 0 ) . toString ( 16 ) + "_" ;
} ) ;
/* Extract content as binary string */
var ca = fi . content ;
// $FlowIgnore
var cstr = has _buf && Buffer . isBuffer ( ca ) ? ca . toString ( "binary" ) : a2s ( ca ) ;
/* 4/5 of first 1024 chars ascii -> quoted printable, else base64 */
var dispcnt = 0 , L = Math . min ( 1024 , cstr . length ) , cc = 0 ;
for ( var csl = 0 ; csl <= L ; ++ csl ) if ( ( cc = cstr . charCodeAt ( csl ) ) >= 0x20 && cc < 0x80 ) ++ dispcnt ;
var qp = dispcnt >= L * 4 / 5 ;
out . push ( boundary ) ;
out . push ( 'Content-Location: ' + ( opts . root || 'file:///C:/SheetJS/' ) + fp ) ;
out . push ( 'Content-Transfer-Encoding: ' + ( qp ? 'quoted-printable' : 'base64' ) ) ;
out . push ( 'Content-Type: ' + get _content _type ( fi , fp ) ) ;
out . push ( '' ) ;
out . push ( qp ? write _quoted _printable ( cstr ) : write _base64 _76 ( cstr ) ) ;
}
out . push ( boundary + '--\r\n' ) ;
return out . join ( "\r\n" ) ;
}
2021-09-12 11:11:48 +00:00
function cfb _new ( opts /*:?any*/ ) /*:CFBContainer*/ {
var o /*:CFBContainer*/ = ( { } /*:any*/ ) ;
init _cfb ( o , opts ) ;
return o ;
}
function cfb _add ( cfb /*:CFBContainer*/ , name /*:string*/ , content /*:?RawBytes*/ , opts /*:?any*/ ) /*:CFBEntry*/ {
var unsafe = opts && opts . unsafe ;
if ( ! unsafe ) init _cfb ( cfb ) ;
var file = ! unsafe && CFB . find ( cfb , name ) ;
if ( ! file ) {
var fpath /*:string*/ = cfb . FullPaths [ 0 ] ;
if ( name . slice ( 0 , fpath . length ) == fpath ) fpath = name ;
else {
if ( fpath . slice ( - 1 ) != "/" ) fpath += "/" ;
fpath = ( fpath + name ) . replace ( "//" , "/" ) ;
}
file = ( { name : filename ( name ) , type : 2 } /*:any*/ ) ;
cfb . FileIndex . push ( file ) ;
cfb . FullPaths . push ( fpath ) ;
if ( ! unsafe ) CFB . utils . cfb _gc ( cfb ) ;
}
/*:: if(!file) throw new Error("unreachable"); */
file . content = ( content /*:any*/ ) ;
file . size = content ? content . length : 0 ;
if ( opts ) {
if ( opts . CLSID ) file . clsid = opts . CLSID ;
if ( opts . mt ) file . mt = opts . mt ;
if ( opts . ct ) file . ct = opts . ct ;
}
return file ;
}
function cfb _del ( cfb /*:CFBContainer*/ , name /*:string*/ ) /*:boolean*/ {
init _cfb ( cfb ) ;
var file = CFB . find ( cfb , name ) ;
if ( file ) for ( var j = 0 ; j < cfb . FileIndex . length ; ++ j ) if ( cfb . FileIndex [ j ] == file ) {
cfb . FileIndex . splice ( j , 1 ) ;
cfb . FullPaths . splice ( j , 1 ) ;
return true ;
}
return false ;
}
function cfb _mov ( cfb /*:CFBContainer*/ , old _name /*:string*/ , new _name /*:string*/ ) /*:boolean*/ {
init _cfb ( cfb ) ;
var file = CFB . find ( cfb , old _name ) ;
if ( file ) for ( var j = 0 ; j < cfb . FileIndex . length ; ++ j ) if ( cfb . FileIndex [ j ] == file ) {
cfb . FileIndex [ j ] . name = filename ( new _name ) ;
cfb . FullPaths [ j ] = new _name ;
return true ;
}
return false ;
}
function cfb _gc ( cfb /*:CFBContainer*/ ) /*:void*/ { rebuild _cfb ( cfb , true ) ; }
exports . find = find ;
exports . read = read ;
exports . parse = parse ;
exports . write = write ;
exports . writeFile = write _file ;
exports . utils = {
cfb _new : cfb _new ,
cfb _add : cfb _add ,
cfb _del : cfb _del ,
cfb _mov : cfb _mov ,
cfb _gc : cfb _gc ,
ReadShift : ReadShift ,
CheckField : CheckField ,
prep _blob : prep _blob ,
bconcat : bconcat ,
use _zlib : use _zlib ,
_deflateRaw : _deflate ,
_inflateRaw : _inflate ,
consts : consts
} ;
return exports ;
} ) ( ) ;
2022-05-22 23:51:41 +00:00
var _fs ;
2022-02-13 09:35:34 +00:00
function set _fs ( fs ) { _fs = fs ; }
2021-09-12 11:11:48 +00:00
/* normalize data for blob ctor */
function blobify ( data ) {
if ( typeof data === "string" ) return s2ab ( data ) ;
if ( Array . isArray ( data ) ) return a2u ( data ) ;
return data ;
}
/* write or download file */
function write _dl ( fname /*:string*/ , payload /*:any*/ , enc /*:?string*/ ) {
/*global IE_SaveFile, Blob, navigator, saveAs, document, File, chrome */
if ( typeof _fs !== 'undefined' && _fs . writeFileSync ) return enc ? _fs . writeFileSync ( fname , payload , enc ) : _fs . writeFileSync ( fname , payload ) ;
2022-02-12 06:31:47 +00:00
if ( typeof Deno !== 'undefined' ) {
/* in this spot, it's safe to assume typed arrays and TextEncoder/TextDecoder exist */
2022-03-03 08:35:39 +00:00
if ( enc && typeof payload == "string" ) switch ( enc ) {
2022-02-12 06:31:47 +00:00
case "utf8" : payload = new TextEncoder ( enc ) . encode ( payload ) ; break ;
case "binary" : payload = s2ab ( payload ) ; break ;
/* TODO: binary equivalent */
default : throw new Error ( "Unsupported encoding " + enc ) ;
}
return Deno . writeFileSync ( fname , payload ) ;
}
2021-09-12 11:11:48 +00:00
var data = ( enc == "utf8" ) ? utf8write ( payload ) : payload ;
/*:: declare var IE_SaveFile: any; */
if ( typeof IE _SaveFile !== 'undefined' ) return IE _SaveFile ( data , fname ) ;
if ( typeof Blob !== 'undefined' ) {
var blob = new Blob ( [ blobify ( data ) ] , { type : "application/octet-stream" } ) ;
/*:: declare var navigator: any; */
if ( typeof navigator !== 'undefined' && navigator . msSaveBlob ) return navigator . msSaveBlob ( blob , fname ) ;
/*:: declare var saveAs: any; */
if ( typeof saveAs !== 'undefined' ) return saveAs ( blob , fname ) ;
if ( typeof URL !== 'undefined' && typeof document !== 'undefined' && document . createElement && URL . createObjectURL ) {
var url = URL . createObjectURL ( blob ) ;
/*:: declare var chrome: any; */
if ( typeof chrome === 'object' && typeof ( chrome . downloads || { } ) . download == "function" ) {
if ( URL . revokeObjectURL && typeof setTimeout !== 'undefined' ) setTimeout ( function ( ) { URL . revokeObjectURL ( url ) ; } , 60000 ) ;
return chrome . downloads . download ( { url : url , filename : fname , saveAs : true } ) ;
}
var a = document . createElement ( "a" ) ;
if ( a . download != null ) {
/*:: if(document.body == null) throw new Error("unreachable"); */
a . download = fname ; a . href = url ; document . body . appendChild ( a ) ; a . click ( ) ;
/*:: if(document.body == null) throw new Error("unreachable"); */ document . body . removeChild ( a ) ;
if ( URL . revokeObjectURL && typeof setTimeout !== 'undefined' ) setTimeout ( function ( ) { URL . revokeObjectURL ( url ) ; } , 60000 ) ;
return url ;
}
}
}
// $FlowIgnore
if ( typeof $ !== 'undefined' && typeof File !== 'undefined' && typeof Folder !== 'undefined' ) try { // extendscript
// $FlowIgnore
var out = File ( fname ) ; out . open ( "w" ) ; out . encoding = "binary" ;
if ( Array . isArray ( payload ) ) payload = a2s ( payload ) ;
out . write ( payload ) ; out . close ( ) ; return payload ;
} catch ( e ) { if ( ! e . message || ! e . message . match ( /onstruct/ ) ) throw e ; }
throw new Error ( "cannot save file " + fname ) ;
}
/* read binary data from file */
function read _binary ( path /*:string*/ ) {
if ( typeof _fs !== 'undefined' ) return _fs . readFileSync ( path ) ;
2022-02-12 06:31:47 +00:00
if ( typeof Deno !== 'undefined' ) return Deno . readFileSync ( path ) ;
2021-09-12 11:11:48 +00:00
// $FlowIgnore
if ( typeof $ !== 'undefined' && typeof File !== 'undefined' && typeof Folder !== 'undefined' ) try { // extendscript
// $FlowIgnore
var infile = File ( path ) ; infile . open ( "r" ) ; infile . encoding = "binary" ;
var data = infile . read ( ) ; infile . close ( ) ;
return data ;
} catch ( e ) { if ( ! e . message || ! e . message . match ( /onstruct/ ) ) throw e ; }
throw new Error ( "Cannot access file " + path ) ;
}
function keys ( o /*:any*/ ) /*:Array<any>*/ {
var ks = Object . keys ( o ) , o2 = [ ] ;
for ( var i = 0 ; i < ks . length ; ++ i ) if ( Object . prototype . hasOwnProperty . call ( o , ks [ i ] ) ) o2 . push ( ks [ i ] ) ;
return o2 ;
}
function evert _key ( obj /*:any*/ , key /*:string*/ ) /*:EvertType*/ {
var o = ( [ ] /*:any*/ ) , K = keys ( obj ) ;
for ( var i = 0 ; i !== K . length ; ++ i ) if ( o [ obj [ K [ i ] ] [ key ] ] == null ) o [ obj [ K [ i ] ] [ key ] ] = K [ i ] ;
return o ;
}
function evert ( obj /*:any*/ ) /*:EvertType*/ {
var o = ( [ ] /*:any*/ ) , K = keys ( obj ) ;
for ( var i = 0 ; i !== K . length ; ++ i ) o [ obj [ K [ i ] ] ] = K [ i ] ;
return o ;
}
function evert _num ( obj /*:any*/ ) /*:EvertNumType*/ {
var o = ( [ ] /*:any*/ ) , K = keys ( obj ) ;
for ( var i = 0 ; i !== K . length ; ++ i ) o [ obj [ K [ i ] ] ] = parseInt ( K [ i ] , 10 ) ;
return o ;
}
function evert _arr ( obj /*:any*/ ) /*:EvertArrType*/ {
var o /*:EvertArrType*/ = ( [ ] /*:any*/ ) , K = keys ( obj ) ;
for ( var i = 0 ; i !== K . length ; ++ i ) {
if ( o [ obj [ K [ i ] ] ] == null ) o [ obj [ K [ i ] ] ] = [ ] ;
o [ obj [ K [ i ] ] ] . push ( K [ i ] ) ;
}
return o ;
}
2022-03-20 01:54:41 +00:00
var basedate = /*#__PURE__*/ new Date ( 1899 , 11 , 30 , 0 , 0 , 0 ) ; // 2209161600000
2021-09-12 11:11:48 +00:00
function datenum ( v /*:Date*/ , date1904 /*:?boolean*/ ) /*:number*/ {
2022-03-20 01:54:41 +00:00
var epoch = /*#__PURE__*/ v . getTime ( ) ;
2021-09-12 11:11:48 +00:00
if ( date1904 ) epoch -= 1462 * 24 * 60 * 60 * 1000 ;
2022-03-20 01:54:41 +00:00
var dnthresh = /*#__PURE__*/ basedate . getTime ( ) + ( /*#__PURE__*/ v . getTimezoneOffset ( ) - /*#__PURE__*/ basedate . getTimezoneOffset ( ) ) * 60000 ;
2021-09-12 11:11:48 +00:00
return ( epoch - dnthresh ) / ( 24 * 60 * 60 * 1000 ) ;
}
2022-03-20 01:54:41 +00:00
var refdate = /*#__PURE__*/ new Date ( ) ;
var dnthresh = /*#__PURE__*/ basedate . getTime ( ) + ( /*#__PURE__*/ refdate . getTimezoneOffset ( ) - /*#__PURE__*/ basedate . getTimezoneOffset ( ) ) * 60000 ;
var refoffset = /*#__PURE__*/ refdate . getTimezoneOffset ( ) ;
2021-09-12 11:11:48 +00:00
function numdate ( v /*:number*/ ) /*:Date*/ {
var out = new Date ( ) ;
out . setTime ( v * 24 * 60 * 60 * 1000 + dnthresh ) ;
if ( out . getTimezoneOffset ( ) !== refoffset ) {
out . setTime ( out . getTime ( ) + ( out . getTimezoneOffset ( ) - refoffset ) * 60000 ) ;
}
return out ;
}
/* ISO 8601 Duration */
function parse _isodur ( s ) {
var sec = 0 , mt = 0 , time = false ;
var m = s . match ( /P([0-9\.]+Y)?([0-9\.]+M)?([0-9\.]+D)?T([0-9\.]+H)?([0-9\.]+M)?([0-9\.]+S)?/ ) ;
if ( ! m ) throw new Error ( "|" + s + "| is not an ISO8601 Duration" ) ;
for ( var i = 1 ; i != m . length ; ++ i ) {
if ( ! m [ i ] ) continue ;
mt = 1 ;
if ( i > 3 ) time = true ;
switch ( m [ i ] . slice ( m [ i ] . length - 1 ) ) {
case 'Y' :
throw new Error ( "Unsupported ISO Duration Field: " + m [ i ] . slice ( m [ i ] . length - 1 ) ) ;
case 'D' : mt *= 24 ;
/* falls through */
case 'H' : mt *= 60 ;
/* falls through */
case 'M' :
if ( ! time ) throw new Error ( "Unsupported ISO Duration Field: M" ) ;
else mt *= 60 ;
/* falls through */
case 'S' : break ;
}
sec += mt * parseInt ( m [ i ] , 10 ) ;
}
return sec ;
}
2022-03-20 01:54:41 +00:00
var good _pd _date _1 = /*#__PURE__*/ new Date ( '2017-02-19T19:06:09.000Z' ) ;
var good _pd _date = /*#__PURE__*/ isNaN ( /*#__PURE__*/ good _pd _date _1 . getFullYear ( ) ) ? /*#__PURE__*/ new Date ( '2/19/17' ) : good _pd _date _1 ;
var good _pd = /*#__PURE__*/ good _pd _date . getFullYear ( ) == 2017 ;
2021-09-12 11:11:48 +00:00
/* parses a date as a local date */
function parseDate ( str /*:string|Date*/ , fixdate /*:?number*/ ) /*:Date*/ {
var d = new Date ( str ) ;
if ( good _pd ) {
/*:: if(fixdate == null) fixdate = 0; */
if ( fixdate > 0 ) d . setTime ( d . getTime ( ) + d . getTimezoneOffset ( ) * 60 * 1000 ) ;
else if ( fixdate < 0 ) d . setTime ( d . getTime ( ) - d . getTimezoneOffset ( ) * 60 * 1000 ) ;
return d ;
}
if ( str instanceof Date ) return str ;
if ( good _pd _date . getFullYear ( ) == 1917 && ! isNaN ( d . getFullYear ( ) ) ) {
var s = d . getFullYear ( ) ;
if ( str . indexOf ( "" + s ) > - 1 ) return d ;
d . setFullYear ( d . getFullYear ( ) + 100 ) ; return d ;
}
var n = str . match ( /\d+/g ) || [ "2017" , "2" , "19" , "0" , "0" , "0" ] ;
var out = new Date ( + n [ 0 ] , + n [ 1 ] - 1 , + n [ 2 ] , ( + n [ 3 ] || 0 ) , ( + n [ 4 ] || 0 ) , ( + n [ 5 ] || 0 ) ) ;
if ( str . indexOf ( "Z" ) > - 1 ) out = new Date ( out . getTime ( ) - out . getTimezoneOffset ( ) * 60 * 1000 ) ;
return out ;
}
2022-02-10 12:40:50 +00:00
function cc2str ( arr /*:Array<number>*/ , debomit ) /*:string*/ {
if ( has _buf && Buffer . isBuffer ( arr ) ) {
2022-07-10 04:12:15 +00:00
if ( debomit && buf _utf16le ) {
// TODO: temporary patch
2022-03-20 01:54:41 +00:00
if ( arr [ 0 ] == 0xFF && arr [ 1 ] == 0xFE ) return utf8write ( arr . slice ( 2 ) . toString ( "utf16le" ) ) ;
if ( arr [ 1 ] == 0xFE && arr [ 2 ] == 0xFF ) return utf8write ( utf16beread ( arr . slice ( 2 ) . toString ( "binary" ) ) ) ;
2022-02-10 12:40:50 +00:00
}
return arr . toString ( "binary" ) ;
}
2022-03-20 01:54:41 +00:00
if ( typeof TextDecoder !== "undefined" ) try {
if ( debomit ) {
if ( arr [ 0 ] == 0xFF && arr [ 1 ] == 0xFE ) return utf8write ( new TextDecoder ( "utf-16le" ) . decode ( arr . slice ( 2 ) ) ) ;
if ( arr [ 0 ] == 0xFE && arr [ 1 ] == 0xFF ) return utf8write ( new TextDecoder ( "utf-16be" ) . decode ( arr . slice ( 2 ) ) ) ;
}
var rev = {
"\u20ac" : "\x80" , "\u201a" : "\x82" , "\u0192" : "\x83" , "\u201e" : "\x84" ,
"\u2026" : "\x85" , "\u2020" : "\x86" , "\u2021" : "\x87" , "\u02c6" : "\x88" ,
"\u2030" : "\x89" , "\u0160" : "\x8a" , "\u2039" : "\x8b" , "\u0152" : "\x8c" ,
"\u017d" : "\x8e" , "\u2018" : "\x91" , "\u2019" : "\x92" , "\u201c" : "\x93" ,
"\u201d" : "\x94" , "\u2022" : "\x95" , "\u2013" : "\x96" , "\u2014" : "\x97" ,
"\u02dc" : "\x98" , "\u2122" : "\x99" , "\u0161" : "\x9a" , "\u203a" : "\x9b" ,
"\u0153" : "\x9c" , "\u017e" : "\x9e" , "\u0178" : "\x9f"
} ;
if ( Array . isArray ( arr ) ) arr = new Uint8Array ( arr ) ;
return new TextDecoder ( "latin1" ) . decode ( arr ) . replace ( /[€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ]/g , function ( c ) { return rev [ c ] || c ; } ) ;
} catch ( e ) { }
2022-02-10 12:40:50 +00:00
var o = [ ] ;
for ( var i = 0 ; i != arr . length ; ++ i ) o . push ( String . fromCharCode ( arr [ i ] ) ) ;
return o . join ( "" ) ;
2021-09-12 11:11:48 +00:00
}
function dup ( o /*:any*/ ) /*:any*/ {
if ( typeof JSON != 'undefined' && ! Array . isArray ( o ) ) return JSON . parse ( JSON . stringify ( o ) ) ;
if ( typeof o != 'object' || o == null ) return o ;
if ( o instanceof Date ) return new Date ( o . getTime ( ) ) ;
var out = { } ;
for ( var k in o ) if ( Object . prototype . hasOwnProperty . call ( o , k ) ) out [ k ] = dup ( o [ k ] ) ;
return out ;
}
function fill ( c /*:string*/ , l /*:number*/ ) /*:string*/ { var o = "" ; while ( o . length < l ) o += c ; return o ; }
/* TODO: stress test */
function fuzzynum ( s /*:string*/ ) /*:number*/ {
var v /*:number*/ = Number ( s ) ;
2022-03-16 03:18:09 +00:00
if ( ! isNaN ( v ) ) return isFinite ( v ) ? v : NaN ;
2021-09-12 11:11:48 +00:00
if ( ! /\d/ . test ( s ) ) return v ;
var wt = 1 ;
var ss = s . replace ( /([\d]),([\d])/g , "$1$2" ) . replace ( /[$]/g , "" ) . replace ( /[%]/g , function ( ) { wt *= 100 ; return "" ; } ) ;
if ( ! isNaN ( v = Number ( ss ) ) ) return v / wt ;
ss = ss . replace ( /[(](.*)[)]/ , function ( $$ , $1 ) { wt = - wt ; return $1 ; } ) ;
if ( ! isNaN ( v = Number ( ss ) ) ) return v / wt ;
return v ;
}
2022-05-22 23:51:41 +00:00
/* NOTE: Chrome rejects bare times like 1:23 PM */
2022-08-07 02:50:58 +00:00
var FDRE1 = /^(0?\d|1[0-2])(?:|:([0-5]?\d)(?:|(\.\d+)(?:|:([0-5]?\d))|:([0-5]?\d)(|\.\d+)))\s+([ap])m?$/ ;
2022-05-22 23:51:41 +00:00
function fuzzytime1 ( M ) /*:Date*/ {
2022-08-07 02:50:58 +00:00
/* TODO: 1904 adjustment, keep in sync with base date */
if ( ! M [ 2 ] ) return new Date ( 1899 , 11 , 30 , ( + M [ 1 ] % 12 ) + ( M [ 7 ] == "p" ? 12 : 0 ) , 0 , 0 , 0 ) ;
2022-05-22 23:51:41 +00:00
if ( M [ 3 ] ) {
2022-08-07 02:50:58 +00:00
if ( M [ 4 ] ) return new Date ( 1899 , 11 , 30 , ( + M [ 1 ] % 12 ) + ( M [ 7 ] == "p" ? 12 : 0 ) , + M [ 2 ] , + M [ 4 ] , parseFloat ( M [ 3 ] ) * 1000 ) ;
else return new Date ( 1899 , 11 , 30 , ( M [ 7 ] == "p" ? 12 : 0 ) , + M [ 1 ] , + M [ 2 ] , parseFloat ( M [ 3 ] ) * 1000 ) ;
2022-05-22 23:51:41 +00:00
}
2022-08-07 02:50:58 +00:00
else if ( M [ 5 ] ) return new Date ( 1899 , 11 , 30 , ( + M [ 1 ] % 12 ) + ( M [ 7 ] == "p" ? 12 : 0 ) , + M [ 2 ] , + M [ 5 ] , M [ 6 ] ? parseFloat ( M [ 6 ] ) * 1000 : 0 ) ;
else return new Date ( 1899 , 11 , 30 , ( + M [ 1 ] % 12 ) + ( M [ 7 ] == "p" ? 12 : 0 ) , + M [ 2 ] , 0 , 0 ) ;
2022-05-22 23:51:41 +00:00
}
2022-02-12 06:31:47 +00:00
var lower _months = [ 'january' , 'february' , 'march' , 'april' , 'may' , 'june' , 'july' , 'august' , 'september' , 'october' , 'november' , 'december' ] ;
2021-09-12 11:11:48 +00:00
function fuzzydate ( s /*:string*/ ) /*:Date*/ {
2022-05-22 23:51:41 +00:00
var lower = s . toLowerCase ( ) ;
2022-08-07 02:50:58 +00:00
var lnos = lower . replace ( /\s+/g , " " ) . trim ( ) ;
2022-05-22 23:51:41 +00:00
var M = lnos . match ( FDRE1 ) ;
if ( M ) return fuzzytime1 ( M ) ;
2021-09-12 11:11:48 +00:00
var o = new Date ( s ) , n = new Date ( NaN ) ;
var y = o . getYear ( ) , m = o . getMonth ( ) , d = o . getDate ( ) ;
if ( isNaN ( d ) ) return n ;
2022-02-12 06:31:47 +00:00
if ( lower . match ( /jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec/ ) ) {
lower = lower . replace ( /[^a-z]/g , "" ) . replace ( /([^a-z]|^)[ap]m?([^a-z]|$)/ , "" ) ;
if ( lower . length > 3 && lower _months . indexOf ( lower ) == - 1 ) return n ;
2022-05-22 23:51:41 +00:00
} else if ( lower . replace ( /[ap]m?/ , "" ) . match ( /[a-z]/ ) ) return n ;
2022-06-27 05:47:58 +00:00
if ( y < 0 || y > 8099 || s . match ( /[^-0-9:,\/\\]/ ) ) return n ;
2021-09-12 11:11:48 +00:00
return o ;
}
2022-03-20 01:54:41 +00:00
var split _regex = /*#__PURE__*/ ( function ( ) {
var safe _split _regex = "abacaba" . split ( /(:?b)/i ) . length == 5 ;
return function split _regex ( str /*:string*/ , re , def /*:string*/ ) /*:Array<string>*/ {
if ( safe _split _regex || typeof re == "string" ) return str . split ( re ) ;
var p = str . split ( re ) , o = [ p [ 0 ] ] ;
for ( var i = 1 ; i < p . length ; ++ i ) { o . push ( def ) ; o . push ( p [ i ] ) ; }
return o ;
} ;
} ) ( ) ;
2021-09-12 11:11:48 +00:00
function getdatastr ( data ) /*:?string*/ {
if ( ! data ) return null ;
2022-02-13 09:35:34 +00:00
if ( data . content && data . type ) return cc2str ( data . content , true ) ;
2021-09-12 11:11:48 +00:00
if ( data . data ) return debom ( data . data ) ;
if ( data . asNodeBuffer && has _buf ) return debom ( data . asNodeBuffer ( ) . toString ( 'binary' ) ) ;
if ( data . asBinary ) return debom ( data . asBinary ( ) ) ;
if ( data . _data && data . _data . getContent ) return debom ( cc2str ( Array . prototype . slice . call ( data . _data . getContent ( ) , 0 ) ) ) ;
return null ;
}
function getdatabin ( data ) {
if ( ! data ) return null ;
if ( data . data ) return char _codes ( data . data ) ;
if ( data . asNodeBuffer && has _buf ) return data . asNodeBuffer ( ) ;
if ( data . _data && data . _data . getContent ) {
var o = data . _data . getContent ( ) ;
if ( typeof o == "string" ) return char _codes ( o ) ;
return Array . prototype . slice . call ( o ) ;
}
if ( data . content && data . type ) return data . content ;
return null ;
}
function getdata ( data ) { return ( data && data . name . slice ( - 4 ) === ".bin" ) ? getdatabin ( data ) : getdatastr ( data ) ; }
/* Part 2 Section 10.1.2 "Mapping Content Types" Names are case-insensitive */
/* OASIS does not comment on filename case sensitivity */
function safegetzipfile ( zip , file /*:string*/ ) {
var k = zip . FullPaths || keys ( zip . files ) ;
2021-10-13 07:20:25 +00:00
var f = file . toLowerCase ( ) . replace ( /[\/]/g , '\\' ) , g = f . replace ( /\\/g , '\/' ) ;
2021-09-12 11:11:48 +00:00
for ( var i = 0 ; i < k . length ; ++ i ) {
var n = k [ i ] . replace ( /^Root Entry[\/]/ , "" ) . toLowerCase ( ) ;
2021-10-13 07:20:25 +00:00
if ( f == n || g == n ) return zip . files ? zip . files [ k [ i ] ] : zip . FileIndex [ i ] ;
2021-09-12 11:11:48 +00:00
}
return null ;
}
function getzipfile ( zip , file /*:string*/ ) {
var o = safegetzipfile ( zip , file ) ;
if ( o == null ) throw new Error ( "Cannot find file " + file + " in zip" ) ;
return o ;
}
function getzipdata ( zip , file /*:string*/ , safe /*:?boolean*/ ) /*:any*/ {
if ( ! safe ) return getdata ( getzipfile ( zip , file ) ) ;
if ( ! file ) return null ;
try { return getzipdata ( zip , file ) ; } catch ( e ) { return null ; }
}
function getzipstr ( zip , file /*:string*/ , safe /*:?boolean*/ ) /*:?string*/ {
if ( ! safe ) return getdatastr ( getzipfile ( zip , file ) ) ;
if ( ! file ) return null ;
try { return getzipstr ( zip , file ) ; } catch ( e ) { return null ; }
}
2022-02-13 09:35:34 +00:00
function getzipbin ( zip , file /*:string*/ , safe /*:?boolean*/ ) /*:any*/ {
if ( ! safe ) return getdatabin ( getzipfile ( zip , file ) ) ;
if ( ! file ) return null ;
try { return getzipbin ( zip , file ) ; } catch ( e ) { return null ; }
}
2021-09-12 11:11:48 +00:00
function zipentries ( zip ) {
var k = zip . FullPaths || keys ( zip . files ) , o = [ ] ;
for ( var i = 0 ; i < k . length ; ++ i ) if ( k [ i ] . slice ( - 1 ) != '/' ) o . push ( k [ i ] . replace ( /^Root Entry[\/]/ , "" ) ) ;
return o . sort ( ) ;
}
function zip _add _file ( zip , path , content ) {
2022-02-13 09:35:34 +00:00
if ( zip . FullPaths ) {
if ( typeof content == "string" ) {
var res ;
if ( has _buf ) res = Buffer _from ( content ) ;
/* TODO: investigate performance in Edge 13 */
//else if(typeof TextEncoder !== "undefined") res = new TextEncoder().encode(content);
else res = utf8decode ( content ) ;
return CFB . utils . cfb _add ( zip , path , res ) ;
}
CFB . utils . cfb _add ( zip , path , content ) ;
}
2021-09-12 11:11:48 +00:00
else zip . file ( path , content ) ;
}
2022-02-13 09:35:34 +00:00
function zip _new ( ) { return CFB . utils . cfb _new ( ) ; }
2021-09-12 11:11:48 +00:00
function zip _read ( d , o ) {
switch ( o . type ) {
2022-02-13 09:35:34 +00:00
case "base64" : return CFB . read ( d , { type : "base64" } ) ;
case "binary" : return CFB . read ( d , { type : "binary" } ) ;
case "buffer" : case "array" : return CFB . read ( d , { type : "buffer" } ) ;
2021-09-12 11:11:48 +00:00
}
2022-02-13 09:35:34 +00:00
throw new Error ( "Unrecognized type " + o . type ) ;
2021-09-12 11:11:48 +00:00
}
function resolve _path ( path /*:string*/ , base /*:string*/ ) /*:string*/ {
if ( path . charAt ( 0 ) == "/" ) return path . slice ( 1 ) ;
var result = base . split ( '/' ) ;
if ( base . slice ( - 1 ) != "/" ) result . pop ( ) ; // folder path
var target = path . split ( '/' ) ;
while ( target . length !== 0 ) {
var step = target . shift ( ) ;
if ( step === '..' ) result . pop ( ) ;
else if ( step !== '.' ) result . push ( step ) ;
}
return result . join ( '/' ) ;
}
var XML _HEADER = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\r\n' ;
var attregexg = /([^"\s?>\/]+)\s*=\s*((?:")([^"]*)(?:")|(?:')([^']*)(?:')|([^'">\s]+))/g ;
2022-03-20 01:54:41 +00:00
var tagregex1 = /<[\/\?]?[a-zA-Z0-9:_-]+(?:\s+[^"\s?>\/]+\s*=\s*(?:"[^"]*"|'[^']*'|[^'">\s=]+))*\s*[\/\?]?>/mg , tagregex2 = /<[^>]*>/g ;
var tagregex = /*#__PURE__*/ XML _HEADER . match ( tagregex1 ) ? tagregex1 : tagregex2 ;
2021-09-12 11:11:48 +00:00
var nsregex = /<\w*:/ , nsregex2 = /<(\/?)\w+:/ ;
function parsexmltag ( tag /*:string*/ , skip _root /*:?boolean*/ , skip _LC /*:?boolean*/ ) /*:any*/ {
var z = ( { } /*:any*/ ) ;
var eq = 0 , c = 0 ;
for ( ; eq !== tag . length ; ++ eq ) if ( ( c = tag . charCodeAt ( eq ) ) === 32 || c === 10 || c === 13 ) break ;
if ( ! skip _root ) z [ 0 ] = tag . slice ( 0 , eq ) ;
if ( eq === tag . length ) return z ;
var m = tag . match ( attregexg ) , j = 0 , v = "" , i = 0 , q = "" , cc = "" , quot = 1 ;
if ( m ) for ( i = 0 ; i != m . length ; ++ i ) {
cc = m [ i ] ;
for ( c = 0 ; c != cc . length ; ++ c ) if ( cc . charCodeAt ( c ) === 61 ) break ;
q = cc . slice ( 0 , c ) . trim ( ) ;
while ( cc . charCodeAt ( c + 1 ) == 32 ) ++ c ;
quot = ( ( eq = cc . charCodeAt ( c + 1 ) ) == 34 || eq == 39 ) ? 1 : 0 ;
v = cc . slice ( c + 1 + quot , cc . length - quot ) ;
for ( j = 0 ; j != q . length ; ++ j ) if ( q . charCodeAt ( j ) === 58 ) break ;
if ( j === q . length ) {
if ( q . indexOf ( "_" ) > 0 ) q = q . slice ( 0 , q . indexOf ( "_" ) ) ; // from ods
z [ q ] = v ;
if ( ! skip _LC ) z [ q . toLowerCase ( ) ] = v ;
}
else {
var k = ( j === 5 && q . slice ( 0 , 5 ) === "xmlns" ? "xmlns" : "" ) + q . slice ( j + 1 ) ;
if ( z [ k ] && q . slice ( j - 3 , j ) == "ext" ) continue ; // from ods
z [ k ] = v ;
if ( ! skip _LC ) z [ k . toLowerCase ( ) ] = v ;
}
}
return z ;
}
function strip _ns ( x /*:string*/ ) /*:string*/ { return x . replace ( nsregex2 , "<$1" ) ; }
var encodings = {
'"' : '"' ,
''' : "'" ,
'>' : '>' ,
'<' : '<' ,
'&' : '&'
} ;
2022-03-20 01:54:41 +00:00
var rencoding = /*#__PURE__*/ evert ( encodings ) ;
2021-09-12 11:11:48 +00:00
//var rencstr = "&<>'\"".split("");
// TODO: CP remap (need to read file version to determine OS)
2022-03-12 14:05:57 +00:00
var unescapexml /*:StringConv*/ = /*#__PURE__*/ ( function ( ) {
2021-09-12 11:11:48 +00:00
/* 22.4.2.4 bstr (Basic String) */
var encregex = /&(?:quot|apos|gt|lt|amp|#x?([\da-fA-F]+));/ig , coderegex = /_x([\da-fA-F]{4})_/ig ;
2022-04-25 22:13:46 +00:00
function raw _unescapexml ( text /*:string*/ ) /*:string*/ {
2021-09-12 11:11:48 +00:00
var s = text + '' , i = s . indexOf ( "<![CDATA[" ) ;
if ( i == - 1 ) return s . replace ( encregex , function ( $$ , $1 ) { return encodings [ $$ ] || String . fromCharCode ( parseInt ( $1 , $$ . indexOf ( "x" ) > - 1 ? 16 : 10 ) ) || $$ ; } ) . replace ( coderegex , function ( m , c ) { return String . fromCharCode ( parseInt ( c , 16 ) ) ; } ) ;
var j = s . indexOf ( "]]>" ) ;
2022-04-25 22:13:46 +00:00
return raw _unescapexml ( s . slice ( 0 , i ) ) + s . slice ( i + 9 , j ) + raw _unescapexml ( s . slice ( j + 3 ) ) ;
}
return function unescapexml ( text /*:string*/ , xlsx /*:boolean*/ ) {
var out = raw _unescapexml ( text ) ;
return xlsx ? out . replace ( /\r\n/g , "\n" ) : out ;
2021-09-12 11:11:48 +00:00
} ;
} ) ( ) ;
2022-04-25 22:13:46 +00:00
var decregex = /[&<>'"]/g , charegex = /[\u0000-\u0008\u000b-\u001f\uFFFE-\uFFFF]/g ;
2021-09-12 11:11:48 +00:00
function escapexml ( text /*:string*/ ) /*:string*/ {
var s = text + '' ;
return s . replace ( decregex , function ( y ) { return rencoding [ y ] ; } ) . replace ( charegex , function ( s ) { return "_x" + ( "000" + s . charCodeAt ( 0 ) . toString ( 16 ) ) . slice ( - 4 ) + "_" ; } ) ;
}
function escapexmltag ( text /*:string*/ ) /*:string*/ { return escapexml ( text ) . replace ( / /g , "_x0020_" ) ; }
var htmlcharegex = /[\u0000-\u001f]/g ;
function escapehtml ( text /*:string*/ ) /*:string*/ {
var s = text + '' ;
return s . replace ( decregex , function ( y ) { return rencoding [ y ] ; } ) . replace ( /\n/g , "<br/>" ) . replace ( htmlcharegex , function ( s ) { return "&#x" + ( "000" + s . charCodeAt ( 0 ) . toString ( 16 ) ) . slice ( - 4 ) + ";" ; } ) ;
}
function escapexlml ( text /*:string*/ ) /*:string*/ {
var s = text + '' ;
return s . replace ( decregex , function ( y ) { return rencoding [ y ] ; } ) . replace ( htmlcharegex , function ( s ) { return "&#x" + ( s . charCodeAt ( 0 ) . toString ( 16 ) ) . toUpperCase ( ) + ";" ; } ) ;
}
/* TODO: handle codepages */
2022-03-12 14:05:57 +00:00
var xlml _fixstr /*:StringConv*/ = /*#__PURE__*/ ( function ( ) {
2021-09-12 11:11:48 +00:00
var entregex = /&#(\d+);/g ;
function entrepl ( $$ /*:string*/ , $1 /*:string*/ ) /*:string*/ { return String . fromCharCode ( parseInt ( $1 , 10 ) ) ; }
return function xlml _fixstr ( str /*:string*/ ) /*:string*/ { return str . replace ( entregex , entrepl ) ; } ;
} ) ( ) ;
2022-03-16 03:18:09 +00:00
function xlml _unfixstr ( str /*:string*/ ) /*:string*/ { return str . replace ( /(\r\n|[\r\n])/g , "\ " ) ; }
2021-09-12 11:11:48 +00:00
2022-04-25 22:13:46 +00:00
/* note: xsd:boolean valid values: true / 1 / false / 0 */
2021-09-12 11:11:48 +00:00
function parsexmlbool ( value /*:any*/ ) /*:boolean*/ {
switch ( value ) {
2022-04-25 22:13:46 +00:00
case 1 : case true : case '1' : case 'true' : return true ;
case 0 : case false : case '0' : case 'false' : return false ;
//default: throw new Error("Invalid xsd:boolean " + value);
2021-09-12 11:11:48 +00:00
}
2022-04-25 22:13:46 +00:00
return false ;
2021-09-12 11:11:48 +00:00
}
2022-03-20 01:54:41 +00:00
function utf8reada ( orig /*:string*/ ) /*:string*/ {
2021-09-12 11:11:48 +00:00
var out = "" , i = 0 , c = 0 , d = 0 , e = 0 , f = 0 , w = 0 ;
while ( i < orig . length ) {
c = orig . charCodeAt ( i ++ ) ;
if ( c < 128 ) { out += String . fromCharCode ( c ) ; continue ; }
d = orig . charCodeAt ( i ++ ) ;
if ( c > 191 && c < 224 ) { f = ( ( c & 31 ) << 6 ) ; f |= ( d & 63 ) ; out += String . fromCharCode ( f ) ; continue ; }
e = orig . charCodeAt ( i ++ ) ;
if ( c < 240 ) { out += String . fromCharCode ( ( ( c & 15 ) << 12 ) | ( ( d & 63 ) << 6 ) | ( e & 63 ) ) ; continue ; }
f = orig . charCodeAt ( i ++ ) ;
w = ( ( ( c & 7 ) << 18 ) | ( ( d & 63 ) << 12 ) | ( ( e & 63 ) << 6 ) | ( f & 63 ) ) - 65536 ;
out += String . fromCharCode ( 0xD800 + ( ( w >>> 10 ) & 1023 ) ) ;
out += String . fromCharCode ( 0xDC00 + ( w & 1023 ) ) ;
}
return out ;
2022-03-20 01:54:41 +00:00
}
function utf8readb ( data ) {
var out = new _raw _buf ( 2 * data . length ) , w , i , j = 1 , k = 0 , ww = 0 , c ;
for ( i = 0 ; i < data . length ; i += j ) {
j = 1 ;
if ( ( c = data . charCodeAt ( i ) ) < 128 ) w = c ;
else if ( c < 224 ) { w = ( c & 31 ) * 64 + ( data . charCodeAt ( i + 1 ) & 63 ) ; j = 2 ; }
else if ( c < 240 ) { w = ( c & 15 ) * 4096 + ( data . charCodeAt ( i + 1 ) & 63 ) * 64 + ( data . charCodeAt ( i + 2 ) & 63 ) ; j = 3 ; }
else { j = 4 ;
w = ( c & 7 ) * 262144 + ( data . charCodeAt ( i + 1 ) & 63 ) * 4096 + ( data . charCodeAt ( i + 2 ) & 63 ) * 64 + ( data . charCodeAt ( i + 3 ) & 63 ) ;
w -= 65536 ; ww = 0xD800 + ( ( w >>> 10 ) & 1023 ) ; w = 0xDC00 + ( w & 1023 ) ;
}
if ( ww !== 0 ) { out [ k ++ ] = ww & 255 ; out [ k ++ ] = ww >>> 8 ; ww = 0 ; }
out [ k ++ ] = w % 256 ; out [ k ++ ] = w >>> 8 ;
}
return out . slice ( 0 , k ) . toString ( 'ucs2' ) ;
}
function utf8readc ( data ) { return Buffer _from ( data , 'binary' ) . toString ( 'utf8' ) ; }
2021-09-12 11:11:48 +00:00
2022-03-20 01:54:41 +00:00
var utf8corpus = "foo bar baz\u00e2\u0098\u0083\u00f0\u009f\u008d\u00a3" ;
var utf8read = has _buf && ( /*#__PURE__*/ utf8readc ( utf8corpus ) == /*#__PURE__*/ utf8reada ( utf8corpus ) && utf8readc || /*#__PURE__*/ utf8readb ( utf8corpus ) == /*#__PURE__*/ utf8reada ( utf8corpus ) && utf8readb ) || utf8reada ;
var utf8write /*:StringConv*/ = has _buf ? function ( data ) { return Buffer _from ( data , 'utf8' ) . toString ( "binary" ) ; } : function ( orig /*:string*/ ) /*:string*/ {
2021-09-12 11:11:48 +00:00
var out /*:Array<string>*/ = [ ] , i = 0 , c = 0 , d = 0 ;
while ( i < orig . length ) {
c = orig . charCodeAt ( i ++ ) ;
switch ( true ) {
case c < 128 : out . push ( String . fromCharCode ( c ) ) ; break ;
case c < 2048 :
out . push ( String . fromCharCode ( 192 + ( c >> 6 ) ) ) ;
out . push ( String . fromCharCode ( 128 + ( c & 63 ) ) ) ;
break ;
case c >= 55296 && c < 57344 :
c -= 55296 ; d = orig . charCodeAt ( i ++ ) - 56320 + ( c << 10 ) ;
out . push ( String . fromCharCode ( 240 + ( ( d >> 18 ) & 7 ) ) ) ;
out . push ( String . fromCharCode ( 144 + ( ( d >> 12 ) & 63 ) ) ) ;
out . push ( String . fromCharCode ( 128 + ( ( d >> 6 ) & 63 ) ) ) ;
out . push ( String . fromCharCode ( 128 + ( d & 63 ) ) ) ;
break ;
default :
out . push ( String . fromCharCode ( 224 + ( c >> 12 ) ) ) ;
out . push ( String . fromCharCode ( 128 + ( ( c >> 6 ) & 63 ) ) ) ;
out . push ( String . fromCharCode ( 128 + ( c & 63 ) ) ) ;
}
}
return out . join ( "" ) ;
} ;
// matches <foo>...</foo> extracts content
2022-03-12 14:05:57 +00:00
var matchtag = /*#__PURE__*/ ( function ( ) {
2021-09-12 11:11:48 +00:00
var mtcache /*:{[k:string]:RegExp}*/ = ( { } /*:any*/ ) ;
return function matchtag ( f /*:string*/ , g /*:?string*/ ) /*:RegExp*/ {
var t = f + "|" + ( g || "" ) ;
if ( mtcache [ t ] ) return mtcache [ t ] ;
return ( mtcache [ t ] = new RegExp ( '<(?:\\w+:)?' + f + '(?: xml:space="preserve")?(?:[^>]*)>([\\s\\S]*?)</(?:\\w+:)?' + f + '>' , ( ( g || "" ) /*:any*/ ) ) ) ;
} ;
} ) ( ) ;
2022-03-12 14:05:57 +00:00
var htmldecode /*:{(s:string):string}*/ = /*#__PURE__*/ ( function ( ) {
2021-09-12 11:11:48 +00:00
var entities /*:Array<[RegExp, string]>*/ = [
[ 'nbsp' , ' ' ] , [ 'middot' , '·' ] ,
[ 'quot' , '"' ] , [ 'apos' , "'" ] , [ 'gt' , '>' ] , [ 'lt' , '<' ] , [ 'amp' , '&' ]
] . map ( function ( x /*:[string, string]*/ ) { return [ new RegExp ( '&' + x [ 0 ] + ';' , "ig" ) , x [ 1 ] ] ; } ) ;
return function htmldecode ( str /*:string*/ ) /*:string*/ {
var o = str
// Remove new lines and spaces from start of content
. replace ( /^[\t\n\r ]+/ , "" )
// Remove new lines and spaces from end of content
. replace ( /[\t\n\r ]+$/ , "" )
// Added line which removes any white space characters after and before html tags
. replace ( />\s+/g , ">" ) . replace ( /\s+</g , "<" )
// Replace remaining new lines and spaces with space
. replace ( /[\t\n\r ]+/g , " " )
// Replace <br> tags with new lines
. replace ( /<\s*[bB][rR]\s*\/?>/g , "\n" )
// Strip HTML elements
. replace ( /<[^>]*>/g , "" ) ;
for ( var i = 0 ; i < entities . length ; ++ i ) o = o . replace ( entities [ i ] [ 0 ] , entities [ i ] [ 1 ] ) ;
return o ;
} ;
} ) ( ) ;
2022-03-12 14:05:57 +00:00
var vtregex = /*#__PURE__*/ ( function ( ) { var vt _cache = { } ;
2021-09-12 11:11:48 +00:00
return function vt _regex ( bt ) {
if ( vt _cache [ bt ] !== undefined ) return vt _cache [ bt ] ;
return ( vt _cache [ bt ] = new RegExp ( "<(?:vt:)?" + bt + ">([\\s\\S]*?)</(?:vt:)?" + bt + ">" , 'g' ) ) ;
} ; } ) ( ) ;
var vtvregex = /<\/?(?:vt:)?variant>/g , vtmregex = /<(?:vt:)([^>]*)>([\s\S]*)</ ;
function parseVector ( data /*:string*/ , opts ) /*:Array<{v:string,t:string}>*/ {
var h = parsexmltag ( data ) ;
var matches /*:Array<string>*/ = data . match ( vtregex ( h . baseType ) ) || [ ] ;
var res /*:Array<any>*/ = [ ] ;
if ( matches . length != h . size ) {
if ( opts . WTF ) throw new Error ( "unexpected vector length " + matches . length + " != " + h . size ) ;
return res ;
}
matches . forEach ( function ( x /*:string*/ ) {
var v = x . replace ( vtvregex , "" ) . match ( vtmregex ) ;
if ( v ) res . push ( { v : utf8read ( v [ 2 ] ) , t : v [ 1 ] } ) ;
} ) ;
return res ;
}
var wtregex = /(^\s|\s$|\n)/ ;
function writetag ( f /*:string*/ , g /*:string*/ ) /*:string*/ { return '<' + f + ( g . match ( wtregex ) ? ' xml:space="preserve"' : "" ) + '>' + g + '</' + f + '>' ; }
function wxt _helper ( h ) /*:string*/ { return keys ( h ) . map ( function ( k ) { return " " + k + '="' + h [ k ] + '"' ; } ) . join ( "" ) ; }
function writextag ( f /*:string*/ , g /*:?string*/ , h ) { return '<' + f + ( ( h != null ) ? wxt _helper ( h ) : "" ) + ( ( g != null ) ? ( g . match ( wtregex ) ? ' xml:space="preserve"' : "" ) + '>' + g + '</' + f : "/" ) + '>' ; }
function write _w3cdtf ( d /*:Date*/ , t /*:?boolean*/ ) /*:string*/ { try { return d . toISOString ( ) . replace ( /\.\d*/ , "" ) ; } catch ( e ) { if ( t ) throw e ; } return "" ; }
function write _vt ( s , xlsx /*:?boolean*/ ) /*:string*/ {
switch ( typeof s ) {
case 'string' :
var o = writextag ( 'vt:lpwstr' , escapexml ( s ) ) ;
if ( xlsx ) o = o . replace ( /"/g , "_x0022_" ) ;
return o ;
case 'number' : return writextag ( ( s | 0 ) == s ? 'vt:i4' : 'vt:r8' , escapexml ( String ( s ) ) ) ;
case 'boolean' : return writextag ( 'vt:bool' , s ? 'true' : 'false' ) ;
}
if ( s instanceof Date ) return writextag ( 'vt:filetime' , write _w3cdtf ( s ) ) ;
throw new Error ( "Unable to serialize " + s ) ;
}
2022-03-09 01:44:10 +00:00
function xlml _normalize ( d ) /*:string*/ {
if ( has _buf && /*::typeof Buffer !== "undefined" && d != null && d instanceof Buffer &&*/ Buffer . isBuffer ( d ) ) return d . toString ( 'utf8' ) ;
if ( typeof d === 'string' ) return d ;
/* duktape */
if ( typeof Uint8Array !== 'undefined' && d instanceof Uint8Array ) return utf8read ( a2s ( ab2a ( d ) ) ) ;
throw new Error ( "Bad input format: expected Buffer or string" ) ;
}
/* UOS uses CJK in tags */
2022-06-27 05:47:58 +00:00
var xlmlregex = /<(\/?)([^\s?><!\/:]*:|)([^\s?<>:\/]+)(?:[\s?:\/](?:[^>=]|="[^"]*?")*)?>/mg ;
2022-03-09 01:44:10 +00:00
//var xlmlregex = /<(\/?)([a-z0-9]*:|)(\w+)[^>]*>/mg;
2021-09-12 11:11:48 +00:00
var XMLNS = ( {
2022-03-12 14:05:57 +00:00
CORE _PROPS : 'http://schemas.openxmlformats.org/package/2006/metadata/core-properties' ,
CUST _PROPS : "http://schemas.openxmlformats.org/officeDocument/2006/custom-properties" ,
EXT _PROPS : "http://schemas.openxmlformats.org/officeDocument/2006/extended-properties" ,
CT : 'http://schemas.openxmlformats.org/package/2006/content-types' ,
RELS : 'http://schemas.openxmlformats.org/package/2006/relationships' ,
2022-03-16 03:18:09 +00:00
TCMNT : 'http://schemas.microsoft.com/office/spreadsheetml/2018/threadedcomments' ,
2021-09-12 11:11:48 +00:00
'dc' : 'http://purl.org/dc/elements/1.1/' ,
'dcterms' : 'http://purl.org/dc/terms/' ,
'dcmitype' : 'http://purl.org/dc/dcmitype/' ,
'mx' : 'http://schemas.microsoft.com/office/mac/excel/2008/main' ,
'r' : 'http://schemas.openxmlformats.org/officeDocument/2006/relationships' ,
'sjs' : 'http://schemas.openxmlformats.org/package/2006/sheetjs/core-properties' ,
'vt' : 'http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes' ,
'xsi' : 'http://www.w3.org/2001/XMLSchema-instance' ,
'xsd' : 'http://www.w3.org/2001/XMLSchema'
} /*:any*/ ) ;
2022-03-12 14:05:57 +00:00
var XMLNS _main = [
2021-09-12 11:11:48 +00:00
'http://schemas.openxmlformats.org/spreadsheetml/2006/main' ,
'http://purl.oclc.org/ooxml/spreadsheetml/main' ,
'http://schemas.microsoft.com/office/excel/2006/main' ,
'http://schemas.microsoft.com/office/excel/2006/2'
] ;
var XLMLNS = ( {
'o' : 'urn:schemas-microsoft-com:office:office' ,
'x' : 'urn:schemas-microsoft-com:office:excel' ,
'ss' : 'urn:schemas-microsoft-com:office:spreadsheet' ,
'dt' : 'uuid:C2F41010-65B3-11d1-A29F-00AA00C14882' ,
'mv' : 'http://macVmlSchemaUri' ,
'v' : 'urn:schemas-microsoft-com:vml' ,
'html' : 'http://www.w3.org/TR/REC-html40'
} /*:any*/ ) ;
function read _double _le ( b /*:RawBytes|CFBlob*/ , idx /*:number*/ ) /*:number*/ {
var s = 1 - 2 * ( b [ idx + 7 ] >>> 7 ) ;
var e = ( ( b [ idx + 7 ] & 0x7f ) << 4 ) + ( ( b [ idx + 6 ] >>> 4 ) & 0x0f ) ;
var m = ( b [ idx + 6 ] & 0x0f ) ;
for ( var i = 5 ; i >= 0 ; -- i ) m = m * 256 + b [ idx + i ] ;
if ( e == 0x7ff ) return m == 0 ? ( s * Infinity ) : NaN ;
if ( e == 0 ) e = - 1022 ;
else { e -= 1023 ; m += Math . pow ( 2 , 52 ) ; }
return s * Math . pow ( 2 , e - 52 ) * m ;
}
function write _double _le ( b /*:RawBytes|CFBlob*/ , v /*:number*/ , idx /*:number*/ ) {
var bs = ( ( ( ( v < 0 ) || ( 1 / v == - Infinity ) ) ? 1 : 0 ) << 7 ) , e = 0 , m = 0 ;
var av = bs ? ( - v ) : v ;
if ( ! isFinite ( av ) ) { e = 0x7ff ; m = isNaN ( v ) ? 0x6969 : 0 ; }
else if ( av == 0 ) e = m = 0 ;
else {
e = Math . floor ( Math . log ( av ) / Math . LN2 ) ;
m = av * Math . pow ( 2 , 52 - e ) ;
if ( ( e <= - 1023 ) && ( ! isFinite ( m ) || ( m < Math . pow ( 2 , 52 ) ) ) ) { e = - 1022 ; }
else { m -= Math . pow ( 2 , 52 ) ; e += 1023 ; }
}
for ( var i = 0 ; i <= 5 ; ++ i , m /= 256 ) b [ idx + i ] = m & 0xff ;
b [ idx + 6 ] = ( ( e & 0x0f ) << 4 ) | ( m & 0xf ) ;
b [ idx + 7 ] = ( e >> 4 ) | bs ;
}
2022-03-20 01:54:41 +00:00
var _ _ _toBuffer = function ( bufs /*:Array<Array<RawBytes> >*/ ) /*:RawBytes*/ { var x = [ ] , w = 10240 ; for ( var i = 0 ; i < bufs [ 0 ] . length ; ++ i ) if ( bufs [ 0 ] [ i ] ) for ( var j = 0 , L = bufs [ 0 ] [ i ] . length ; j < L ; j += w ) x . push . apply ( x , bufs [ 0 ] [ i ] . slice ( j , j + w ) ) ; return x ; } ;
var _ _toBuffer = has _buf ? function ( bufs ) { return ( bufs [ 0 ] . length > 0 && Buffer . isBuffer ( bufs [ 0 ] [ 0 ] ) ) ? Buffer . concat ( bufs [ 0 ] . map ( function ( x ) { return Buffer . isBuffer ( x ) ? x : Buffer _from ( x ) ; } ) ) : _ _ _toBuffer ( bufs ) ; } : _ _ _toBuffer ;
var _ _ _utf16le = function ( b /*:RawBytes|CFBlob*/ , s /*:number*/ , e /*:number*/ ) /*:string*/ { var ss /*:Array<string>*/ = [ ] ; for ( var i = s ; i < e ; i += 2 ) ss . push ( String . fromCharCode ( _ _readUInt16LE ( b , i ) ) ) ; return ss . join ( "" ) . replace ( chr0 , '' ) ; } ;
2022-07-10 04:12:15 +00:00
var _ _utf16le = has _buf ? function ( b /*:RawBytes|CFBlob*/ , s /*:number*/ , e /*:number*/ ) /*:string*/ { if ( ! Buffer . isBuffer ( b ) /*:: || !(b instanceof Buffer)*/ || ! buf _utf16le ) return _ _ _utf16le ( b , s , e ) ; return b . toString ( 'utf16le' , s , e ) . replace ( chr0 , '' ) /*.replace(chr1,'!')*/ ; } : _ _ _utf16le ;
2022-03-20 01:54:41 +00:00
var _ _ _hexlify = function ( b /*:RawBytes|CFBlob*/ , s /*:number*/ , l /*:number*/ ) /*:string*/ { var ss /*:Array<string>*/ = [ ] ; for ( var i = s ; i < s + l ; ++ i ) ss . push ( ( "0" + b [ i ] . toString ( 16 ) ) . slice ( - 2 ) ) ; return ss . join ( "" ) ; } ;
var _ _hexlify = has _buf ? function ( b /*:RawBytes|CFBlob*/ , s /*:number*/ , l /*:number*/ ) /*:string*/ { return Buffer . isBuffer ( b ) /*:: && b instanceof Buffer*/ ? b . toString ( 'hex' , s , s + l ) : _ _ _hexlify ( b , s , l ) ; } : _ _ _hexlify ;
var _ _ _utf8 = function ( b /*:RawBytes|CFBlob*/ , s /*:number*/ , e /*:number*/ ) { var ss = [ ] ; for ( var i = s ; i < e ; i ++ ) ss . push ( String . fromCharCode ( _ _readUInt8 ( b , i ) ) ) ; return ss . join ( "" ) ; } ;
var _ _utf8 = has _buf ? function utf8 _b ( b /*:RawBytes|CFBlob*/ , s /*:number*/ , e /*:number*/ ) { return ( Buffer . isBuffer ( b ) /*:: && (b instanceof Buffer)*/ ) ? b . toString ( 'utf8' , s , e ) : _ _ _utf8 ( b , s , e ) ; } : _ _ _utf8 ;
var _ _ _lpstr = function ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { var len = _ _readUInt32LE ( b , i ) ; return len > 0 ? _ _utf8 ( b , i + 4 , i + 4 + len - 1 ) : "" ; } ;
var _ _lpstr = _ _ _lpstr ;
var _ _ _cpstr = function ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { var len = _ _readUInt32LE ( b , i ) ; return len > 0 ? _ _utf8 ( b , i + 4 , i + 4 + len - 1 ) : "" ; } ;
var _ _cpstr = _ _ _cpstr ;
var _ _ _lpwstr = function ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { var len = 2 * _ _readUInt32LE ( b , i ) ; return len > 0 ? _ _utf8 ( b , i + 4 , i + 4 + len - 1 ) : "" ; } ;
var _ _lpwstr = _ _ _lpwstr ;
var _ _ _lpp4 = function lpp4 _ ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { var len = _ _readUInt32LE ( b , i ) ; return len > 0 ? _ _utf16le ( b , i + 4 , i + 4 + len ) : "" ; } ;
var _ _lpp4 = _ _ _lpp4 ;
var _ _ _8lpp4 = function ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { var len = _ _readUInt32LE ( b , i ) ; return len > 0 ? _ _utf8 ( b , i + 4 , i + 4 + len ) : "" ; } ;
var _ _8lpp4 = _ _ _8lpp4 ;
var _ _ _double = function ( b /*:RawBytes|CFBlob*/ , idx /*:number*/ ) { return read _double _le ( b , idx ) ; } ;
var _ _double = _ _ _double ;
2022-02-10 12:40:50 +00:00
var is _buf = function is _buf _a ( a ) { return Array . isArray ( a ) || ( typeof Uint8Array !== "undefined" && a instanceof Uint8Array ) ; } ;
2021-09-12 11:11:48 +00:00
if ( has _buf /*:: && typeof Buffer !== 'undefined'*/ ) {
_ _lpstr = function lpstr _b ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { if ( ! Buffer . isBuffer ( b ) /*:: || !(b instanceof Buffer)*/ ) return _ _ _lpstr ( b , i ) ; var len = b . readUInt32LE ( i ) ; return len > 0 ? b . toString ( 'utf8' , i + 4 , i + 4 + len - 1 ) : "" ; } ;
_ _cpstr = function cpstr _b ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { if ( ! Buffer . isBuffer ( b ) /*:: || !(b instanceof Buffer)*/ ) return _ _ _cpstr ( b , i ) ; var len = b . readUInt32LE ( i ) ; return len > 0 ? b . toString ( 'utf8' , i + 4 , i + 4 + len - 1 ) : "" ; } ;
2022-07-10 04:12:15 +00:00
_ _lpwstr = function lpwstr _b ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { if ( ! Buffer . isBuffer ( b ) /*:: || !(b instanceof Buffer)*/ || ! buf _utf16le ) return _ _ _lpwstr ( b , i ) ; var len = 2 * b . readUInt32LE ( i ) ; return b . toString ( 'utf16le' , i + 4 , i + 4 + len - 1 ) ; } ;
_ _lpp4 = function lpp4 _b ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { if ( ! Buffer . isBuffer ( b ) /*:: || !(b instanceof Buffer)*/ || ! buf _utf16le ) return _ _ _lpp4 ( b , i ) ; var len = b . readUInt32LE ( i ) ; return b . toString ( 'utf16le' , i + 4 , i + 4 + len ) ; } ;
2021-09-12 11:11:48 +00:00
_ _8lpp4 = function lpp4 _8b ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { if ( ! Buffer . isBuffer ( b ) /*:: || !(b instanceof Buffer)*/ ) return _ _ _8lpp4 ( b , i ) ; var len = b . readUInt32LE ( i ) ; return b . toString ( 'utf8' , i + 4 , i + 4 + len ) ; } ;
_ _double = function double _ ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { if ( Buffer . isBuffer ( b ) /*::&& b instanceof Buffer*/ ) return b . readDoubleLE ( i ) ; return _ _ _double ( b , i ) ; } ;
2022-02-10 12:40:50 +00:00
is _buf = function is _buf _b ( a ) { return Buffer . isBuffer ( a ) || Array . isArray ( a ) || ( typeof Uint8Array !== "undefined" && a instanceof Uint8Array ) ; } ;
2021-09-12 11:11:48 +00:00
}
/* from js-xls */
2022-02-13 09:35:34 +00:00
function cpdoit ( ) {
2022-03-11 05:29:05 +00:00
_ _utf16le = function ( b /*:RawBytes|CFBlob*/ , s /*:number*/ , e /*:number*/ ) { return $cptable . utils . decode ( 1200 , b . slice ( s , e ) ) . replace ( chr0 , '' ) ; } ;
_ _utf8 = function ( b /*:RawBytes|CFBlob*/ , s /*:number*/ , e /*:number*/ ) { return $cptable . utils . decode ( 65001 , b . slice ( s , e ) ) ; } ;
_ _lpstr = function ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { var len = _ _readUInt32LE ( b , i ) ; return len > 0 ? $cptable . utils . decode ( current _ansi , b . slice ( i + 4 , i + 4 + len - 1 ) ) : "" ; } ;
_ _cpstr = function ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { var len = _ _readUInt32LE ( b , i ) ; return len > 0 ? $cptable . utils . decode ( current _codepage , b . slice ( i + 4 , i + 4 + len - 1 ) ) : "" ; } ;
_ _lpwstr = function ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { var len = 2 * _ _readUInt32LE ( b , i ) ; return len > 0 ? $cptable . utils . decode ( 1200 , b . slice ( i + 4 , i + 4 + len - 1 ) ) : "" ; } ;
_ _lpp4 = function ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { var len = _ _readUInt32LE ( b , i ) ; return len > 0 ? $cptable . utils . decode ( 1200 , b . slice ( i + 4 , i + 4 + len ) ) : "" ; } ;
_ _8lpp4 = function ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { var len = _ _readUInt32LE ( b , i ) ; return len > 0 ? $cptable . utils . decode ( 65001 , b . slice ( i + 4 , i + 4 + len ) ) : "" ; } ;
2021-09-12 11:11:48 +00:00
}
2022-03-11 05:29:05 +00:00
if ( typeof $cptable !== 'undefined' ) cpdoit ( ) ;
2021-09-12 11:11:48 +00:00
var _ _readUInt8 = function ( b /*:RawBytes|CFBlob*/ , idx /*:number*/ ) /*:number*/ { return b [ idx ] ; } ;
var _ _readUInt16LE = function ( b /*:RawBytes|CFBlob*/ , idx /*:number*/ ) /*:number*/ { return ( b [ idx + 1 ] * ( 1 << 8 ) ) + b [ idx ] ; } ;
var _ _readInt16LE = function ( b /*:RawBytes|CFBlob*/ , idx /*:number*/ ) /*:number*/ { var u = ( b [ idx + 1 ] * ( 1 << 8 ) ) + b [ idx ] ; return ( u < 0x8000 ) ? u : ( ( 0xffff - u + 1 ) * - 1 ) ; } ;
var _ _readUInt32LE = function ( b /*:RawBytes|CFBlob*/ , idx /*:number*/ ) /*:number*/ { return b [ idx + 3 ] * ( 1 << 24 ) + ( b [ idx + 2 ] << 16 ) + ( b [ idx + 1 ] << 8 ) + b [ idx ] ; } ;
var _ _readInt32LE = function ( b /*:RawBytes|CFBlob*/ , idx /*:number*/ ) /*:number*/ { return ( b [ idx + 3 ] << 24 ) | ( b [ idx + 2 ] << 16 ) | ( b [ idx + 1 ] << 8 ) | b [ idx ] ; } ;
var _ _readInt32BE = function ( b /*:RawBytes|CFBlob*/ , idx /*:number*/ ) /*:number*/ { return ( b [ idx ] << 24 ) | ( b [ idx + 1 ] << 16 ) | ( b [ idx + 2 ] << 8 ) | b [ idx + 3 ] ; } ;
function ReadShift ( size /*:number*/ , t /*:?string*/ ) /*:number|string*/ {
var o = "" , oI /*:: :number = 0*/ , oR , oo = [ ] , w , vv , i , loc ;
switch ( t ) {
case 'dbcs' :
loc = this . l ;
2022-07-10 04:12:15 +00:00
if ( has _buf && Buffer . isBuffer ( this ) && buf _utf16le ) o = this . slice ( this . l , this . l + 2 * size ) . toString ( "utf16le" ) ;
2021-09-12 11:11:48 +00:00
else for ( i = 0 ; i < size ; ++ i ) { o += String . fromCharCode ( _ _readUInt16LE ( this , loc ) ) ; loc += 2 ; }
size *= 2 ;
break ;
case 'utf8' : o = _ _utf8 ( this , this . l , this . l + size ) ; break ;
case 'utf16le' : size *= 2 ; o = _ _utf16le ( this , this . l , this . l + size ) ; break ;
case 'wstr' :
2022-03-11 05:29:05 +00:00
if ( typeof $cptable !== 'undefined' ) o = $cptable . utils . decode ( current _codepage , this . slice ( this . l , this . l + 2 * size ) ) ;
2021-09-12 11:11:48 +00:00
else return ReadShift . call ( this , size , 'dbcs' ) ;
size = 2 * size ; break ;
/* [MS-OLEDS] 2.1.4 LengthPrefixedAnsiString */
case 'lpstr-ansi' : o = _ _lpstr ( this , this . l ) ; size = 4 + _ _readUInt32LE ( this , this . l ) ; break ;
case 'lpstr-cp' : o = _ _cpstr ( this , this . l ) ; size = 4 + _ _readUInt32LE ( this , this . l ) ; break ;
/* [MS-OLEDS] 2.1.5 LengthPrefixedUnicodeString */
case 'lpwstr' : o = _ _lpwstr ( this , this . l ) ; size = 4 + 2 * _ _readUInt32LE ( this , this . l ) ; break ;
/* [MS-OFFCRYPTO] 2.1.2 Length-Prefixed Padded Unicode String (UNICODE-LP-P4) */
case 'lpp4' : size = 4 + _ _readUInt32LE ( this , this . l ) ; o = _ _lpp4 ( this , this . l ) ; if ( size & 0x02 ) size += 2 ; break ;
/* [MS-OFFCRYPTO] 2.1.3 Length-Prefixed UTF-8 String (UTF-8-LP-P4) */
case '8lpp4' : size = 4 + _ _readUInt32LE ( this , this . l ) ; o = _ _8lpp4 ( this , this . l ) ; if ( size & 0x03 ) size += 4 - ( size & 0x03 ) ; break ;
case 'cstr' : size = 0 ; o = "" ;
while ( ( w = _ _readUInt8 ( this , this . l + size ++ ) ) !== 0 ) oo . push ( _getchar ( w ) ) ;
o = oo . join ( "" ) ; break ;
case '_wstr' : size = 0 ; o = "" ;
while ( ( w = _ _readUInt16LE ( this , this . l + size ) ) !== 0 ) { oo . push ( _getchar ( w ) ) ; size += 2 ; }
size += 2 ; o = oo . join ( "" ) ; break ;
/* sbcs and dbcs support continue records in the SST way TODO codepages */
case 'dbcs-cont' : o = "" ; loc = this . l ;
for ( i = 0 ; i < size ; ++ i ) {
if ( this . lens && this . lens . indexOf ( loc ) !== - 1 ) {
w = _ _readUInt8 ( this , loc ) ;
this . l = loc + 1 ;
vv = ReadShift . call ( this , size - i , w ? 'dbcs-cont' : 'sbcs-cont' ) ;
return oo . join ( "" ) + vv ;
}
oo . push ( _getchar ( _ _readUInt16LE ( this , loc ) ) ) ;
loc += 2 ;
} o = oo . join ( "" ) ; size *= 2 ; break ;
case 'cpstr' :
2022-03-11 05:29:05 +00:00
if ( typeof $cptable !== 'undefined' ) {
o = $cptable . utils . decode ( current _codepage , this . slice ( this . l , this . l + size ) ) ;
2021-09-12 11:11:48 +00:00
break ;
}
/* falls through */
case 'sbcs-cont' : o = "" ; loc = this . l ;
for ( i = 0 ; i != size ; ++ i ) {
if ( this . lens && this . lens . indexOf ( loc ) !== - 1 ) {
w = _ _readUInt8 ( this , loc ) ;
this . l = loc + 1 ;
vv = ReadShift . call ( this , size - i , w ? 'dbcs-cont' : 'sbcs-cont' ) ;
return oo . join ( "" ) + vv ;
}
oo . push ( _getchar ( _ _readUInt8 ( this , loc ) ) ) ;
loc += 1 ;
} o = oo . join ( "" ) ; break ;
default :
switch ( size ) {
case 1 : oI = _ _readUInt8 ( this , this . l ) ; this . l ++ ; return oI ;
case 2 : oI = ( t === 'i' ? _ _readInt16LE : _ _readUInt16LE ) ( this , this . l ) ; this . l += 2 ; return oI ;
case 4 : case - 4 :
if ( t === 'i' || ( ( this [ this . l + 3 ] & 0x80 ) === 0 ) ) { oI = ( ( size > 0 ) ? _ _readInt32LE : _ _readInt32BE ) ( this , this . l ) ; this . l += 4 ; return oI ; }
else { oR = _ _readUInt32LE ( this , this . l ) ; this . l += 4 ; } return oR ;
case 8 : case - 8 :
if ( t === 'f' ) {
if ( size == 8 ) oR = _ _double ( this , this . l ) ;
else oR = _ _double ( [ this [ this . l + 7 ] , this [ this . l + 6 ] , this [ this . l + 5 ] , this [ this . l + 4 ] , this [ this . l + 3 ] , this [ this . l + 2 ] , this [ this . l + 1 ] , this [ this . l + 0 ] ] , 0 ) ;
this . l += 8 ; return oR ;
} else size = 8 ;
/* falls through */
case 16 : o = _ _hexlify ( this , this . l , size ) ; break ;
} }
this . l += size ; return o ;
}
var _ _writeUInt32LE = function ( b /*:RawBytes|CFBlob*/ , val /*:number*/ , idx /*:number*/ ) /*:void*/ { b [ idx ] = ( val & 0xFF ) ; b [ idx + 1 ] = ( ( val >>> 8 ) & 0xFF ) ; b [ idx + 2 ] = ( ( val >>> 16 ) & 0xFF ) ; b [ idx + 3 ] = ( ( val >>> 24 ) & 0xFF ) ; } ;
var _ _writeInt32LE = function ( b /*:RawBytes|CFBlob*/ , val /*:number*/ , idx /*:number*/ ) /*:void*/ { b [ idx ] = ( val & 0xFF ) ; b [ idx + 1 ] = ( ( val >> 8 ) & 0xFF ) ; b [ idx + 2 ] = ( ( val >> 16 ) & 0xFF ) ; b [ idx + 3 ] = ( ( val >> 24 ) & 0xFF ) ; } ;
var _ _writeUInt16LE = function ( b /*:RawBytes|CFBlob*/ , val /*:number*/ , idx /*:number*/ ) /*:void*/ { b [ idx ] = ( val & 0xFF ) ; b [ idx + 1 ] = ( ( val >>> 8 ) & 0xFF ) ; } ;
function WriteShift ( t /*:number*/ , val /*:string|number*/ , f /*:?string*/ ) /*:any*/ {
var size = 0 , i = 0 ;
if ( f === 'dbcs' ) {
/*:: if(typeof val !== 'string') throw new Error("unreachable"); */
for ( i = 0 ; i != val . length ; ++ i ) _ _writeUInt16LE ( this , val . charCodeAt ( i ) , this . l + 2 * i ) ;
size = 2 * val . length ;
2022-09-06 06:18:12 +00:00
} else if ( f === 'sbcs' || f == 'cpstr' ) {
2022-03-11 05:29:05 +00:00
if ( typeof $cptable !== 'undefined' && current _ansi == 874 ) {
2021-09-12 11:11:48 +00:00
/* TODO: use tables directly, don't encode */
/*:: if(typeof val !== "string") throw new Error("unreachable"); */
for ( i = 0 ; i != val . length ; ++ i ) {
2022-09-06 06:18:12 +00:00
var cpp = $cptable . utils . encode ( current _ansi , val . charAt ( i ) ) ;
this [ this . l + i ] = cpp [ 0 ] ;
2021-09-12 11:11:48 +00:00
}
2022-09-06 06:18:12 +00:00
size = val . length ;
} else if ( typeof $cptable !== 'undefined' && f == 'cpstr' ) {
2022-09-09 20:59:22 +00:00
cpp = $cptable . utils . encode ( current _codepage , val ) ;
2022-09-06 06:18:12 +00:00
/* replace null bytes with _ when relevant */
if ( cpp . length == val . length ) for ( i = 0 ; i < val . length ; ++ i ) if ( cpp [ i ] == 0 && val . charCodeAt ( i ) != 0 ) cpp [ i ] = 0x5F ;
if ( cpp . length == 2 * val . length ) for ( i = 0 ; i < val . length ; ++ i ) if ( cpp [ 2 * i ] == 0 && cpp [ 2 * i + 1 ] == 0 && val . charCodeAt ( i ) != 0 ) cpp [ 2 * i ] = 0x5F ;
for ( i = 0 ; i < cpp . length ; ++ i ) this [ this . l + i ] = cpp [ i ] ;
size = cpp . length ;
2021-09-12 11:11:48 +00:00
} else {
/*:: if(typeof val !== 'string') throw new Error("unreachable"); */
val = val . replace ( /[^\x00-\x7F]/g , "_" ) ;
/*:: if(typeof val !== 'string') throw new Error("unreachable"); */
for ( i = 0 ; i != val . length ; ++ i ) this [ this . l + i ] = ( val . charCodeAt ( i ) & 0xFF ) ;
2022-09-06 06:18:12 +00:00
size = val . length ;
2021-09-12 11:11:48 +00:00
}
} else if ( f === 'hex' ) {
for ( ; i < t ; ++ i ) {
/*:: if(typeof val !== "string") throw new Error("unreachable"); */
this [ this . l ++ ] = ( parseInt ( val . slice ( 2 * i , 2 * i + 2 ) , 16 ) || 0 ) ;
} return this ;
} else if ( f === 'utf16le' ) {
/*:: if(typeof val !== "string") throw new Error("unreachable"); */
var end /*:number*/ = Math . min ( this . l + t , this . length ) ;
for ( i = 0 ; i < Math . min ( val . length , t ) ; ++ i ) {
var cc = val . charCodeAt ( i ) ;
this [ this . l ++ ] = ( cc & 0xff ) ;
this [ this . l ++ ] = ( cc >> 8 ) ;
}
while ( this . l < end ) this [ this . l ++ ] = 0 ;
return this ;
} else /*:: if(typeof val === 'number') */ switch ( t ) {
case 1 : size = 1 ; this [ this . l ] = val & 0xFF ; break ;
case 2 : size = 2 ; this [ this . l ] = val & 0xFF ; val >>>= 8 ; this [ this . l + 1 ] = val & 0xFF ; break ;
case 3 : size = 3 ; this [ this . l ] = val & 0xFF ; val >>>= 8 ; this [ this . l + 1 ] = val & 0xFF ; val >>>= 8 ; this [ this . l + 2 ] = val & 0xFF ; break ;
case 4 : size = 4 ; _ _writeUInt32LE ( this , val , this . l ) ; break ;
case 8 : size = 8 ; if ( f === 'f' ) { write _double _le ( this , val , this . l ) ; break ; }
/* falls through */
case 16 : break ;
case - 4 : size = 4 ; _ _writeInt32LE ( this , val , this . l ) ; break ;
}
this . l += size ; return this ;
}
function CheckField ( hexstr /*:string*/ , fld /*:string*/ ) /*:void*/ {
var m = _ _hexlify ( this , this . l , hexstr . length >> 1 ) ;
if ( m !== hexstr ) throw new Error ( fld + 'Expected ' + hexstr + ' saw ' + m ) ;
this . l += hexstr . length >> 1 ;
}
function prep _blob ( blob , pos /*:number*/ ) /*:void*/ {
blob . l = pos ;
blob . read _shift = /*::(*/ ReadShift /*:: :any)*/ ;
blob . chk = CheckField ;
blob . write _shift = WriteShift ;
}
function parsenoop ( blob , length /*:: :number, opts?:any */ ) { blob . l += length ; }
function new _buf ( sz /*:number*/ ) /*:Block*/ {
var o = new _raw _buf ( sz ) ;
prep _blob ( o , 0 ) ;
return o ;
}
/* [MS-XLSB] 2.1.4 Record */
function recordhopper ( data , cb /*:RecordHopperCB*/ , opts /*:?any*/ ) {
if ( ! data ) return ;
var tmpbyte , cntbyte , length ;
prep _blob ( data , data . l || 0 ) ;
var L = data . length , RT = 0 , tgt = 0 ;
while ( data . l < L ) {
RT = data . read _shift ( 1 ) ;
if ( RT & 0x80 ) RT = ( RT & 0x7F ) + ( ( data . read _shift ( 1 ) & 0x7F ) << 7 ) ;
var R = XLSBRecordEnum [ RT ] || XLSBRecordEnum [ 0xFFFF ] ;
tmpbyte = data . read _shift ( 1 ) ;
length = tmpbyte & 0x7F ;
for ( cntbyte = 1 ; cntbyte < 4 && ( tmpbyte & 0x80 ) ; ++ cntbyte ) length += ( ( tmpbyte = data . read _shift ( 1 ) ) & 0x7F ) << ( 7 * cntbyte ) ;
tgt = data . l + length ;
2021-11-14 04:38:00 +00:00
var d = R . f && R . f ( data , length , opts ) ;
2021-09-12 11:11:48 +00:00
data . l = tgt ;
2022-03-12 14:05:57 +00:00
if ( cb ( d , R , RT ) ) return ;
2021-09-12 11:11:48 +00:00
}
}
/* control buffer usage for fixed-length buffers */
function buf _array ( ) /*:BufArray*/ {
var bufs /*:Array<Block>*/ = [ ] , blksz = has _buf ? 256 : 2048 ;
var newblk = function ba _newblk ( sz /*:number*/ ) /*:Block*/ {
var o /*:Block*/ = ( new _buf ( sz ) /*:any*/ ) ;
prep _blob ( o , 0 ) ;
return o ;
} ;
var curbuf /*:Block*/ = newblk ( blksz ) ;
var endbuf = function ba _endbuf ( ) {
if ( ! curbuf ) return ;
2022-07-12 04:28:03 +00:00
// workaround for new Buffer(3).slice(0,0) bug in bun 0.1.3
if ( curbuf . l ) {
if ( curbuf . length > curbuf . l ) { curbuf = curbuf . slice ( 0 , curbuf . l ) ; curbuf . l = curbuf . length ; }
if ( curbuf . length > 0 ) bufs . push ( curbuf ) ;
}
2021-09-12 11:11:48 +00:00
curbuf = null ;
} ;
var next = function ba _next ( sz /*:number*/ ) /*:Block*/ {
if ( curbuf && ( sz < ( curbuf . length - curbuf . l ) ) ) return curbuf ;
endbuf ( ) ;
return ( curbuf = newblk ( Math . max ( sz + 1 , blksz ) ) ) ;
} ;
var end = function ba _end ( ) {
endbuf ( ) ;
2022-02-10 12:40:50 +00:00
return bconcat ( bufs ) ;
2021-09-12 11:11:48 +00:00
} ;
var push = function ba _push ( buf ) { endbuf ( ) ; curbuf = buf ; if ( curbuf . l == null ) curbuf . l = curbuf . length ; next ( blksz ) ; } ;