", {"class": "error"});
285 |
286 | container.append(this.fileInput);
287 | container.append(label);
288 |
289 | $("
Supported Versions:
").appendTo(container);
290 | $("
Click name to preview patches
").appendTo(container);
291 | container.append(supportedDlls);
292 | container.append(this.successDiv);
293 | container.append(this.errorDiv);
294 | $("body").append(container);
295 | }
296 |
297 | loadFile(file) {
298 | var reader = new FileReader();
299 | var self = this;
300 |
301 | reader.onload = function (e) {
302 | var found = false;
303 | // clear logs
304 | self.errorDiv.empty();
305 | self.successDiv.empty();
306 | for (var i = 0; i < self.patchers.length; i++) {
307 | // reset text and buttons
308 | self.forceLoadButtons[i].hide();
309 | self.forceLoadTexts[i].text('');
310 | self.matchSuccessText[i].text('');
311 | var patcher = self.patchers[i];
312 | // remove the previous UI to clear the page
313 | patcher.destroyUI();
314 | // patcher UI elements have to exist to load the file
315 | patcher.createUI();
316 | patcher.container.hide();
317 | patcher.loadBuffer(e.target.result);
318 | if (patcher.validatePatches()) {
319 | found = true;
320 | loadPatch(this, self, patcher);
321 | // show patches matched for 100% - helps identify which version is loaded
322 | var valid = patcher.validPatches;
323 | self.matchSuccessText[i].text(' ' + valid + ' of ' + valid + ' patches matched (100%) ');
324 | }
325 | }
326 |
327 | if (!found) {
328 | // let the user force a match
329 | for (var i = 0; i < self.patchers.length; i++) {
330 | var patcher = self.patchers[i];
331 |
332 | var valid = patcher.validPatches;
333 | var percent = (valid / patcher.totalPatches * 100).toFixed(1);
334 |
335 | self.forceLoadTexts[i].text(' ' + valid + ' of ' + patcher.totalPatches + ' patches matched (' + percent + '%) ');
336 | self.forceLoadButtons[i].show();
337 | self.forceLoadButtons[i].off('click');
338 | self.forceLoadButtons[i].click(function(i) {
339 | // reset old text
340 | for(var j = 0; j < self.patchers.length; j++) {
341 | self.forceLoadButtons[j].hide();
342 | self.forceLoadTexts[j].text('');
343 | }
344 |
345 |
346 | loadPatch(this, self, self.patchers[i]);
347 | }.bind(this, i));
348 | }
349 | self.errorDiv.html("No patch set was a 100% match.");
350 | }
351 | };
352 |
353 | reader.readAsArrayBuffer(file);
354 | }
355 | }
356 |
357 | class Patcher {
358 | constructor(fname, description, args) {
359 | this.mods = [];
360 | for(var i = 0; i < args.length; i++) {
361 | var mod = args[i];
362 | if(mod.type) {
363 | if(mod.type === "union") {
364 | this.mods.push(new UnionPatch(mod));
365 | }
366 | } else { // standard patch
367 | this.mods.push(new StandardPatch(mod));
368 | }
369 | }
370 |
371 | this.filename = fname;
372 | this.description = description;
373 | this.multiPatcher = true;
374 |
375 | if (!this.description) {
376 | // old style patcher, use the old method to generate the UI
377 | this.multiPatcher = false;
378 | this.createUI();
379 | this.loadPatchUI();
380 | }
381 | }
382 |
383 | createUI() {
384 | var self = this;
385 | this.container = $("
", {"class": "patchContainer"});
386 | var header = this.filename;
387 | if(this.description === "string") {
388 | header += ' (' + this.description + ')';
389 | }
390 | this.container.html('
' + header + '
');
391 |
392 | this.successDiv = $("
", {"class": "success"});
393 | this.errorDiv = $("
", {"class": "error"});
394 | this.patchDiv = $("
", {"class": "patches"});
395 |
396 | var saveButton = $("
").appendTo(a),a.find(".mdui-textfield-counter-inputed").text(s.length.toString())),(a.find(".mdui-textfield-helper").length||a.find(".mdui-textfield-error").length||h)&&a.addClass("mdui-textfield-has-bottom")}}function Wt(t){var e=t.data(),n=e._slider_$track,i=e._slider_$fill,o=e._slider_$thumb,s=e._slider_$input,r=e._slider_min,a=e._slider_max,u=e._slider_disabled,c=e._slider_discrete,l=e._slider_$thumbText,d=s.val(),h=(d-r)/(a-r)*100;i.width(h+"%"),n.width(100-h+"%"),u&&(i.css("padding-right","6px"),n.css("padding-left","6px")),o.css("left",h+"%"),c&&l.text(d),0==h?t.addClass("mdui-slider-zero"):t.removeClass("mdui-slider-zero")}function Yt(t){var e=L('
'),n=L('
'),i=L('
'),o=t.find('input[type="range"]'),s=o[0].disabled,r=t.hasClass("mdui-slider-discrete");s?t.addClass("mdui-slider-disabled"):t.removeClass("mdui-slider-disabled"),t.find(".mdui-slider-track").remove(),t.find(".mdui-slider-fill").remove(),t.find(".mdui-slider-thumb").remove(),t.append(e).append(n).append(i);var a=L();r&&(a=L("
"),i.empty().append(a)),t.data("_slider_$track",e),t.data("_slider_$fill",n),t.data("_slider_$thumb",i),t.data("_slider_$input",o),t.data("_slider_min",o.attr("min")),t.data("_slider_max",o.attr("max")),t.data("_slider_disabled",s),t.data("_slider_discrete",r),t.data("_slider_$thumbText",a),Wt(t)}L(function(){gt.on("input focus blur",".mdui-textfield-input",{useCapture:!0},qt),gt.on("click",".mdui-textfield-expandable .mdui-textfield-icon",function(){L(this).parents(".mdui-textfield").addClass("mdui-textfield-expanded").find(".mdui-textfield-input")[0].focus()}),gt.on("click",".mdui-textfield-expanded .mdui-textfield-close",function(){L(this).parents(".mdui-textfield").removeClass("mdui-textfield-expanded").find(".mdui-textfield-input").val("")}),B.mutation(".mdui-textfield",function(){L(this).find(".mdui-textfield-input").trigger("input",{domLoadedEvent:!0})})}),B.updateTextFields=function(t){(O(t)?L(".mdui-textfield"):L(t)).each(function(t,e){L(e).find(".mdui-textfield-input").trigger("input",{reInit:!0})})};var Ut='.mdui-slider input[type="range"]';L(function(){gt.on("input change",Ut,function(){Wt(L(this).parent())}),gt.on(jt,Ut,function(t){Lt(t)&&(Bt(t),this.disabled||L(this).parent().addClass("mdui-slider-focus"))}),gt.on(At,Ut,function(t){Lt(t)&&(this.disabled||L(this).parent().removeClass("mdui-slider-focus"))}),gt.on(Rt,Ut,Bt),B.mutation(".mdui-slider",function(){Yt(L(this))})}),B.updateSliders=function(t){(O(t)?L(".mdui-slider"):L(t)).each(function(t,e){Yt(L(e))})};function Xt(t,e){var n=this;void 0===e&&(e={}),this.options=X({},Vt),this.state="closed",this.$element=L(t).first(),X(this.options,e),this.$btn=this.$element.find(".mdui-fab"),this.$dial=this.$element.find(".mdui-fab-dial"),this.$dialBtns=this.$dial.find(".mdui-fab"),"hover"===this.options.trigger&&(this.$btn.on("touchstart mouseenter",function(){return n.open()}),this.$element.on("mouseleave",function(){return n.close()})),"click"===this.options.trigger&&this.$btn.on(jt,function(){return n.open()}),gt.on(jt,function(t){L(t.target).parents(".mdui-fab-wrapper").length||n.close()})}var Vt={trigger:"hover"};Xt.prototype.triggerEvent=function(t){vt(t,"fab",this.$element,this)},Xt.prototype.isOpen=function(){return"opening"===this.state||"opened"===this.state},Xt.prototype.open=function(){var i=this;this.isOpen()||(this.$dialBtns.each(function(t,e){var n=15*(i.$dialBtns.length-t)+"ms";e.style.transitionDelay=n,e.style.webkitTransitionDelay=n}),this.$dial.css("height","auto").addClass("mdui-fab-dial-show"),this.$btn.find(".mdui-fab-opened").length&&this.$btn.addClass("mdui-fab-opened"),this.state="opening",this.triggerEvent("open"),this.$dialBtns.first().transitionEnd(function(){i.$btn.hasClass("mdui-fab-opened")&&(i.state="opened",i.triggerEvent("opened"))}))},Xt.prototype.close=function(){var t=this;this.isOpen()&&(this.$dialBtns.each(function(t,e){var n=15*t+"ms";e.style.transitionDelay=n,e.style.webkitTransitionDelay=n}),this.$dial.removeClass("mdui-fab-dial-show"),this.$btn.removeClass("mdui-fab-opened"),this.state="closing",this.triggerEvent("close"),this.$dialBtns.last().transitionEnd(function(){t.$btn.hasClass("mdui-fab-opened")||(t.state="closed",t.triggerEvent("closed"),t.$dial.css("height",0))}))},Xt.prototype.toggle=function(){this.isOpen()?this.close():this.open()},Xt.prototype.show=function(){this.$element.removeClass("mdui-fab-hide")},Xt.prototype.hide=function(){this.$element.addClass("mdui-fab-hide")},Xt.prototype.getState=function(){return this.state},B.Fab=Xt;var Jt="mdui-fab";L(function(){gt.on("touchstart mousedown mouseover","["+Jt+"]",function(){new B.Fab(this,Ct(this,Jt))})});function Kt(t,e){var n=this;void 0===e&&(e={}),this.$element=L(),this.options=X({},Gt),this.size=0,this.$selected=L(),this.$menu=L(),this.$items=L(),this.selectedIndex=0,this.selectedText="",this.selectedValue="",this.state="closed",this.$native=L(t).first(),this.$native.hide(),X(this.options,e),this.uniqueID=L.guid(),this.handleUpdate(),gt.on("click touchstart",function(t){var e=L(t.target);!n.isOpen()||e.is(n.$element)||P(n.$element[0],e[0])||n.close()})}var Gt={position:"auto",gutter:16};Kt.prototype.readjustMenu=function(){var t,e,n=yt.height(),i=this.$element.height(),o=this.$items.first(),s=o.height(),r=parseInt(o.css("margin-top")),a=this.$element.innerWidth()+.01,u=s*this.size+2*r,c=this.$element[0].getBoundingClientRect().top;if("bottom"===this.options.position)e=i,t="0px";else if("top"===this.options.position)e=-u-1,t="100%";else{var l=n-2*this.options.gutter;l
n&&(e=-(c+u+this.options.gutter-n)),t=this.selectedIndex*s+s/2+r+"px"}this.$element.innerWidth(a),this.$menu.innerWidth(a).height(u).css({"margin-top":e+"px","transform-origin":"center "+t+" 0"})},Kt.prototype.isOpen=function(){return"opening"===this.state||"opened"===this.state},Kt.prototype.handleUpdate=function(){var r=this;this.isOpen()&&this.close(),this.selectedValue=this.$native.val();var a=[];this.$items=L(),this.$native.find("option").each(function(t,e){var n=e.textContent||"",i=e.value,o=e.disabled,s=r.selectedValue===i;a.push({value:i,text:n,disabled:o,selected:s,index:t}),s&&(r.selectedText=n,r.selectedIndex=t),r.$items=r.$items.add('")}),this.$selected=L(''+this.selectedText+""),this.$element=L('').show().append(this.$selected),this.$menu=L('').appendTo(this.$element).append(this.$items),L("#"+this.uniqueID).remove(),this.$native.after(this.$element),this.size=parseInt(this.$native.attr("size")||"0"),this.size<=0&&(this.size=this.$items.length,8').appendTo(this.$element);var i=window.location.hash;i&&this.$tabs.each(function(t,e){return L(e).attr("href")!==i||(n.activeIndex=t,!1)}),-1===this.activeIndex&&this.$tabs.each(function(t,e){return!L(e).hasClass("mdui-tab-active")||(n.activeIndex=t,!1)}),this.$tabs.length&&-1===this.activeIndex&&(this.activeIndex=0),this.setActive(),yt.on("resize",L.throttle(function(){return n.setIndicatorPosition()},100)),this.$tabs.each(function(t,e){n.bindTabEvent(e)})}var te={trigger:"click",loop:!1};Zt.prototype.isDisabled=function(t){return void 0!==t.attr("disabled")},Zt.prototype.bindTabEvent=function(t){function e(){if(n.isDisabled(i))return!1;n.activeIndex=n.$tabs.index(t),n.setActive()}var n=this,i=L(t);i.on("click",e),"hover"===this.options.trigger&&i.on("mouseenter",e),i.on("click",function(){if(0===(i.attr("href")||"").indexOf("#"))return!1})},Zt.prototype.triggerEvent=function(t,e,n){void 0===n&&(n={}),vt(t,"tab",e,this,n)},Zt.prototype.setActive=function(){var o=this;this.$tabs.each(function(t,e){var n=L(e),i=n.attr("href")||"";t!==o.activeIndex||o.isDisabled(n)?(n.removeClass("mdui-tab-active"),L(i).hide()):(n.hasClass("mdui-tab-active")||(o.triggerEvent("change",o.$element,{index:o.activeIndex,id:i.substr(1)}),o.triggerEvent("show",n),n.addClass("mdui-tab-active")),L(i).show(),o.setIndicatorPosition())})},Zt.prototype.setIndicatorPosition=function(){if(-1!==this.activeIndex){var t=this.$tabs.eq(this.activeIndex);if(!this.isDisabled(t)){var e=t.offset();this.$indicator.css({left:e.left+this.$element[0].scrollLeft-this.$element[0].getBoundingClientRect().left+"px",width:t.innerWidth()+"px"})}}else this.$indicator.css({left:0,width:0})},Zt.prototype.next=function(){-1!==this.activeIndex&&(this.$tabs.length>this.activeIndex+1?this.activeIndex++:this.options.loop&&(this.activeIndex=0),this.setActive())},Zt.prototype.prev=function(){-1!==this.activeIndex&&(0
',D(n.buttons,function(t,e){i+=''+e.text+""}),i+="");var o='
'+(n.title?'
'+n.title+"
":"")+(n.content?'
'+n.content+"
":"")+i+"
",s=new B.Dialog(o,{history:n.history,overlay:n.overlay,modal:n.modal,closeOnEsc:n.closeOnEsc,destroyOnClosed:n.destroyOnClosed});return null!==(e=n.buttons)&&void 0!==e&&e.length&&s.$element.find(".mdui-dialog-actions .mdui-btn").each(function(t,e){L(e).on("click",function(){n.buttons[t].onClick(s),n.buttons[t].close&&s.close()})}),s.$element.on("open.mdui.dialog",function(){n.onOpen(s)}).on("opened.mdui.dialog",function(){n.onOpened(s)}).on("close.mdui.dialog",function(){n.onClose(s)}).on("closed.mdui.dialog",function(){n.onClosed(s)}),s.open(),s}),closeOnEsc:!0,closeOnConfirm:!0},be={confirmText:"ok",cancelText:"cancel",history:!0,modal:!(B.alert=function(t,e,n,i){return p(e)&&(i=n,n=e,e=""),O(n)&&(n=function(){}),O(i)&&(i={}),i=X({},ye,i),B.dialog({title:e,content:t,buttons:[{text:i.confirmText,bold:!1,close:i.closeOnConfirm,onClick:n}],cssClass:"mdui-dialog-alert",history:i.history,modal:i.modal,closeOnEsc:i.closeOnEsc})}),closeOnEsc:!0,closeOnCancel:!0,closeOnConfirm:!0},xe={confirmText:"ok",cancelText:"cancel",history:!0,modal:!(B.confirm=function(t,e,n,i,o){return p(e)&&(o=i,i=n,n=e,e=""),O(n)&&(n=function(){}),O(i)&&(i=function(){}),O(o)&&(o={}),o=X({},be,o),B.dialog({title:e,content:t,buttons:[{text:o.cancelText,bold:!1,close:o.closeOnCancel,onClick:i},{text:o.confirmText,bold:!1,close:o.closeOnConfirm,onClick:n}],cssClass:"mdui-dialog-confirm",history:o.history,modal:o.modal,closeOnEsc:o.closeOnEsc})}),closeOnEsc:!0,closeOnCancel:!0,closeOnConfirm:!0,type:"text",maxlength:0,defaultValue:"",confirmOnEnter:!1};B.prompt=function(t,e,i,n,o){p(e)&&(o=n,n=i,i=e,e=""),O(i)&&(i=function(){}),O(n)&&(n=function(){}),O(o)&&(o={});var s='
'+(t?'":"")+("text"===(o=X({},xe,o)).type?'":"")+("textarea"===o.type?'":"")+"
";return B.dialog({title:e,content:s,buttons:[{text:o.cancelText,bold:!1,close:o.closeOnCancel,onClick:function(t){var e=t.$element.find(".mdui-textfield-input").val();n(e,t)}},{text:o.confirmText,bold:!1,close:o.closeOnConfirm,onClick:function(t){var e=t.$element.find(".mdui-textfield-input").val();i(e,t)}}],cssClass:"mdui-dialog-prompt",history:o.history,modal:o.modal,closeOnEsc:o.closeOnEsc,onOpen:function(n){var t=n.$element.find(".mdui-textfield-input");B.updateTextFields(t),t[0].focus(),"textarea"!==o.type&&!0===o.confirmOnEnter&&t.on("keydown",function(t){if(13===t.keyCode){var e=n.$element.find(".mdui-textfield-input").val();return i(e,n),o.closeOnConfirm&&n.close(),!1}}),"textarea"===o.type&&t.on("input",function(){return n.handleUpdate()}),o.maxlength&&n.handleUpdate()}})};function Ce(t,e){void 0===e&&(e={}),this.options=X({},we),this.state="closed",this.timeoutId=null,this.$target=L(t).first(),X(this.options,e),this.$element=L('
'+this.options.content+"
").appendTo(document.body);var n=this;this.$target.on("touchstart mouseenter",function(t){n.isDisabled(this)||Lt(t)&&(Bt(t),n.open())}).on("touchend mouseleave",function(t){n.isDisabled(this)||Lt(t)&&n.close()}).on(Rt,function(t){n.isDisabled(this)||Bt(t)})}var we={position:"auto",delay:0,content:""};Ce.prototype.isDisabled=function(t){return t.disabled||void 0!==L(t).attr("disabled")},Ce.prototype.isDesktop=function(){return 1024
'+this.options.message+"
"+(this.options.buttonText?'"+this.options.buttonText+"":"")+"").appendTo(document.body),this.setPosition("close"),this.$element.reflow().addClass("mdui-snackbar-"+this.options.position)}var ke={message:"",timeout:4e3,position:"bottom",buttonText:"",buttonColor:"",closeOnButtonClick:!0,closeOnOutsideClick:!0,onClick:function(){},onButtonClick:function(){},onOpen:function(){},onOpened:function(){},onClose:function(){},onClosed:function(){}},_e=null,Te="_mdui_snackbar";function Ie(t){return void 0===t&&(t=!1),'
'}function Se(t){var e=L(t),n=e.hasClass("mdui-spinner-colorful")?Ie(1)+Ie(2)+Ie(3)+Ie(4):Ie();e.html(n)}Oe.prototype.closeOnOutsideClick=function(t){var e=L(t.target);e.hasClass("mdui-snackbar")||e.parents(".mdui-snackbar").length||_e.close()},Oe.prototype.setPosition=function(t){var e,n,i=this.$element[0].clientHeight,o=this.options.position;e="bottom"===o||"top"===o?"-50%":"0","open"===t?n="0":("bottom"===o&&(n=i),"top"===o&&(n=-i),"left-top"!==o&&"right-top"!==o||(n=-i-24),"left-bottom"!==o&&"right-bottom"!==o||(n=i+24)),this.$element.transform("translate("+e+","+n+"px")},Oe.prototype.open=function(){var e=this;"opening"!==this.state&&"opened"!==this.state&&(_e?re(Te,function(){return e.open()}):((_e=this).state="opening",this.options.onOpen(this),this.setPosition("open"),this.$element.transitionEnd(function(){"opening"===e.state&&(e.state="opened",e.options.onOpened(e),e.options.buttonText&&e.$element.find(".mdui-snackbar-action").on("click",function(){e.options.onButtonClick(e),e.options.closeOnButtonClick&&e.close()}),e.$element.on("click",function(t){L(t.target).hasClass("mdui-snackbar-action")||e.options.onClick(e)}),e.options.closeOnOutsideClick&>.on(jt,e.closeOnOutsideClick),e.options.timeout&&(e.timeoutId=setTimeout(function(){return e.close()},e.options.timeout)))})))},Oe.prototype.close=function(){var t=this;"closing"!==this.state&&"closed"!==this.state&&(this.timeoutId&&clearTimeout(this.timeoutId),this.options.closeOnOutsideClick&>.off(jt,this.closeOnOutsideClick),this.state="closing",this.options.onClose(this),this.setPosition("close"),this.$element.transitionEnd(function(){"closing"===t.state&&(_e=null,t.state="closed",t.options.onClosed(t),t.$element.remove(),ae(Te))}))},B.snackbar=function(t,e){void 0===e&&(e={}),E(t)?e.message=t:e=t;var n=new Oe(e);return n.open(),n},L(function(){gt.on("click",".mdui-bottom-nav>a",function(){var i=L(this),o=i.parent();o.children("a").each(function(t,e){var n=i.is(e);n&&vt("change","bottomNav",o[0],void 0,{index:t}),n?L(e).addClass("mdui-bottom-nav-active"):L(e).removeClass("mdui-bottom-nav-active")})}),B.mutation(".mdui-bottom-nav-scroll-hide",function(){new B.Headroom(this,{pinnedClass:"mdui-headroom-pinned-down",unpinnedClass:"mdui-headroom-unpinned-down"})})}),L(function(){B.mutation(".mdui-spinner",function(){Se(this)})});function je(t,e,n){var i=this;if(void 0===n&&(n={}),this.options=X({},Me),this.state="closed",this.$anchor=L(t).first(),this.$element=L(e).first(),!this.$anchor.parent().is(this.$element.parent()))throw new Error("anchorSelector and menuSelector must be siblings");X(this.options,n),this.isCascade=this.$element.hasClass("mdui-menu-cascade"),this.isCovered="auto"===this.options.covered?!this.isCascade:this.options.covered,this.$anchor.on("click",function(){return i.toggle()}),gt.on("click touchstart",function(t){var e=L(t.target);!i.isOpen()||e.is(i.$element)||P(i.$element[0],e[0])||e.is(i.$anchor)||P(i.$anchor[0],e[0])||i.close()});var o=this;gt.on("click",".mdui-menu-item",function(){var t=L(this);t.find(".mdui-menu").length||void 0!==t.attr("disabled")||o.close()}),this.bindSubMenuEvent(),yt.on("resize",L.throttle(function(){return i.readjust()},100))}var Me={position:"auto",align:"auto",gutter:16,fixed:!(B.updateSpinners=function(t){(O(t)?L(".mdui-spinner"):L(t)).each(function(){Se(this)})}),covered:"auto",subMenuTrigger:"hover",subMenuDelay:200};je.prototype.isOpen=function(){return"opening"===this.state||"opened"===this.state},je.prototype.triggerEvent=function(t){vt(t,"menu",this.$element,this)},je.prototype.readjust=function(){var t,e,n,i,o,s,r=yt.height(),a=yt.width(),u=this.options.gutter,c=this.isCovered,l=this.options.fixed,d=this.$element.width(),h=this.$element.height(),f=this.$anchor[0].getBoundingClientRect(),p=f.top,m=f.left,v=f.height,g=f.width,y=r-p-v,b=a-m-g,x=this.$anchor[0].offsetTop,C=this.$anchor[0].offsetLeft;if(n="auto"===this.options.position?h+u