From 179255c407ac985fd96782103c113b40e433ddb0 Mon Sep 17 00:00:00 2001 From: CST1229 <68464103+CST1229@users.noreply.github.com> Date: Sun, 16 Jul 2023 16:43:41 +0200 Subject: [PATCH] Add CST1229/zip extension (#705) --- extensions/CST1229/zip.js | 884 ++++++++++++++++++++ images/CST1229/zip.svg | 1 + website/CST1229/images/zip-close.svg | 14 + website/CST1229/images/zip-create-dir.svg | 14 + website/CST1229/images/zip-create-empty.svg | 14 + website/CST1229/images/zip-current-dir.svg | 14 + website/CST1229/images/zip-delete.svg | 14 + website/CST1229/images/zip-dir-contents.svg | 14 + website/CST1229/images/zip-exists.svg | 14 + website/CST1229/images/zip-file.svg | 14 + website/CST1229/images/zip-get-comment.svg | 14 + website/CST1229/images/zip-get-info.svg | 14 + website/CST1229/images/zip-goto-dir.svg | 14 + website/CST1229/images/zip-is-open.svg | 14 + website/CST1229/images/zip-open.svg | 14 + website/CST1229/images/zip-output.svg | 14 + website/CST1229/images/zip-path.svg | 14 + website/CST1229/images/zip-rename.svg | 14 + website/CST1229/images/zip-set-comment.svg | 14 + website/CST1229/images/zip-set-meta.svg | 14 + website/CST1229/images/zip-write.svg | 14 + website/CST1229/zip.html | 551 ++++++++++++ website/hello.zip | Bin 0 -> 3055 bytes website/index.ejs | 6 + 24 files changed, 1708 insertions(+) create mode 100644 extensions/CST1229/zip.js create mode 100644 images/CST1229/zip.svg create mode 100644 website/CST1229/images/zip-close.svg create mode 100644 website/CST1229/images/zip-create-dir.svg create mode 100644 website/CST1229/images/zip-create-empty.svg create mode 100644 website/CST1229/images/zip-current-dir.svg create mode 100644 website/CST1229/images/zip-delete.svg create mode 100644 website/CST1229/images/zip-dir-contents.svg create mode 100644 website/CST1229/images/zip-exists.svg create mode 100644 website/CST1229/images/zip-file.svg create mode 100644 website/CST1229/images/zip-get-comment.svg create mode 100644 website/CST1229/images/zip-get-info.svg create mode 100644 website/CST1229/images/zip-goto-dir.svg create mode 100644 website/CST1229/images/zip-is-open.svg create mode 100644 website/CST1229/images/zip-open.svg create mode 100644 website/CST1229/images/zip-output.svg create mode 100644 website/CST1229/images/zip-path.svg create mode 100644 website/CST1229/images/zip-rename.svg create mode 100644 website/CST1229/images/zip-set-comment.svg create mode 100644 website/CST1229/images/zip-set-meta.svg create mode 100644 website/CST1229/images/zip-write.svg create mode 100644 website/CST1229/zip.html create mode 100644 website/hello.zip diff --git a/extensions/CST1229/zip.js b/extensions/CST1229/zip.js new file mode 100644 index 0000000000..511931a0ee --- /dev/null +++ b/extensions/CST1229/zip.js @@ -0,0 +1,884 @@ +(function (Scratch) { + "use strict"; + + // Tricking JSZip into thinking it's running as a CommonJS module + // is probably better than letting it overwrite globals + const exports = {}; + const module = { exports: null }; + + // jszip source code: + // https://github.com/Stuk/jszip + // using it under the MIT license + + // minified code from: https://cdn.jsdelivr.net/npm/jszip@3/dist/jszip.min.js + // in a function for code folding + function jsZip() { + /*! + + JSZip v3.10.1 - A JavaScript class for generating and reading zip files + + + (c) 2009-2016 Stuart Knightley + Dual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/jszip/main/LICENSE.markdown. + + JSZip uses the library pako released under the MIT license : + https://github.com/nodeca/pako/blob/main/LICENSE + */ + // eslint-disable-next-line + // @ts-ignore + !function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).JSZip=e()}}(function(){return function s(a,o,h){function u(r,e){if(!o[r]){if(!a[r]){var t="function"==typeof require&&require;if(!e&&t)return t(r,!0);if(l)return l(r,!0);var n=new Error("Cannot find module '"+r+"'");throw n.code="MODULE_NOT_FOUND",n}var i=o[r]={exports:{}};a[r][0].call(i.exports,function(e){var t=a[r][1][e];return u(t||e)},i,i.exports,s,a,o,h)}return o[r].exports}for(var l="function"==typeof require&&require,e=0;e>2,s=(3&t)<<4|r>>4,a=1>6:64,o=2>4,r=(15&i)<<4|(s=p.indexOf(e.charAt(o++)))>>2,n=(3&s)<<6|(a=p.indexOf(e.charAt(o++))),l[h++]=t,64!==s&&(l[h++]=r),64!==a&&(l[h++]=n);return l}},{"./support":30,"./utils":32}],2:[function(e,t,r){"use strict";var n=e("./external"),i=e("./stream/DataWorker"),s=e("./stream/Crc32Probe"),a=e("./stream/DataLengthProbe");function o(e,t,r,n,i){this.compressedSize=e,this.uncompressedSize=t,this.crc32=r,this.compression=n,this.compressedContent=i}o.prototype={getContentWorker:function(){var e=new i(n.Promise.resolve(this.compressedContent)).pipe(this.compression.uncompressWorker()).pipe(new a("data_length")),t=this;return e.on("end",function(){if(this.streamInfo.data_length!==t.uncompressedSize)throw new Error("Bug : uncompressed data size mismatch")}),e},getCompressedWorker:function(){return new i(n.Promise.resolve(this.compressedContent)).withStreamInfo("compressedSize",this.compressedSize).withStreamInfo("uncompressedSize",this.uncompressedSize).withStreamInfo("crc32",this.crc32).withStreamInfo("compression",this.compression)}},o.createWorkerFrom=function(e,t,r){return e.pipe(new s).pipe(new a("uncompressedSize")).pipe(t.compressWorker(r)).pipe(new a("compressedSize")).withStreamInfo("compression",t)},t.exports=o},{"./external":6,"./stream/Crc32Probe":25,"./stream/DataLengthProbe":26,"./stream/DataWorker":27}],3:[function(e,t,r){"use strict";var n=e("./stream/GenericWorker");r.STORE={magic:"\0\0",compressWorker:function(){return new n("STORE compression")},uncompressWorker:function(){return new n("STORE decompression")}},r.DEFLATE=e("./flate")},{"./flate":7,"./stream/GenericWorker":28}],4:[function(e,t,r){"use strict";var n=e("./utils");var o=function(){for(var e,t=[],r=0;r<256;r++){e=r;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[r]=e}return t}();t.exports=function(e,t){return void 0!==e&&e.length?"string"!==n.getTypeOf(e)?function(e,t,r,n){var i=o,s=n+r;e^=-1;for(var a=n;a>>8^i[255&(e^t[a])];return-1^e}(0|t,e,e.length,0):function(e,t,r,n){var i=o,s=n+r;e^=-1;for(var a=n;a>>8^i[255&(e^t.charCodeAt(a))];return-1^e}(0|t,e,e.length,0):0}},{"./utils":32}],5:[function(e,t,r){"use strict";r.base64=!1,r.binary=!1,r.dir=!1,r.createFolders=!0,r.date=null,r.compression=null,r.compressionOptions=null,r.comment=null,r.unixPermissions=null,r.dosPermissions=null},{}],6:[function(e,t,r){"use strict";var n=null;n="undefined"!=typeof Promise?Promise:e("lie"),t.exports={Promise:n}},{lie:37}],7:[function(e,t,r){"use strict";var n="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Uint32Array,i=e("pako"),s=e("./utils"),a=e("./stream/GenericWorker"),o=n?"uint8array":"array";function h(e,t){a.call(this,"FlateWorker/"+e),this._pako=null,this._pakoAction=e,this._pakoOptions=t,this.meta={}}r.magic="\b\0",s.inherits(h,a),h.prototype.processChunk=function(e){this.meta=e.meta,null===this._pako&&this._createPako(),this._pako.push(s.transformTo(o,e.data),!1)},h.prototype.flush=function(){a.prototype.flush.call(this),null===this._pako&&this._createPako(),this._pako.push([],!0)},h.prototype.cleanUp=function(){a.prototype.cleanUp.call(this),this._pako=null},h.prototype._createPako=function(){this._pako=new i[this._pakoAction]({raw:!0,level:this._pakoOptions.level||-1});var t=this;this._pako.onData=function(e){t.push({data:e,meta:t.meta})}},r.compressWorker=function(e){return new h("Deflate",e)},r.uncompressWorker=function(){return new h("Inflate",{})}},{"./stream/GenericWorker":28,"./utils":32,pako:38}],8:[function(e,t,r){"use strict";function A(e,t){var r,n="";for(r=0;r>>=8;return n}function n(e,t,r,n,i,s){var a,o,h=e.file,u=e.compression,l=s!==O.utf8encode,f=I.transformTo("string",s(h.name)),c=I.transformTo("string",O.utf8encode(h.name)),d=h.comment,p=I.transformTo("string",s(d)),m=I.transformTo("string",O.utf8encode(d)),_=c.length!==h.name.length,g=m.length!==d.length,b="",v="",y="",w=h.dir,k=h.date,x={crc32:0,compressedSize:0,uncompressedSize:0};t&&!r||(x.crc32=e.crc32,x.compressedSize=e.compressedSize,x.uncompressedSize=e.uncompressedSize);var S=0;t&&(S|=8),l||!_&&!g||(S|=2048);var z=0,C=0;w&&(z|=16),"UNIX"===i?(C=798,z|=function(e,t){var r=e;return e||(r=t?16893:33204),(65535&r)<<16}(h.unixPermissions,w)):(C=20,z|=function(e){return 63&(e||0)}(h.dosPermissions)),a=k.getUTCHours(),a<<=6,a|=k.getUTCMinutes(),a<<=5,a|=k.getUTCSeconds()/2,o=k.getUTCFullYear()-1980,o<<=4,o|=k.getUTCMonth()+1,o<<=5,o|=k.getUTCDate(),_&&(v=A(1,1)+A(B(f),4)+c,b+="up"+A(v.length,2)+v),g&&(y=A(1,1)+A(B(p),4)+m,b+="uc"+A(y.length,2)+y);var E="";return E+="\n\0",E+=A(S,2),E+=u.magic,E+=A(a,2),E+=A(o,2),E+=A(x.crc32,4),E+=A(x.compressedSize,4),E+=A(x.uncompressedSize,4),E+=A(f.length,2),E+=A(b.length,2),{fileRecord:R.LOCAL_FILE_HEADER+E+f+b,dirRecord:R.CENTRAL_FILE_HEADER+A(C,2)+E+A(p.length,2)+"\0\0\0\0"+A(z,4)+A(n,4)+f+b+p}}var I=e("../utils"),i=e("../stream/GenericWorker"),O=e("../utf8"),B=e("../crc32"),R=e("../signature");function s(e,t,r,n){i.call(this,"ZipFileWorker"),this.bytesWritten=0,this.zipComment=t,this.zipPlatform=r,this.encodeFileName=n,this.streamFiles=e,this.accumulate=!1,this.contentBuffer=[],this.dirRecords=[],this.currentSourceOffset=0,this.entriesCount=0,this.currentFile=null,this._sources=[]}I.inherits(s,i),s.prototype.push=function(e){var t=e.meta.percent||0,r=this.entriesCount,n=this._sources.length;this.accumulate?this.contentBuffer.push(e):(this.bytesWritten+=e.data.length,i.prototype.push.call(this,{data:e.data,meta:{currentFile:this.currentFile,percent:r?(t+100*(r-n-1))/r:100}}))},s.prototype.openedSource=function(e){this.currentSourceOffset=this.bytesWritten,this.currentFile=e.file.name;var t=this.streamFiles&&!e.file.dir;if(t){var r=n(e,t,!1,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);this.push({data:r.fileRecord,meta:{percent:0}})}else this.accumulate=!0},s.prototype.closedSource=function(e){this.accumulate=!1;var t=this.streamFiles&&!e.file.dir,r=n(e,t,!0,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);if(this.dirRecords.push(r.dirRecord),t)this.push({data:function(e){return R.DATA_DESCRIPTOR+A(e.crc32,4)+A(e.compressedSize,4)+A(e.uncompressedSize,4)}(e),meta:{percent:100}});else for(this.push({data:r.fileRecord,meta:{percent:0}});this.contentBuffer.length;)this.push(this.contentBuffer.shift());this.currentFile=null},s.prototype.flush=function(){for(var e=this.bytesWritten,t=0;t=this.index;t--)r=(r<<8)+this.byteAt(t);return this.index+=e,r},readString:function(e){return n.transformTo("string",this.readData(e))},readData:function(){},lastIndexOfSignature:function(){},readAndCheckSignature:function(){},readDate:function(){var e=this.readInt(4);return new Date(Date.UTC(1980+(e>>25&127),(e>>21&15)-1,e>>16&31,e>>11&31,e>>5&63,(31&e)<<1))}},t.exports=i},{"../utils":32}],19:[function(e,t,r){"use strict";var n=e("./Uint8ArrayReader");function i(e){n.call(this,e)}e("../utils").inherits(i,n),i.prototype.readData=function(e){this.checkOffset(e);var t=this.data.slice(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=i},{"../utils":32,"./Uint8ArrayReader":21}],20:[function(e,t,r){"use strict";var n=e("./DataReader");function i(e){n.call(this,e)}e("../utils").inherits(i,n),i.prototype.byteAt=function(e){return this.data.charCodeAt(this.zero+e)},i.prototype.lastIndexOfSignature=function(e){return this.data.lastIndexOf(e)-this.zero},i.prototype.readAndCheckSignature=function(e){return e===this.readData(4)},i.prototype.readData=function(e){this.checkOffset(e);var t=this.data.slice(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=i},{"../utils":32,"./DataReader":18}],21:[function(e,t,r){"use strict";var n=e("./ArrayReader");function i(e){n.call(this,e)}e("../utils").inherits(i,n),i.prototype.readData=function(e){if(this.checkOffset(e),0===e)return new Uint8Array(0);var t=this.data.subarray(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=i},{"../utils":32,"./ArrayReader":17}],22:[function(e,t,r){"use strict";var n=e("../utils"),i=e("../support"),s=e("./ArrayReader"),a=e("./StringReader"),o=e("./NodeBufferReader"),h=e("./Uint8ArrayReader");t.exports=function(e){var t=n.getTypeOf(e);return n.checkSupport(t),"string"!==t||i.uint8array?"nodebuffer"===t?new o(e):i.uint8array?new h(n.transformTo("uint8array",e)):new s(n.transformTo("array",e)):new a(e)}},{"../support":30,"../utils":32,"./ArrayReader":17,"./NodeBufferReader":19,"./StringReader":20,"./Uint8ArrayReader":21}],23:[function(e,t,r){"use strict";r.LOCAL_FILE_HEADER="PK",r.CENTRAL_FILE_HEADER="PK",r.CENTRAL_DIRECTORY_END="PK",r.ZIP64_CENTRAL_DIRECTORY_LOCATOR="PK",r.ZIP64_CENTRAL_DIRECTORY_END="PK",r.DATA_DESCRIPTOR="PK\b"},{}],24:[function(e,t,r){"use strict";var n=e("./GenericWorker"),i=e("../utils");function s(e){n.call(this,"ConvertWorker to "+e),this.destType=e}i.inherits(s,n),s.prototype.processChunk=function(e){this.push({data:i.transformTo(this.destType,e.data),meta:e.meta})},t.exports=s},{"../utils":32,"./GenericWorker":28}],25:[function(e,t,r){"use strict";var n=e("./GenericWorker"),i=e("../crc32");function s(){n.call(this,"Crc32Probe"),this.withStreamInfo("crc32",0)}e("../utils").inherits(s,n),s.prototype.processChunk=function(e){this.streamInfo.crc32=i(e.data,this.streamInfo.crc32||0),this.push(e)},t.exports=s},{"../crc32":4,"../utils":32,"./GenericWorker":28}],26:[function(e,t,r){"use strict";var n=e("../utils"),i=e("./GenericWorker");function s(e){i.call(this,"DataLengthProbe for "+e),this.propName=e,this.withStreamInfo(e,0)}n.inherits(s,i),s.prototype.processChunk=function(e){if(e){var t=this.streamInfo[this.propName]||0;this.streamInfo[this.propName]=t+e.data.length}i.prototype.processChunk.call(this,e)},t.exports=s},{"../utils":32,"./GenericWorker":28}],27:[function(e,t,r){"use strict";var n=e("../utils"),i=e("./GenericWorker");function s(e){i.call(this,"DataWorker");var t=this;this.dataIsReady=!1,this.index=0,this.max=0,this.data=null,this.type="",this._tickScheduled=!1,e.then(function(e){t.dataIsReady=!0,t.data=e,t.max=e&&e.length||0,t.type=n.getTypeOf(e),t.isPaused||t._tickAndRepeat()},function(e){t.error(e)})}n.inherits(s,i),s.prototype.cleanUp=function(){i.prototype.cleanUp.call(this),this.data=null},s.prototype.resume=function(){return!!i.prototype.resume.call(this)&&(!this._tickScheduled&&this.dataIsReady&&(this._tickScheduled=!0,n.delay(this._tickAndRepeat,[],this)),!0)},s.prototype._tickAndRepeat=function(){this._tickScheduled=!1,this.isPaused||this.isFinished||(this._tick(),this.isFinished||(n.delay(this._tickAndRepeat,[],this),this._tickScheduled=!0))},s.prototype._tick=function(){if(this.isPaused||this.isFinished)return!1;var e=null,t=Math.min(this.max,this.index+16384);if(this.index>=this.max)return this.end();switch(this.type){case"string":e=this.data.substring(this.index,t);break;case"uint8array":e=this.data.subarray(this.index,t);break;case"array":case"nodebuffer":e=this.data.slice(this.index,t)}return this.index=t,this.push({data:e,meta:{percent:this.max?this.index/this.max*100:0}})},t.exports=s},{"../utils":32,"./GenericWorker":28}],28:[function(e,t,r){"use strict";function n(e){this.name=e||"default",this.streamInfo={},this.generatedError=null,this.extraStreamInfo={},this.isPaused=!0,this.isFinished=!1,this.isLocked=!1,this._listeners={data:[],end:[],error:[]},this.previous=null}n.prototype={push:function(e){this.emit("data",e)},end:function(){if(this.isFinished)return!1;this.flush();try{this.emit("end"),this.cleanUp(),this.isFinished=!0}catch(e){this.emit("error",e)}return!0},error:function(e){return!this.isFinished&&(this.isPaused?this.generatedError=e:(this.isFinished=!0,this.emit("error",e),this.previous&&this.previous.error(e),this.cleanUp()),!0)},on:function(e,t){return this._listeners[e].push(t),this},cleanUp:function(){this.streamInfo=this.generatedError=this.extraStreamInfo=null,this._listeners=[]},emit:function(e,t){if(this._listeners[e])for(var r=0;r "+e:e}},t.exports=n},{}],29:[function(e,t,r){"use strict";var h=e("../utils"),i=e("./ConvertWorker"),s=e("./GenericWorker"),u=e("../base64"),n=e("../support"),a=e("../external"),o=null;if(n.nodestream)try{o=e("../nodejs/NodejsStreamOutputAdapter")}catch(e){}function l(e,o){return new a.Promise(function(t,r){var n=[],i=e._internalType,s=e._outputType,a=e._mimeType;e.on("data",function(e,t){n.push(e),o&&o(t)}).on("error",function(e){n=[],r(e)}).on("end",function(){try{var e=function(e,t,r){switch(e){case"blob":return h.newBlob(h.transformTo("arraybuffer",t),r);case"base64":return u.encode(t);default:return h.transformTo(e,t)}}(s,function(e,t){var r,n=0,i=null,s=0;for(r=0;r>>6:(r<65536?t[s++]=224|r>>>12:(t[s++]=240|r>>>18,t[s++]=128|r>>>12&63),t[s++]=128|r>>>6&63),t[s++]=128|63&r);return t}(e)},s.utf8decode=function(e){return h.nodebuffer?o.transformTo("nodebuffer",e).toString("utf-8"):function(e){var t,r,n,i,s=e.length,a=new Array(2*s);for(t=r=0;t>10&1023,a[r++]=56320|1023&n)}return a.length!==r&&(a.subarray?a=a.subarray(0,r):a.length=r),o.applyFromCharCode(a)}(e=o.transformTo(h.uint8array?"uint8array":"array",e))},o.inherits(a,n),a.prototype.processChunk=function(e){var t=o.transformTo(h.uint8array?"uint8array":"array",e.data);if(this.leftOver&&this.leftOver.length){if(h.uint8array){var r=t;(t=new Uint8Array(r.length+this.leftOver.length)).set(this.leftOver,0),t.set(r,this.leftOver.length)}else t=this.leftOver.concat(t);this.leftOver=null}var n=function(e,t){var r;for((t=t||e.length)>e.length&&(t=e.length),r=t-1;0<=r&&128==(192&e[r]);)r--;return r<0?t:0===r?t:r+u[e[r]]>t?r:t}(t),i=t;n!==t.length&&(h.uint8array?(i=t.subarray(0,n),this.leftOver=t.subarray(n,t.length)):(i=t.slice(0,n),this.leftOver=t.slice(n,t.length))),this.push({data:s.utf8decode(i),meta:e.meta})},a.prototype.flush=function(){this.leftOver&&this.leftOver.length&&(this.push({data:s.utf8decode(this.leftOver),meta:{}}),this.leftOver=null)},s.Utf8DecodeWorker=a,o.inherits(l,n),l.prototype.processChunk=function(e){this.push({data:s.utf8encode(e.data),meta:e.meta})},s.Utf8EncodeWorker=l},{"./nodejsUtils":14,"./stream/GenericWorker":28,"./support":30,"./utils":32}],32:[function(e,t,a){"use strict";var o=e("./support"),h=e("./base64"),r=e("./nodejsUtils"),u=e("./external");function n(e){return e}function l(e,t){for(var r=0;r>8;this.dir=!!(16&this.externalFileAttributes),0==e&&(this.dosPermissions=63&this.externalFileAttributes),3==e&&(this.unixPermissions=this.externalFileAttributes>>16&65535),this.dir||"/"!==this.fileNameStr.slice(-1)||(this.dir=!0)},parseZIP64ExtraField:function(){if(this.extraFields[1]){var e=n(this.extraFields[1].value);this.uncompressedSize===s.MAX_VALUE_32BITS&&(this.uncompressedSize=e.readInt(8)),this.compressedSize===s.MAX_VALUE_32BITS&&(this.compressedSize=e.readInt(8)),this.localHeaderOffset===s.MAX_VALUE_32BITS&&(this.localHeaderOffset=e.readInt(8)),this.diskNumberStart===s.MAX_VALUE_32BITS&&(this.diskNumberStart=e.readInt(4))}},readExtraFields:function(e){var t,r,n,i=e.index+this.extraFieldsLength;for(this.extraFields||(this.extraFields={});e.index+4>>6:(r<65536?t[s++]=224|r>>>12:(t[s++]=240|r>>>18,t[s++]=128|r>>>12&63),t[s++]=128|r>>>6&63),t[s++]=128|63&r);return t},r.buf2binstring=function(e){return l(e,e.length)},r.binstring2buf=function(e){for(var t=new h.Buf8(e.length),r=0,n=t.length;r>10&1023,o[n++]=56320|1023&i)}return l(o,n)},r.utf8border=function(e,t){var r;for((t=t||e.length)>e.length&&(t=e.length),r=t-1;0<=r&&128==(192&e[r]);)r--;return r<0?t:0===r?t:r+u[e[r]]>t?r:t}},{"./common":41}],43:[function(e,t,r){"use strict";t.exports=function(e,t,r,n){for(var i=65535&e|0,s=e>>>16&65535|0,a=0;0!==r;){for(r-=a=2e3>>1:e>>>1;t[r]=e}return t}();t.exports=function(e,t,r,n){var i=o,s=n+r;e^=-1;for(var a=n;a>>8^i[255&(e^t[a])];return-1^e}},{}],46:[function(e,t,r){"use strict";var h,c=e("../utils/common"),u=e("./trees"),d=e("./adler32"),p=e("./crc32"),n=e("./messages"),l=0,f=4,m=0,_=-2,g=-1,b=4,i=2,v=8,y=9,s=286,a=30,o=19,w=2*s+1,k=15,x=3,S=258,z=S+x+1,C=42,E=113,A=1,I=2,O=3,B=4;function R(e,t){return e.msg=n[t],t}function T(e){return(e<<1)-(4e.avail_out&&(r=e.avail_out),0!==r&&(c.arraySet(e.output,t.pending_buf,t.pending_out,r,e.next_out),e.next_out+=r,t.pending_out+=r,e.total_out+=r,e.avail_out-=r,t.pending-=r,0===t.pending&&(t.pending_out=0))}function N(e,t){u._tr_flush_block(e,0<=e.block_start?e.block_start:-1,e.strstart-e.block_start,t),e.block_start=e.strstart,F(e.strm)}function U(e,t){e.pending_buf[e.pending++]=t}function P(e,t){e.pending_buf[e.pending++]=t>>>8&255,e.pending_buf[e.pending++]=255&t}function L(e,t){var r,n,i=e.max_chain_length,s=e.strstart,a=e.prev_length,o=e.nice_match,h=e.strstart>e.w_size-z?e.strstart-(e.w_size-z):0,u=e.window,l=e.w_mask,f=e.prev,c=e.strstart+S,d=u[s+a-1],p=u[s+a];e.prev_length>=e.good_match&&(i>>=2),o>e.lookahead&&(o=e.lookahead);do{if(u[(r=t)+a]===p&&u[r+a-1]===d&&u[r]===u[s]&&u[++r]===u[s+1]){s+=2,r++;do{}while(u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&sh&&0!=--i);return a<=e.lookahead?a:e.lookahead}function j(e){var t,r,n,i,s,a,o,h,u,l,f=e.w_size;do{if(i=e.window_size-e.lookahead-e.strstart,e.strstart>=f+(f-z)){for(c.arraySet(e.window,e.window,f,f,0),e.match_start-=f,e.strstart-=f,e.block_start-=f,t=r=e.hash_size;n=e.head[--t],e.head[t]=f<=n?n-f:0,--r;);for(t=r=f;n=e.prev[--t],e.prev[t]=f<=n?n-f:0,--r;);i+=f}if(0===e.strm.avail_in)break;if(a=e.strm,o=e.window,h=e.strstart+e.lookahead,u=i,l=void 0,l=a.avail_in,u=x)for(s=e.strstart-e.insert,e.ins_h=e.window[s],e.ins_h=(e.ins_h<=x&&(e.ins_h=(e.ins_h<=x)if(n=u._tr_tally(e,e.strstart-e.match_start,e.match_length-x),e.lookahead-=e.match_length,e.match_length<=e.max_lazy_match&&e.lookahead>=x){for(e.match_length--;e.strstart++,e.ins_h=(e.ins_h<=x&&(e.ins_h=(e.ins_h<=x&&e.match_length<=e.prev_length){for(i=e.strstart+e.lookahead-x,n=u._tr_tally(e,e.strstart-1-e.prev_match,e.prev_length-x),e.lookahead-=e.prev_length-1,e.prev_length-=2;++e.strstart<=i&&(e.ins_h=(e.ins_h<e.pending_buf_size-5&&(r=e.pending_buf_size-5);;){if(e.lookahead<=1){if(j(e),0===e.lookahead&&t===l)return A;if(0===e.lookahead)break}e.strstart+=e.lookahead,e.lookahead=0;var n=e.block_start+r;if((0===e.strstart||e.strstart>=n)&&(e.lookahead=e.strstart-n,e.strstart=n,N(e,!1),0===e.strm.avail_out))return A;if(e.strstart-e.block_start>=e.w_size-z&&(N(e,!1),0===e.strm.avail_out))return A}return e.insert=0,t===f?(N(e,!0),0===e.strm.avail_out?O:B):(e.strstart>e.block_start&&(N(e,!1),e.strm.avail_out),A)}),new M(4,4,8,4,Z),new M(4,5,16,8,Z),new M(4,6,32,32,Z),new M(4,4,16,16,W),new M(8,16,32,32,W),new M(8,16,128,128,W),new M(8,32,128,256,W),new M(32,128,258,1024,W),new M(32,258,258,4096,W)],r.deflateInit=function(e,t){return Y(e,t,v,15,8,0)},r.deflateInit2=Y,r.deflateReset=K,r.deflateResetKeep=G,r.deflateSetHeader=function(e,t){return e&&e.state?2!==e.state.wrap?_:(e.state.gzhead=t,m):_},r.deflate=function(e,t){var r,n,i,s;if(!e||!e.state||5>8&255),U(n,n.gzhead.time>>16&255),U(n,n.gzhead.time>>24&255),U(n,9===n.level?2:2<=n.strategy||n.level<2?4:0),U(n,255&n.gzhead.os),n.gzhead.extra&&n.gzhead.extra.length&&(U(n,255&n.gzhead.extra.length),U(n,n.gzhead.extra.length>>8&255)),n.gzhead.hcrc&&(e.adler=p(e.adler,n.pending_buf,n.pending,0)),n.gzindex=0,n.status=69):(U(n,0),U(n,0),U(n,0),U(n,0),U(n,0),U(n,9===n.level?2:2<=n.strategy||n.level<2?4:0),U(n,3),n.status=E);else{var a=v+(n.w_bits-8<<4)<<8;a|=(2<=n.strategy||n.level<2?0:n.level<6?1:6===n.level?2:3)<<6,0!==n.strstart&&(a|=32),a+=31-a%31,n.status=E,P(n,a),0!==n.strstart&&(P(n,e.adler>>>16),P(n,65535&e.adler)),e.adler=1}if(69===n.status)if(n.gzhead.extra){for(i=n.pending;n.gzindex<(65535&n.gzhead.extra.length)&&(n.pending!==n.pending_buf_size||(n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),F(e),i=n.pending,n.pending!==n.pending_buf_size));)U(n,255&n.gzhead.extra[n.gzindex]),n.gzindex++;n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),n.gzindex===n.gzhead.extra.length&&(n.gzindex=0,n.status=73)}else n.status=73;if(73===n.status)if(n.gzhead.name){i=n.pending;do{if(n.pending===n.pending_buf_size&&(n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),F(e),i=n.pending,n.pending===n.pending_buf_size)){s=1;break}s=n.gzindexi&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),0===s&&(n.gzindex=0,n.status=91)}else n.status=91;if(91===n.status)if(n.gzhead.comment){i=n.pending;do{if(n.pending===n.pending_buf_size&&(n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),F(e),i=n.pending,n.pending===n.pending_buf_size)){s=1;break}s=n.gzindexi&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),0===s&&(n.status=103)}else n.status=103;if(103===n.status&&(n.gzhead.hcrc?(n.pending+2>n.pending_buf_size&&F(e),n.pending+2<=n.pending_buf_size&&(U(n,255&e.adler),U(n,e.adler>>8&255),e.adler=0,n.status=E)):n.status=E),0!==n.pending){if(F(e),0===e.avail_out)return n.last_flush=-1,m}else if(0===e.avail_in&&T(t)<=T(r)&&t!==f)return R(e,-5);if(666===n.status&&0!==e.avail_in)return R(e,-5);if(0!==e.avail_in||0!==n.lookahead||t!==l&&666!==n.status){var o=2===n.strategy?function(e,t){for(var r;;){if(0===e.lookahead&&(j(e),0===e.lookahead)){if(t===l)return A;break}if(e.match_length=0,r=u._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++,r&&(N(e,!1),0===e.strm.avail_out))return A}return e.insert=0,t===f?(N(e,!0),0===e.strm.avail_out?O:B):e.last_lit&&(N(e,!1),0===e.strm.avail_out)?A:I}(n,t):3===n.strategy?function(e,t){for(var r,n,i,s,a=e.window;;){if(e.lookahead<=S){if(j(e),e.lookahead<=S&&t===l)return A;if(0===e.lookahead)break}if(e.match_length=0,e.lookahead>=x&&0e.lookahead&&(e.match_length=e.lookahead)}if(e.match_length>=x?(r=u._tr_tally(e,1,e.match_length-x),e.lookahead-=e.match_length,e.strstart+=e.match_length,e.match_length=0):(r=u._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++),r&&(N(e,!1),0===e.strm.avail_out))return A}return e.insert=0,t===f?(N(e,!0),0===e.strm.avail_out?O:B):e.last_lit&&(N(e,!1),0===e.strm.avail_out)?A:I}(n,t):h[n.level].func(n,t);if(o!==O&&o!==B||(n.status=666),o===A||o===O)return 0===e.avail_out&&(n.last_flush=-1),m;if(o===I&&(1===t?u._tr_align(n):5!==t&&(u._tr_stored_block(n,0,0,!1),3===t&&(D(n.head),0===n.lookahead&&(n.strstart=0,n.block_start=0,n.insert=0))),F(e),0===e.avail_out))return n.last_flush=-1,m}return t!==f?m:n.wrap<=0?1:(2===n.wrap?(U(n,255&e.adler),U(n,e.adler>>8&255),U(n,e.adler>>16&255),U(n,e.adler>>24&255),U(n,255&e.total_in),U(n,e.total_in>>8&255),U(n,e.total_in>>16&255),U(n,e.total_in>>24&255)):(P(n,e.adler>>>16),P(n,65535&e.adler)),F(e),0=r.w_size&&(0===s&&(D(r.head),r.strstart=0,r.block_start=0,r.insert=0),u=new c.Buf8(r.w_size),c.arraySet(u,t,l-r.w_size,r.w_size,0),t=u,l=r.w_size),a=e.avail_in,o=e.next_in,h=e.input,e.avail_in=l,e.next_in=0,e.input=t,j(r);r.lookahead>=x;){for(n=r.strstart,i=r.lookahead-(x-1);r.ins_h=(r.ins_h<>>=y=v>>>24,p-=y,0===(y=v>>>16&255))C[s++]=65535&v;else{if(!(16&y)){if(0==(64&y)){v=m[(65535&v)+(d&(1<>>=y,p-=y),p<15&&(d+=z[n++]<>>=y=v>>>24,p-=y,!(16&(y=v>>>16&255))){if(0==(64&y)){v=_[(65535&v)+(d&(1<>>=y,p-=y,(y=s-a)>3,d&=(1<<(p-=w<<3))-1,e.next_in=n,e.next_out=s,e.avail_in=n>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24)}function s(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new I.Buf16(320),this.work=new I.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function a(e){var t;return e&&e.state?(t=e.state,e.total_in=e.total_out=t.total=0,e.msg="",t.wrap&&(e.adler=1&t.wrap),t.mode=P,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new I.Buf32(n),t.distcode=t.distdyn=new I.Buf32(i),t.sane=1,t.back=-1,N):U}function o(e){var t;return e&&e.state?((t=e.state).wsize=0,t.whave=0,t.wnext=0,a(e)):U}function h(e,t){var r,n;return e&&e.state?(n=e.state,t<0?(r=0,t=-t):(r=1+(t>>4),t<48&&(t&=15)),t&&(t<8||15=s.wsize?(I.arraySet(s.window,t,r-s.wsize,s.wsize,0),s.wnext=0,s.whave=s.wsize):(n<(i=s.wsize-s.wnext)&&(i=n),I.arraySet(s.window,t,r-n,i,s.wnext),(n-=i)?(I.arraySet(s.window,t,r-n,n,0),s.wnext=n,s.whave=s.wsize):(s.wnext+=i,s.wnext===s.wsize&&(s.wnext=0),s.whave>>8&255,r.check=B(r.check,E,2,0),l=u=0,r.mode=2;break}if(r.flags=0,r.head&&(r.head.done=!1),!(1&r.wrap)||(((255&u)<<8)+(u>>8))%31){e.msg="incorrect header check",r.mode=30;break}if(8!=(15&u)){e.msg="unknown compression method",r.mode=30;break}if(l-=4,k=8+(15&(u>>>=4)),0===r.wbits)r.wbits=k;else if(k>r.wbits){e.msg="invalid window size",r.mode=30;break}r.dmax=1<>8&1),512&r.flags&&(E[0]=255&u,E[1]=u>>>8&255,r.check=B(r.check,E,2,0)),l=u=0,r.mode=3;case 3:for(;l<32;){if(0===o)break e;o--,u+=n[s++]<>>8&255,E[2]=u>>>16&255,E[3]=u>>>24&255,r.check=B(r.check,E,4,0)),l=u=0,r.mode=4;case 4:for(;l<16;){if(0===o)break e;o--,u+=n[s++]<>8),512&r.flags&&(E[0]=255&u,E[1]=u>>>8&255,r.check=B(r.check,E,2,0)),l=u=0,r.mode=5;case 5:if(1024&r.flags){for(;l<16;){if(0===o)break e;o--,u+=n[s++]<>>8&255,r.check=B(r.check,E,2,0)),l=u=0}else r.head&&(r.head.extra=null);r.mode=6;case 6:if(1024&r.flags&&(o<(d=r.length)&&(d=o),d&&(r.head&&(k=r.head.extra_len-r.length,r.head.extra||(r.head.extra=new Array(r.head.extra_len)),I.arraySet(r.head.extra,n,s,d,k)),512&r.flags&&(r.check=B(r.check,n,d,s)),o-=d,s+=d,r.length-=d),r.length))break e;r.length=0,r.mode=7;case 7:if(2048&r.flags){if(0===o)break e;for(d=0;k=n[s+d++],r.head&&k&&r.length<65536&&(r.head.name+=String.fromCharCode(k)),k&&d>9&1,r.head.done=!0),e.adler=r.check=0,r.mode=12;break;case 10:for(;l<32;){if(0===o)break e;o--,u+=n[s++]<>>=7&l,l-=7&l,r.mode=27;break}for(;l<3;){if(0===o)break e;o--,u+=n[s++]<>>=1)){case 0:r.mode=14;break;case 1:if(j(r),r.mode=20,6!==t)break;u>>>=2,l-=2;break e;case 2:r.mode=17;break;case 3:e.msg="invalid block type",r.mode=30}u>>>=2,l-=2;break;case 14:for(u>>>=7&l,l-=7&l;l<32;){if(0===o)break e;o--,u+=n[s++]<>>16^65535)){e.msg="invalid stored block lengths",r.mode=30;break}if(r.length=65535&u,l=u=0,r.mode=15,6===t)break e;case 15:r.mode=16;case 16:if(d=r.length){if(o>>=5,l-=5,r.ndist=1+(31&u),u>>>=5,l-=5,r.ncode=4+(15&u),u>>>=4,l-=4,286>>=3,l-=3}for(;r.have<19;)r.lens[A[r.have++]]=0;if(r.lencode=r.lendyn,r.lenbits=7,S={bits:r.lenbits},x=T(0,r.lens,0,19,r.lencode,0,r.work,S),r.lenbits=S.bits,x){e.msg="invalid code lengths set",r.mode=30;break}r.have=0,r.mode=19;case 19:for(;r.have>>16&255,b=65535&C,!((_=C>>>24)<=l);){if(0===o)break e;o--,u+=n[s++]<>>=_,l-=_,r.lens[r.have++]=b;else{if(16===b){for(z=_+2;l>>=_,l-=_,0===r.have){e.msg="invalid bit length repeat",r.mode=30;break}k=r.lens[r.have-1],d=3+(3&u),u>>>=2,l-=2}else if(17===b){for(z=_+3;l>>=_)),u>>>=3,l-=3}else{for(z=_+7;l>>=_)),u>>>=7,l-=7}if(r.have+d>r.nlen+r.ndist){e.msg="invalid bit length repeat",r.mode=30;break}for(;d--;)r.lens[r.have++]=k}}if(30===r.mode)break;if(0===r.lens[256]){e.msg="invalid code -- missing end-of-block",r.mode=30;break}if(r.lenbits=9,S={bits:r.lenbits},x=T(D,r.lens,0,r.nlen,r.lencode,0,r.work,S),r.lenbits=S.bits,x){e.msg="invalid literal/lengths set",r.mode=30;break}if(r.distbits=6,r.distcode=r.distdyn,S={bits:r.distbits},x=T(F,r.lens,r.nlen,r.ndist,r.distcode,0,r.work,S),r.distbits=S.bits,x){e.msg="invalid distances set",r.mode=30;break}if(r.mode=20,6===t)break e;case 20:r.mode=21;case 21:if(6<=o&&258<=h){e.next_out=a,e.avail_out=h,e.next_in=s,e.avail_in=o,r.hold=u,r.bits=l,R(e,c),a=e.next_out,i=e.output,h=e.avail_out,s=e.next_in,n=e.input,o=e.avail_in,u=r.hold,l=r.bits,12===r.mode&&(r.back=-1);break}for(r.back=0;g=(C=r.lencode[u&(1<>>16&255,b=65535&C,!((_=C>>>24)<=l);){if(0===o)break e;o--,u+=n[s++]<>v)])>>>16&255,b=65535&C,!(v+(_=C>>>24)<=l);){if(0===o)break e;o--,u+=n[s++]<>>=v,l-=v,r.back+=v}if(u>>>=_,l-=_,r.back+=_,r.length=b,0===g){r.mode=26;break}if(32&g){r.back=-1,r.mode=12;break}if(64&g){e.msg="invalid literal/length code",r.mode=30;break}r.extra=15&g,r.mode=22;case 22:if(r.extra){for(z=r.extra;l>>=r.extra,l-=r.extra,r.back+=r.extra}r.was=r.length,r.mode=23;case 23:for(;g=(C=r.distcode[u&(1<>>16&255,b=65535&C,!((_=C>>>24)<=l);){if(0===o)break e;o--,u+=n[s++]<>v)])>>>16&255,b=65535&C,!(v+(_=C>>>24)<=l);){if(0===o)break e;o--,u+=n[s++]<>>=v,l-=v,r.back+=v}if(u>>>=_,l-=_,r.back+=_,64&g){e.msg="invalid distance code",r.mode=30;break}r.offset=b,r.extra=15&g,r.mode=24;case 24:if(r.extra){for(z=r.extra;l>>=r.extra,l-=r.extra,r.back+=r.extra}if(r.offset>r.dmax){e.msg="invalid distance too far back",r.mode=30;break}r.mode=25;case 25:if(0===h)break e;if(d=c-h,r.offset>d){if((d=r.offset-d)>r.whave&&r.sane){e.msg="invalid distance too far back",r.mode=30;break}p=d>r.wnext?(d-=r.wnext,r.wsize-d):r.wnext-d,d>r.length&&(d=r.length),m=r.window}else m=i,p=a-r.offset,d=r.length;for(hd?(m=R[T+a[v]],A[I+a[v]]):(m=96,0),h=1<>S)+(u-=h)]=p<<24|m<<16|_|0,0!==u;);for(h=1<>=1;if(0!==h?(E&=h-1,E+=h):E=0,v++,0==--O[b]){if(b===w)break;b=t[r+a[v]]}if(k>>7)]}function U(e,t){e.pending_buf[e.pending++]=255&t,e.pending_buf[e.pending++]=t>>>8&255}function P(e,t,r){e.bi_valid>d-r?(e.bi_buf|=t<>d-e.bi_valid,e.bi_valid+=r-d):(e.bi_buf|=t<>>=1,r<<=1,0<--t;);return r>>>1}function Z(e,t,r){var n,i,s=new Array(g+1),a=0;for(n=1;n<=g;n++)s[n]=a=a+r[n-1]<<1;for(i=0;i<=t;i++){var o=e[2*i+1];0!==o&&(e[2*i]=j(s[o]++,o))}}function W(e){var t;for(t=0;t>1;1<=r;r--)G(e,s,r);for(i=h;r=e.heap[1],e.heap[1]=e.heap[e.heap_len--],G(e,s,1),n=e.heap[1],e.heap[--e.heap_max]=r,e.heap[--e.heap_max]=n,s[2*i]=s[2*r]+s[2*n],e.depth[i]=(e.depth[r]>=e.depth[n]?e.depth[r]:e.depth[n])+1,s[2*r+1]=s[2*n+1]=i,e.heap[1]=i++,G(e,s,1),2<=e.heap_len;);e.heap[--e.heap_max]=e.heap[1],function(e,t){var r,n,i,s,a,o,h=t.dyn_tree,u=t.max_code,l=t.stat_desc.static_tree,f=t.stat_desc.has_stree,c=t.stat_desc.extra_bits,d=t.stat_desc.extra_base,p=t.stat_desc.max_length,m=0;for(s=0;s<=g;s++)e.bl_count[s]=0;for(h[2*e.heap[e.heap_max]+1]=0,r=e.heap_max+1;r<_;r++)p<(s=h[2*h[2*(n=e.heap[r])+1]+1]+1)&&(s=p,m++),h[2*n+1]=s,u>=7;n>>=1)if(1&r&&0!==e.dyn_ltree[2*t])return o;if(0!==e.dyn_ltree[18]||0!==e.dyn_ltree[20]||0!==e.dyn_ltree[26])return h;for(t=32;t>>3,(s=e.static_len+3+7>>>3)<=i&&(i=s)):i=s=r+5,r+4<=i&&-1!==t?J(e,t,r,n):4===e.strategy||s===i?(P(e,2+(n?1:0),3),K(e,z,C)):(P(e,4+(n?1:0),3),function(e,t,r,n){var i;for(P(e,t-257,5),P(e,r-1,5),P(e,n-4,4),i=0;i>>8&255,e.pending_buf[e.d_buf+2*e.last_lit+1]=255&t,e.pending_buf[e.l_buf+e.last_lit]=255&r,e.last_lit++,0===t?e.dyn_ltree[2*r]++:(e.matches++,t--,e.dyn_ltree[2*(A[r]+u+1)]++,e.dyn_dtree[2*N(t)]++),e.last_lit===e.lit_bufsize-1},r._tr_align=function(e){P(e,2,3),L(e,m,z),function(e){16===e.bi_valid?(U(e,e.bi_buf),e.bi_buf=0,e.bi_valid=0):8<=e.bi_valid&&(e.pending_buf[e.pending++]=255&e.bi_buf,e.bi_buf>>=8,e.bi_valid-=8)}(e)}},{"../utils/common":41}],53:[function(e,t,r){"use strict";t.exports=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}},{}],54:[function(e,t,r){(function(e){!function(r,n){"use strict";if(!r.setImmediate){var i,s,t,a,o=1,h={},u=!1,l=r.document,e=Object.getPrototypeOf&&Object.getPrototypeOf(r);e=e&&e.setTimeout?e:r,i="[object process]"==={}.toString.call(r.process)?function(e){process.nextTick(function(){c(e)})}:function(){if(r.postMessage&&!r.importScripts){var e=!0,t=r.onmessage;return r.onmessage=function(){e=!1},r.postMessage("","*"),r.onmessage=t,e}}()?(a="setImmediate$"+Math.random()+"$",r.addEventListener?r.addEventListener("message",d,!1):r.attachEvent("onmessage",d),function(e){r.postMessage(a+e,"*")}):r.MessageChannel?((t=new MessageChannel).port1.onmessage=function(e){c(e.data)},function(e){t.port2.postMessage(e)}):l&&"onreadystatechange"in l.createElement("script")?(s=l.documentElement,function(e){var t=l.createElement("script");t.onreadystatechange=function(){c(e),t.onreadystatechange=null,s.removeChild(t),t=null},s.appendChild(t)}):function(e){setTimeout(c,0,e)},e.setImmediate=function(e){"function"!=typeof e&&(e=new Function(""+e));for(var t=new Array(arguments.length-1),r=0;r parseInt(o, 16))); + } break; + case "binary": { + if (!/^(?:[01]{8})*$/i.test(DATA)) return; + const dataArr = this.splitIntoParts(DATA, 8); + DATA = Uint8Array.from(dataArr.map(o => parseInt(o, 2))); + } break; + } + + this.zip = await JSZip.loadAsync(DATA, { createFolders: true }); + this.zipPath = "/"; + } catch (e) { + console.error("Zip extension: Could not open zip file.", e); + } + } + async getZip({ TYPE, COMPRESSION }) { + if (!this.zip) return ""; + try { + COMPRESSION = Scratch.Cast.toNumber(COMPRESSION); + COMPRESSION = Math.max(Math.min(Math.round(COMPRESSION), 9), 0); + + const compType = COMPRESSION === 0 ? "STORE" : "DEFLATE"; + const options = { compression: compType, compressionOptions: { level: COMPRESSION } }; + + switch (TYPE) { + case "text": + case "string": + return await this.zip.generateAsync({ + type: "binarystring", + ...options + }); + case "base64": + case "data: URL": { + let data = await this.zip.generateAsync({ + type: "base64", + ...options + }); + if (TYPE === "data: URL") + data = "data:application/zip;base64," + data; + return data; + } + case "hex": { + const data = await this.zip.generateAsync({ + type: "array", + ...options + }); + return data.map(data => data.toString(16).padStart(2, "0")).join(""); + } + case "binary": { + const data = await this.zip.generateAsync({ + type: "array", + ...options + }); + return data.map(data => data.toString(2).padStart(8, "0")).join(""); + } + default: return ""; + } + } catch (e) { + console.error(`Zip extension: Error creating zip with type ${TYPE} compression ${COMPRESSION}:`, e); + } + } + close() { + this.zip = null; + this.zipPath = null; + } + isOpen() { + return !!this.zip; + } + + exists({ OBJECT }) { + try { + return !!this.getObj(this.normalize(this.zipPath, Scratch.Cast.toString(OBJECT))); + } catch (e) { + return false; + } + } + async getFile({ FILE, TYPE }) { + if (!this.zip) return ""; + + FILE = Scratch.Cast.toString(FILE); + TYPE = Scratch.Cast.toString(TYPE); + try { + const path = this.normalize(this.zipPath, FILE); + if (path.endsWith("/")) return ""; + const obj = this.getObj(path); + if (!obj || obj.dir) return ""; + + switch (TYPE) { + case "text": + return await obj.async("string"); + case "base64": + case "data: URL": { + let data = await obj.async("base64"); + if (TYPE === "data: URL") + data = "data:application/octet-stream;base64," + data; + return data; + } + case "hex": { + const data = await obj.async("array"); + return data.map(data => data.toString(16).padStart(2, "0")).join(""); + } + case "binary": { + const data = await obj.async("array"); + return data.map(data => data.toString(2).padStart(8, "0")).join(""); + } + default: return ""; + } + } catch (e) { + console.error(`Zip extension: Error getting file ${FILE} with type ${TYPE}:`, e); + return ""; + } + } + async writeFile({ FILE, CONTENT, TYPE }) { + if (!this.zip) return; + + FILE = Scratch.Cast.toString(FILE); + CONTENT = Scratch.Cast.toString(CONTENT); + TYPE = Scratch.Cast.toString(TYPE); + try { + let path = this.normalize(this.zipPath, FILE); + if (path.endsWith("/")) return; + + const obj = this.getObj(path); + if (obj && obj.dir) return; + + if (path.startsWith("/")) path = path.substring(1); + + switch (TYPE) { + case "text": + this.zip.file(path, CONTENT, { + createFolders: true, + }); + break; + case "base64": + case "data: URL": { // compatibility + if (TYPE === "data: URL") + CONTENT = CONTENT.substring(CONTENT.indexOf(",")); + this.zip.file(path, CONTENT, { + base64: true, + createFolders: true, + }); + break; + } + case "URL": { + const resp = await Scratch.fetch(CONTENT); + this.zip.file(path, await resp.blob(), { + base64: true, + createFolders: true, + }); + } break; + case "hex": { + if (!/^(?:[0-9A-F]{2})*$/i.test(CONTENT)) return ""; + const dataArr = this.splitIntoParts(CONTENT, 2); + const data = Uint8Array.from(dataArr.map(o => parseInt(o, 16))); + this.zip.file(path, data, { + createFolders: true, + }); + } break; + case "binary": { + if (!/^(?:[01]{8})*$/i.test(CONTENT)) return ""; + const dataArr = this.splitIntoParts(CONTENT, 8); + const data = Uint8Array.from(dataArr.map(o => parseInt(o, 2))); + this.zip.file(path, data, { + createFolders: true, + }); + } break; + default: return ""; + } + } catch (e) { + console.error(`Zip extension: Error writing to file ${FILE} type ${TYPE}:`, e); + } + } + renameFile({ FROM, TO }) { + if (!this.zip) return; + + const renameOne = (from, to) => { + const obj = this.zip.files[from]; + this.zip.files[to] = obj; + obj.name = to; + delete this.zip.files[from]; + }; + + FROM = Scratch.Cast.toString(FROM); + TO = Scratch.Cast.toString(TO); + try { + let fromPath = this.normalize(this.zipPath, FROM); + let fromObj = this.getObj(fromPath); + if (!fromObj && !fromPath.endsWith("/")) { + fromPath += "/"; + fromObj = this.getObj(fromPath); + } + if (!fromObj) return; + let toPath = this.normalize(this.zipPath, TO); + const replacedTo = TO.replaceAll(/\\/g, "/"); + const slashes = replacedTo.split("/").length - 1; + if (slashes <= +fromObj.dir && (slashes === 0 || replacedTo.endsWith("/"))) { + // this is a name-only change + toPath = this.normalize(fromPath, "../" + replacedTo); + if (fromObj.dir) { + if (!fromPath.endsWith("/")) fromPath += "/"; + } else { + if (fromPath.endsWith("/")) return; + } + } + + if (fromPath.startsWith("/")) fromPath = fromPath.substring(1); + if (toPath.startsWith("/")) toPath = toPath.substring(1); + + // If this is a file, just renaming this one is enough + if (!fromObj.dir) { + renameOne(fromPath, toPath); + return; + } + + // Otherwise, we need to rename this object + // and everything else in it + if (!toPath.endsWith("/")) toPath += "/"; + + // Move current directory + if (this.zipPath.substring(1).startsWith(fromPath)) { + this.zipPath = + "/" + toPath + (this.zipPath.substring(1).substring(fromPath.length)); + } + + for (const path in this.zip.files) { + if (!path.startsWith(fromPath)) continue; + const extraPath = path.substring(fromPath.length); + renameOne(path, toPath + extraPath); + } + this.createFolders(toPath); + } catch (e) { + console.error(`Zip extension: Error renaming ${FROM} to ${TO}:`, e); + } + } + deleteFile({ FILE }) { + if (!this.zip) return; + + FILE = Scratch.Cast.toString(FILE); + try { + let path = this.normalize(this.zipPath, FILE); + if (!this.getObj(path)) return; + if (path === "/") return; + + const shouldGoBack = this.getObj(path).dir && this.zipPath.startsWith(path); + if (path.startsWith("/")) path = path.substring(1); + + + this.zip.remove(path); + + if (shouldGoBack) { + // Go back until we are in a directory that exists + const split = this.zipPath.split("/"); + this.zipPath = ""; + + let i = 0; + while (i < split.length) { + if (split[i] === "") { + i++; + continue; + } + const newPath = this.zipPath + split[i] + "/"; + if (!this.getObj(newPath)) break; + this.zipPath = newPath; + i++; + } + if (this.zipPath === "") this.zipPath = "/"; + } + } catch (e) { + console.error(`Zip extension: Error deleting file ${FILE}:`, e); + } + } + + setFileMeta({ META, FILE, VALUE }) { + if (!this.zip) return; + + META = Scratch.Cast.toString(META); + FILE = Scratch.Cast.toString(FILE); + VALUE = Scratch.Cast.toString(VALUE); + try { + const normalized = this.normalize(this.zipPath, FILE); + const obj = this.getObj(normalized); + if (!obj) return ""; + switch (META) { + case "modified days since 2000": { + const msPerDay = 24 * 60 * 60 * 1000; + const start = +(new Date(2000, 0, 1)); + obj.date = new Date(start + (Scratch.Cast.toNumber(VALUE) * msPerDay)); + } break; + case "unix modified timestamp": + obj.date = new Date(Scratch.Cast.toNumber(VALUE)); + break; + case "comment": + obj.comment = VALUE; + break; + default: return; + } + } catch (e) { + console.error(`Zip extension: Error getting ${META} of ${FILE}:`, e); + return ""; + } + } + getFileMeta({ META, FILE }) { + if (!this.zip) return ""; + + META = Scratch.Cast.toString(META); + FILE = Scratch.Cast.toString(FILE); + try { + const normalized = this.normalize(this.zipPath, FILE); + const obj = this.getObj(normalized); + if (!obj) return ""; + switch (META) { + case "name": { + const splitPath = obj.name.split("/"); + // Directories have an extra slash at the end + // (obj.dir is casted to 0 or 1) + return splitPath[splitPath.length - 1 - +obj.dir] || ""; + } + case "path": + return "/" + obj.name; + case "folder": { + /** @type {Array} */ + const splitPath = obj.name.split("/"); + const folders = (splitPath.slice( + 0, splitPath.length - 1 - +obj.dir + ).join("/")); + return "/" + folders + (folders === "" ? "" : "/"); + } + case "modification date": + return obj.date.toLocaleString(navigator.language); + case "long modification date": + return new Date().toLocaleString( + navigator.language, + { dateStyle: "full", timeStyle: "medium" } + ); + case "modified days since 2000": { + const msPerDay = 24 * 60 * 60 * 1000; + const start = +(new Date(2000, 0, 1)); + return (+obj.date - start) / msPerDay; + } + case "unix modified timestamp": + return +obj.date; + case "comment": + return obj.comment || ""; + default: return ""; + } + } catch (e) { + console.error(`Zip extension: Error getting ${META} of ${FILE}:`, e); + return ""; + } + } + + createDir({ DIR }) { + if (!this.zip) return; + DIR = Scratch.Cast.toString(DIR); + try { + let newPath = this.normalize(this.zipPath, DIR); + if (!newPath.endsWith("/")) newPath += "/"; + if (newPath.startsWith("/")) newPath = newPath.substring(1); + if (this.getObj(newPath)) return; + this.zip.folder(newPath); + } catch (e) { + console.error(`Error creating directory ${DIR}:`, e); + } + } + goToDir({ DIR }) { + if (!this.zip) return; + DIR = Scratch.Cast.toString(DIR); + try { + let newPath = this.normalize(this.zipPath, DIR); + if (!newPath.endsWith("/")) newPath += "/"; + if (!this.getObj(newPath)) return; + this.zipPath = newPath; + } catch (e) { + console.error(`Error going to directory ${DIR}:`, e); + } + } + getDir({ DIR }) { + if (!this.zip) return ""; + try { + DIR = Scratch.Cast.toString(DIR); + if (!DIR.endsWith("/")) DIR += "/"; + + const normalized = this.normalize(this.zipPath, DIR); + if (!this.getObj(normalized) && normalized !== "/") return ""; + const dir = normalized.substring(1); + const length = dir.length; + + return JSON.stringify(Object.values(this.zip.files).filter((obj) => { + // Above the current directory + if (!obj.name.startsWith(dir)) return false; + // Below the current directory + if (obj.name.substring(length).split("/").length > (obj.dir + 1)) return false; + // Is the current directory + if (obj.name === dir) return false; + return true; + }).map(obj => obj.name.substring(length))); + } catch (e) { + console.error(`Zip extension: Could not get directory ${DIR}:`, e); + return ""; + } + } + currentDir() { + return this.zipPath || ""; + } + + setComment({ COMMENT }) { + if (!this.zip) return; + this.zip.comment = Scratch.Cast.toString(COMMENT); + } + getComment({ COMMENT }) { + if (!this.zip) return ""; + return this.zip.comment || ""; + } + + normalizePath({ ORIGIN, PATH }) { + try { + return this.normalize( + Scratch.Cast.toString(ORIGIN), + Scratch.Cast.toString(PATH) + ); + } catch (e) { + return ""; + } + } + } + + // @ts-ignore + Scratch.extensions.register(new ZipExt()); +})(globalThis.Scratch); diff --git a/images/CST1229/zip.svg b/images/CST1229/zip.svg new file mode 100644 index 0000000000..60bb67ca79 --- /dev/null +++ b/images/CST1229/zip.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/CST1229/images/zip-close.svg b/website/CST1229/images/zip-close.svg new file mode 100644 index 0000000000..2f6a2c2513 --- /dev/null +++ b/website/CST1229/images/zip-close.svg @@ -0,0 +1,14 @@ +close archive \ No newline at end of file diff --git a/website/CST1229/images/zip-create-dir.svg b/website/CST1229/images/zip-create-dir.svg new file mode 100644 index 0000000000..874586f431 --- /dev/null +++ b/website/CST1229/images/zip-create-dir.svg @@ -0,0 +1,14 @@ +new foldercreate directory \ No newline at end of file diff --git a/website/CST1229/images/zip-create-empty.svg b/website/CST1229/images/zip-create-empty.svg new file mode 100644 index 0000000000..f7e8fe7a6b --- /dev/null +++ b/website/CST1229/images/zip-create-empty.svg @@ -0,0 +1,14 @@ +create empty archive \ No newline at end of file diff --git a/website/CST1229/images/zip-current-dir.svg b/website/CST1229/images/zip-current-dir.svg new file mode 100644 index 0000000000..d96fc8da98 --- /dev/null +++ b/website/CST1229/images/zip-current-dir.svg @@ -0,0 +1,14 @@ +current directory path \ No newline at end of file diff --git a/website/CST1229/images/zip-delete.svg b/website/CST1229/images/zip-delete.svg new file mode 100644 index 0000000000..43fd396b76 --- /dev/null +++ b/website/CST1229/images/zip-delete.svg @@ -0,0 +1,14 @@ +hello.txtdelete \ No newline at end of file diff --git a/website/CST1229/images/zip-dir-contents.svg b/website/CST1229/images/zip-dir-contents.svg new file mode 100644 index 0000000000..e9bc074c6f --- /dev/null +++ b/website/CST1229/images/zip-dir-contents.svg @@ -0,0 +1,14 @@ +.contents of directory \ No newline at end of file diff --git a/website/CST1229/images/zip-exists.svg b/website/CST1229/images/zip-exists.svg new file mode 100644 index 0000000000..bc351983e8 --- /dev/null +++ b/website/CST1229/images/zip-exists.svg @@ -0,0 +1,14 @@ +folder/exists? \ No newline at end of file diff --git a/website/CST1229/images/zip-file.svg b/website/CST1229/images/zip-file.svg new file mode 100644 index 0000000000..a996abcfed --- /dev/null +++ b/website/CST1229/images/zip-file.svg @@ -0,0 +1,14 @@ +hello.txttextfileas \ No newline at end of file diff --git a/website/CST1229/images/zip-get-comment.svg b/website/CST1229/images/zip-get-comment.svg new file mode 100644 index 0000000000..349a3f4462 --- /dev/null +++ b/website/CST1229/images/zip-get-comment.svg @@ -0,0 +1,14 @@ +archive comment \ No newline at end of file diff --git a/website/CST1229/images/zip-get-info.svg b/website/CST1229/images/zip-get-info.svg new file mode 100644 index 0000000000..a090926a6b --- /dev/null +++ b/website/CST1229/images/zip-get-info.svg @@ -0,0 +1,14 @@ +namefolder/dango.pngof \ No newline at end of file diff --git a/website/CST1229/images/zip-goto-dir.svg b/website/CST1229/images/zip-goto-dir.svg new file mode 100644 index 0000000000..03df84e034 --- /dev/null +++ b/website/CST1229/images/zip-goto-dir.svg @@ -0,0 +1,14 @@ +foldergo to directory \ No newline at end of file diff --git a/website/CST1229/images/zip-is-open.svg b/website/CST1229/images/zip-is-open.svg new file mode 100644 index 0000000000..12d39065d7 --- /dev/null +++ b/website/CST1229/images/zip-is-open.svg @@ -0,0 +1,14 @@ +archive is open? \ No newline at end of file diff --git a/website/CST1229/images/zip-open.svg b/website/CST1229/images/zip-open.svg new file mode 100644 index 0000000000..ce9e5b08df --- /dev/null +++ b/website/CST1229/images/zip-open.svg @@ -0,0 +1,14 @@ +URLhttps://extensions.turbowarp.org/hello.zipopen zip from \ No newline at end of file diff --git a/website/CST1229/images/zip-output.svg b/website/CST1229/images/zip-output.svg new file mode 100644 index 0000000000..738d44354a --- /dev/null +++ b/website/CST1229/images/zip-output.svg @@ -0,0 +1,14 @@ +data: URL6output zip typecompression level \ No newline at end of file diff --git a/website/CST1229/images/zip-path.svg b/website/CST1229/images/zip-path.svg new file mode 100644 index 0000000000..e3d64b99cb --- /dev/null +++ b/website/CST1229/images/zip-path.svg @@ -0,0 +1,14 @@ +../folder3//folder/folder2pathfrom \ No newline at end of file diff --git a/website/CST1229/images/zip-rename.svg b/website/CST1229/images/zip-rename.svg new file mode 100644 index 0000000000..01738cc4c7 --- /dev/null +++ b/website/CST1229/images/zip-rename.svg @@ -0,0 +1,14 @@ +hello.txthello renamed.txtrenameto \ No newline at end of file diff --git a/website/CST1229/images/zip-set-comment.svg b/website/CST1229/images/zip-set-comment.svg new file mode 100644 index 0000000000..6f159602a5 --- /dev/null +++ b/website/CST1229/images/zip-set-comment.svg @@ -0,0 +1,14 @@ +any textset archive comment to \ No newline at end of file diff --git a/website/CST1229/images/zip-set-meta.svg b/website/CST1229/images/zip-set-meta.svg new file mode 100644 index 0000000000..6973702608 --- /dev/null +++ b/website/CST1229/images/zip-set-meta.svg @@ -0,0 +1,14 @@ +modified days since 2000folder/dango.png0setofto \ No newline at end of file diff --git a/website/CST1229/images/zip-write.svg b/website/CST1229/images/zip-write.svg new file mode 100644 index 0000000000..2b08c5b107 --- /dev/null +++ b/website/CST1229/images/zip-write.svg @@ -0,0 +1,14 @@ +new file.txtHello, world?textwrite filecontenttype \ No newline at end of file diff --git a/website/CST1229/zip.html b/website/CST1229/zip.html new file mode 100644 index 0000000000..0c2b767646 --- /dev/null +++ b/website/CST1229/zip.html @@ -0,0 +1,551 @@ + + + + + + + Zip docs + + + + +
+

Zip extension documentation

+
+
+

+ The Zip extension allows you to read, create and edit .zip format files, + including Scratch project and sprite files + (.sb3, .sprite3). +

+ +

+ Paths + (link) +

+

Most blocks in this extension work with a path format:

+
    +
  • + The path is relative to the current directory by default +
  • +
  • + Directories (folders) and the filename are separated by slashes, like + folder1/folder2/file.txt +
  • +
  • + .. goes to the parent directory, like + ../file.txt +
  • +
  • + . goes to the current directory, like + ./file.txt +
  • +
  • + A / at the very start goes to the root directory, like + /file.txt +
  • +
  • + A / at the end denotes a directory, like + folder/ +
  • +
  • + + Multiple slashes in a row or trying to go above the root directory will + result in an error (usually the block doing nothing or returning the + empty value) +
  • +
+ +

+ + Archive management blocks + (link) +

+

+ Blocks for creating and saving the current archive. + Only one archive can be open at a time. +

+ +

+ create empty archive + (link) +

+

+ Creates and opens an empty archive with nothing in it. +

+ +

+ open zip from [URL] [https://extensions.turbowarp.org/hello.zip] + (link) +

+

+ Opens a .zip (or .sb3 or .sprite3...) file. +

+

+ The type can be one of the following: +

+
    +
  • + URL: A URL, which can be either a web URL or data: URL. Recommended. +
  • +
  • + base64: A base64 string without the data URL header. +
  • +
  • + hex: A sequence of hexadecimal bytes + (like 101A1B1C), + without a separator. +
  • +
  • + binary: A sequence of binary bytes + (like 000000010010101001101011), + without a separator. +
  • +
  • + string: Plain text. + Not recommended! + Text encoding behavior will likely break it, as it's a binary file. +
  • +
+

+ If the file is not of zip format (e.g RAR or 7z) or is password-protected, + it won't be opened. + Make sure to check if it loaded successfully with the + archive is open? block. +

+ +

+ output zip type [data: URL] compression level [6] + (link) +

+

+ Save the zip data into a string, which can be saved with e.g the Files extension. +

+

+ The type can be one of the following: +

+
    +
  • + data: URL: A base64-encoded data URL. Recommended. +
  • +
  • + base64: A base64 string without the data URL header. +
  • +
  • + hex: A sequence of hexadecimal bytes + (like 101A1B1C), + without a separator. +
  • +
  • + binary: A sequence of binary bytes + (like 000000010010101001101011), + without a separator. +
  • +
  • + string: Plain text. + Not recommended! + Text encoding behavior will likely break it, as it's a binary file. +
  • +
+

+ The compression level decides how much the zip is compressed. +
+ Lower compression levels will result in a bigger file, + but are faster to create. Usually, high compression levels + provide diminishing returns (lesser gains the higher you go) + with much slower speeds. +
+ A compression level of 0 (no compression) is the fastest, + but will often result in a very big file. +

+ +

+ close archive + (link) +

+

Closes the archive. Use after you're done working with it.

+ +

+ archive is open? + (link) +

+

Returns true if an archive is open.

+ + +

+ File blocks + (link) +

+

+ Blocks for working with files + (and blocks that are general to both files and folders/directories.) +

+ +

+ [folder/] exists? + (link) +

+

+ Returns if a file or directory exists or not. + The slash at the end matters! + If a directory named folder exists, + [folder] exists? will return false, + but [folder/] exists? will return true. +

+ +

+ write file [new file.txt] content [Hello, world?] type [text] + (link) +

+

+ Writes content to a file, creating the file if it doesn't exist + and replacing its existing data if it does. +

+

+ The type can be one of the following: +

+
    +
  • + text: Plain text. +
  • +
  • + URL: A URL, which can be either a web URL or data: URL. + Best for binary data (like other zip files). +
  • +
  • + base64: A base64 string without the data URL header. +
  • +
  • + hex: A sequence of hexadecimal bytes + (like 101A1B1C), + without a separator. +
  • +
  • + binary: A sequence of binary bytes + (like 000000010010101001101011), + without a separator. +
  • +
+ +

+ rename [hello.txt] to [hello renamed.txt] + (link) +

+

+ Renames a file or directory to another name. + If the target file already exists, it will be overwritten. + The current directory will also be updated. + This block can also be used to move files to a different directory. +

+ +

+ delete [hello.txt] + (link) +

+

+ Deletes a file or directory (including everything in it). +
+ If the current directory is in that directory, it will + be set to the closest existing parent directory. +

+ +

+ file [hello.txt] as [text] + (link) +

+

+ Get the contents of a file. +

+

+ The type can be one of the following: +

+
    +
  • + text: Plain text. +
  • +
  • + data: URL: A base64-encoded data URL. + Best for binary data (like other zip files). +
  • +
  • + base64: A base64 string without the data URL header. +
  • +
  • + hex: A sequence of hexadecimal bytes + (like 101A1B1C), + without a separator. +
  • +
  • + binary: A sequence of binary bytes + (like 000000010010101001101011), + without a separator. +
  • +
+ +

+ File info blocks + (link) +

+

Blocks for getting and setting additional information on a file.

+ +

+ set [unix modified timestamp] of [folder/dango.png] to [0] + (link) +

+

+ Set additional info on a file or directory. +

+

+ Available options: +

+
    +
  • + modified days since 2000: + The modification date of the file, as days since 2000. +
  • +
  • + unix modified timestamp: + The modification date of the file, as a Unix timestamp (milliseconds since 1970). + Useful when combined with e.g the Time extension. +
  • +
  • + comment: A comment on the file. Can be any text. + Some programs may show this as metadata. +
  • +
+ +

+ [name] of [folder/dango.png] + (link) +

+

+ Get additional info on a file or directory. +

+

+ Available options: +

+
    +
  • + name: + Just the name of this file (without the directories it's in). + For example, the name of /folder1/folder2/dango.png + would be dango.png. +
  • +
  • + path: The full absolute path of this file + (its name and any directories it's in). +
  • +
  • + folder: + Just the folders this file is in (without its filename). + For example, the folder of /folder1/folder2/dango.png + would be /folder1/folder2/. +
  • +
  • + modification date: + A human-readable version of the file's modification date. + The output of this depends on the browser's language and possibly other factors. +
  • +
  • + long modification date: + A longer human-readable version of the file's modification date. + The output of this depends on the browser's language and possibly other factors. +
  • +
  • + modified days since 2000: + The modification date of the file, as days since 2000. +
  • +
  • + unix modified timestamp: + The modification date of the file, as a Unix timestamp (milliseconds since 1970). + Useful when combined with e.g the Time extension. +
  • +
  • + comment: A comment on the file. Can be any text. + Some programs may show this as metadata. +
  • +
+ +

+ Directory blocks + (link) +

+

Blocks that deal with directories and the current directory.

+ + +

+ create directory [new folder] + (link) +

+

+ Creates a directory with a name. This can create multiple directories + at once (by having multiple directores in the path, like + /new folder1/new folder2/new folder3/). +

+ +

+ go to [folder] + (link) +

+

+ Moves the current directory (the default origin of most file operations) + to the speficied directory. If it doesn't exist, this block will do nothing. +

+ +

+ contents of directory [.] + (link) +

+

+ Returns a list of files in a directory, as JSON + (which you can parse with the JSON extension). +

+ +

+ current directory path + (link) +

+

+ Returns the absolute path to the current directory. +

+ +

+ Other blocks + (link) +

+

+ Miscellaneous stuff. +

+ +

+ set archive comment to [any text] + (link) +

+

+ Sets the archive's comment to some text. Just like file comments, + this is saved and may be displayed as metadata by some programs. +

+ +

+ archive comment + (link) +

+

+ Returns the archive's comment. +

+ +

+ path [../folder3/] from [/folder/folder2] + (link) +

+

+ Returns an absolute path from an origin path and a target path. + Does not depend on the archive, so it works without one open. + This is mostly a utility used internally, but it might + be useful for users too. +

+
+ + + \ No newline at end of file diff --git a/website/hello.zip b/website/hello.zip new file mode 100644 index 0000000000000000000000000000000000000000..18f132bee47d3cd3da686309053c891af1c16961 GIT binary patch literal 3055 zcmZ{m2{=@HAIHy(v5X;Rh-{f+s7sct-7BN9ja@2S+1F?op)56K$ePG9MNvuIAGKyG#LA9C;;q@+!aW?&WXucln66+3_FGQ4GZ@O@d3ia!&Ur)&WCz= z1pBDqL;P}Q^&~mQH)cjBPDk|5+$G?o{A5}T9h~?Psu*m%`nWKTYTrL!$ls7oGD9{f z7#Q>2>=T5D+!WsA%7MK8daQa;IOC(w^_W3QAWpFid*zaomVZ^*6!|w5izHgmR=2`a z+C=4}&Ob_SYDTZm>qSpkBxU6hR=ysm%_$OmMsBPK5%pK!Fotf4W$^>wLVVN+e)^QT z505ua$#3Eds3npdV-L&wH={CW)JW$ccC8ogmd=z*?i0_MO=KAHJo@KZ%`#3uRJ|R_9EH%)A=# z7k772(cL@(p7oZYm&$MJZP#a*iZH&@1R+t>SU!(=THV@#u<|Tq>)k50aVLqY}Eh z6%zhhW!yQXJm}gT*=PImsu0nSEOcQ5i?XIpf^dUL*F9_;O~18d>`5Z=NNCEyV!nx| zg81FZt}b@BB3i0)?^Y>-8TK5G2usN~i)vao&&Q|u)<+e#2@KR?pMnq+y})vp*}iFk zdUASn`X2X;J8dt7Ela8r-S)U#;@rw!`^s#J)xEL4Tpi>S#`WP2MZ`xbU{jxyrb#fmtiun`kb9cYDZ0m_tQ?IKU!A$UcOwL z6A#f_#bwN6&t>^yp#zAVg1}s%P;Y)`-GQ|EK0aK%;0UIaf1Dr|5zRf_u25NW6?dt@b zK_~CpVh(`rnG`g0>&~1Tzk0Y8O#m;nB;IEY*7c;5!RhHd*fayobmFTeorQJ2rgw7< zr#}Y*jXzVOuL8F{T9%jJ4%zOL0q83LC{VLJb6U~vitN&g)ggdj(FbL|^*cbsLHILT z&d1bU$?Vqim)L)m!h)yufx6Kz*1y~%q4|Y3QzDr==oI1b`7IUJPP{zP*&-X6`H*|Gem1`&-BR)wza=S}@bi1UWSZKmC`;JBrk5 zU)ti7m6+Y23+^R&iC-$V0XuK(gc-k;hNwCP#=z%aAT7aa}cDWimRi1 z$oSg`WbcYTCBTvdDum>0E&h^T0taQ5Sr-|qHlbdLhBr);!`_uw6UY08-J;|c=CIKN zJ!BXCPJ#`x@CqMZ!>x)tc)Kl`t}4vzf2_SP`NfI+LJ~f(dbpQ-z|Cl#U}N;@+EPjd za3TBDeYXS2@bRlBBcDba2%3iR_jtQ2qeaJ~MI(kzR?-eH3CMVN5-Or^+H zEWaLkW`ozi03o7zze*_U`L*w9Fr&{KoNGd+5}llsJEBk;rPbDG_$qDsx+7EjJE z5?lfruRPrq0IR%ZLnXFjz?I3VAMAUvOR zfi0W*^LXkJE5w5@BT~;}UejL{F?w5HY@3)0HN^=^cknj_j+8oEiIZk0*YlKswSrmM z#pec^s2~(Itb%*r^`Ab7Aq!ZcB0o39bwc_VefN(BYi`*sM0Z|<*&uMp3a+l}y^Tpd zh0$kfKuyyM&=wQ20dP&SeKzq3( zf+}@#*06-2=w?+ zlO%iF(_MN_uEg)exi0~0^D6T^Yd7=ym13hXu7TWY*F~qKc&DrENM`w!%3E3%!Z+(v zM5hjIu#c}FbbA4gM*9ys#Ma+|L|d70gJW{jJ-6RC3Z3oUDmNwtAm}ny6u;&I`ngSo z1x+iRTJDIGt`)$0tXhIi{q4(K>Z`T(m0;Cnvu4yFY8&*4=b>8ha6+Qi*j10;*7qOq3IdA){~vleR!&3y*?&i1TZ_L<|IEC9W$%KmHb>tH_;1rc zGw@#~BqyBxVfs$QKaTv%{lE47aMyB*`ChH91@|s30}#%|;KW7FCNJQH4-E7P3i}rz C4@Z^& literal 0 HcmV?d00001 diff --git a/website/index.ejs b/website/index.ejs index fd3812c909..c785b75872 100644 --- a/website/index.ejs +++ b/website/index.ejs @@ -644,6 +644,12 @@

Create disposable runtime or thread variables. Created by LilyMakesThings.

+
+ <%- banner('CST1229/zip') %> +

Zip

+

Create and edit .zip format files, including .sb3 files. Created by CST1229.

+
+
<%- banner('0832/rxFS2') %>

rxFS