{"code":"(window.webpackJsonpGUI=window.webpackJsonpGUI||[]).push([[35],{1379:function(e,t,n){\"use strict\";function a(){}n.d(t,\"a\",(function(){return a}))},1491:function(e,t,n){(e.exports=n(9)(!1)).push([e.i,'[dir=\"ltr\"] .sa-gamepad-container {\\n margin-right: 0.2rem;\\n}\\n[dir=\"rtl\"] .sa-gamepad-container {\\n margin-left: 0.2rem;\\n}\\n\\n.sa-gamepad-popup-outer {\\n /* above fullscreen */\\n z-index: 99999;\\n}\\n.sa-gamepad-popup {\\n box-sizing: border-box;\\n width: 700px;\\n max-height: min(800px, 85vh);\\n height: 100%;\\n max-width: 85%;\\n margin: 50px auto;\\n display: flex;\\n flex-direction: column;\\n}\\n.sa-gamepad-popup-content {\\n padding: 1.5rem 2.25rem;\\n height: 100%;\\n overflow-y: auto;\\n}\\n\\n.sa-gamepad-popup [class*=\"modal_header-item-title\"] {\\n margin: 0 -20rem 0 0;\\n}\\n\\n.sa-gamepad-cursor {\\n position: absolute;\\n top: 0;\\n left: 0;\\n z-index: 9999;\\n user-select: none;\\n pointer-events: none;\\n will-change: transform;\\n image-rendering: optimizeSpeed;\\n image-rendering: crisp-edges;\\n image-rendering: pixelated;\\n}\\n.sa-gamepad-cursor-down {\\n filter: invert(100%);\\n}\\n\\n.sa-small-stage [class*=\"gui_body-wrapper_\"]:not(.sa-stage-hidden) .sa-gamepad-container {\\n display: none !important;\\n}\\n\\n.sa-gamepad-hide-cursor [class^=\"stage_stage_\"] {\\n cursor: none;\\n}\\n\\n.sa-gamepad-browser-support-warning {\\n font-weight: bold;\\n margin-bottom: 10px;\\n}\\n\\n.sa-gamepad-extra-options {\\n display: none;\\n}\\n.sa-gamepad-has-controller .sa-gamepad-extra-options {\\n display: block;\\n}\\n\\n.sa-gamepad-store-settings {\\n display: block;\\n}\\n.sa-gamepad-store-settings > input {\\n margin-right: 4px;\\n}\\n\\n.sa-gamepad-reset-button {\\n margin: 8px 8px 8px 0;\\n}\\n',\"\"])},1492:function(e,t,n){var a=n(261);(e.exports=n(9)(!1)).push([e.i,'.gamepadlib-selector {\\n width: 100%;\\n margin-bottom: 3px;\\n}\\n\\n.gamepadlib-content {\\n display: flex;\\n flex-direction: row;\\n flex-wrap: wrap;\\n}\\n.gamepadlib-content-buttons {\\n padding-right: 10px;\\n}\\n\\n.gamepadlib-mapping {\\n display: flex;\\n align-items: center;\\n margin-bottom: 3px;\\n}\\n.gamepadlib-mapping-label {\\n width: 100px;\\n text-align: center;\\n}\\n.gamepadlib-keyinput {\\n text-align: center;\\n width: 75px;\\n height: 25px;\\n border-radius: 0;\\n border: 1px solid var(--ui-black-transparent);\\n background: var(--input-background);\\n color: var(--text-primary);\\n box-sizing: border-box;\\n padding: 0;\\n margin: 0;\\n}\\n.gamepadlib-mapping[data-value=\"1\"] .gamepadlib-keyinput {\\n background: yellow;\\n color: var(--text-primary-default);\\n}\\n.gamepadlib-keyinput[data-accepting-input=\"true\"] {\\n background: var(--badge-background);\\n}\\n.gamepadlib-keyinput[data-empty=\"true\"]:not([data-accepting-input=\"true\"]) {\\n color: #aaa;\\n font-style: italic;\\n}\\n\\n.gamepadlib-axis {\\n margin-bottom: 8px;\\n text-align: center;\\n}\\n.gamepadlib-axis-circle {\\n position: relative;\\n width: 150px;\\n height: 150px;\\n border: 1px solid var(--ui-black-transparent);\\n overflow: hidden;\\n}\\n.gamepadlib-axis-dot {\\n position: absolute;\\n top: 50%;\\n left: 50%;\\n background-image: url('+a(n(1493))+\");\\n width: 8px;\\n height: 8px;\\n transform: translate(-50%, -50%);\\n pointer-events: none;\\n}\\n.gamepadlib-axis-mapping {\\n width: 100%;\\n}\\n\\n.gamepadlib-axis-circle-overlay {\\n position: absolute;\\n top: 0;\\n left: 0;\\n width: 100%;\\n height: 100%;\\n}\\n.gamepadlib-axis-circle-overlay > .gamepadlib-axis-mapper {\\n position: absolute;\\n}\\n.gamepadlib-axis-circle-overlay > .gamepadlib-axis-mapper:nth-of-type(1) {\\n left: 50%;\\n top: 0;\\n transform: translateX(-50%);\\n}\\n.gamepadlib-axis-circle-overlay > .gamepadlib-axis-mapper:nth-of-type(2) {\\n left: 0;\\n top: 50%;\\n transform: translateY(-50%);\\n}\\n.gamepadlib-axis-circle-overlay > .gamepadlib-axis-mapper:nth-of-type(3) {\\n right: 0;\\n top: 50%;\\n transform: translateY(-50%);\\n}\\n.gamepadlib-axis-circle-overlay > .gamepadlib-axis-mapper:nth-of-type(4) {\\n left: 50%;\\n bottom: 0;\\n transform: translateX(-50%);\\n}\\n\",\"\"])},1493:function(e,t){e.exports=\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4IiBoZWlnaHQ9IjgiIHZpZXdCb3g9IjAgMCAyLjExNyAyLjExNyI+PGNpcmNsZSBjeD0iMS4wNTgiIGN5PSIxLjA1OCIgcj0iMS4wNTgiIGZpbGw9InJlZCIvPjwvc3ZnPg==\"},1522:function(e,t,n){\"use strict\";n.r(t),n.d(t,\"resources\",(function(){return I}));var a=n(709);let s=window.console;const i=[{type:\"key\",high:\"ArrowRight\",low:\"ArrowLeft\",deadZone:.5},{type:\"key\",high:\"ArrowDown\",low:\"ArrowUp\",deadZone:.5}],o=[{type:\"key\",high:\"d\",low:\"a\",deadZone:.5},{type:\"key\",high:\"s\",low:\"w\",deadZone:.5}],r=[{type:\"virtual_cursor\",high:\"+x\",low:\"-x\",sensitivity:.6,deadZone:.2},{type:\"virtual_cursor\",high:\"-y\",low:\"+y\",sensitivity:.6,deadZone:.2}],d=e=>{if(\"object\"!=typeof e||!e)return s.warn(\"invalid mapping\",e),{type:\"key\",high:null,low:null};const t=Object.assign({},e);if(\"key\"===t.type)void 0===t.deadZone&&(t.deadZone=.5),void 0===t.high&&(t.high=\"\"),void 0===t.low&&(t.low=\"\");else if(\"mousedown\"===t.type)void 0===t.deadZone&&(t.deadZone=.5),void 0===t.button&&(t.button=0);else{if(\"virtual_cursor\"!==t.type)return s.warn(\"unknown mapping type\",t.type),{type:\"key\",high:null,low:null};void 0===t.high&&(t.high=\"\"),void 0===t.low&&(t.low=\"\"),void 0===t.sensitivity&&(t.sensitivity=10),void 0===t.deadZone&&(t.deadZone=.5)}return t},l=e=>Object.assign({},e),c=l,p=e=>{const t=l(e);return delete t.deadZone,delete t.low,t},h=(e,t)=>{for(;e.lengthh([],e),g=e=>({usesArrows:e.has(\"ArrowUp\")||e.has(\"ArrowDown\")||e.has(\"ArrowRight\")||e.has(\"ArrowLeft\"),usesWASD:e.has(\"w\")&&e.has(\"s\")||e.has(\"a\")&&e.has(\"d\")}),m=e=>\"\".concat(e.id,\" (\").concat(e.index,\")\");class y{constructor(e,t){this.gamepad=e,this.gamepadLib=t,this.resetMappings()}resetMappings(){this.hints=this.gamepadLib.getHints(),this.buttonMappings=this.getDefaultButtonMappings().map(d),this.axesMappings=this.getDefaultAxisMappings().map(d)}clearMappings(){this.buttonMappings=u(this.gamepad.buttons.length),this.axesMappings=u(this.gamepad.axes.length)}getDefaultButtonMappings(){let e;if(this.hints.importedSettings)e=this.hints.importedSettings.buttons;else{const t=this.hints.usedKeys,n=new Set,{usesArrows:a,usesWASD:s}=g(t);s&&(n.add(\"w\"),n.add(\"a\"),n.add(\"s\"),n.add(\"d\"));const i=[\"p\",\"q\",\"r\"],o=[\" \",\"Enter\",\"e\",\"f\",\"z\",\"x\",\"c\",...Array.from(t).filter((e=>1===e.length&&!i.includes(e)))],r=e=>{for(const a of e)if(t.has(a)&&!n.has(a))return n.add(a),a;return null},d=()=>r(o),l=()=>r(i),c=()=>a||!s?\"ArrowUp\":\"w\",p=()=>a||!s?\"ArrowDown\":\"s\",h=()=>a||!s?\"ArrowRight\":\"d\",u=()=>a||!s?\"ArrowLeft\":\"a\",m=(()=>a&&t.has(\"ArrowUp\")?\"ArrowUp\":s&&t.has(\"w\")?\"w\":r(o))();let y=d(),v=d(),w=d();!m||y||v||w||(y=m,v=m,w=m),m&&y&&!v&&!w&&(v=m,w=y),e=[],e[0]={type:\"key\",high:m},e[1]={type:\"key\",high:y},e[2]={type:\"key\",high:v},e[3]={type:\"key\",high:w},e[4]={type:\"mousedown\"},e[5]={type:\"mousedown\"},e[6]={type:\"mousedown\"},e[7]={type:\"mousedown\"},e[9]={type:\"key\",high:l()},e[8]={type:\"key\",high:l()},e[10]={type:\"key\",high:null,low:null},e[11]={type:\"key\",high:null,low:null},e[12]={type:\"key\",high:c()},e[13]={type:\"key\",high:p()},e[14]={type:\"key\",high:u()},e[15]={type:\"key\",high:h()}}return h(e,this.gamepad.buttons.length)}getDefaultAxisMappings(){let e=[];if(this.hints.importedSettings)e=this.hints.importedSettings.axes;else if(4===this.gamepad.axes.length){const t=this.hints.usedKeys,{usesArrows:n,usesWASD:a}=g(t);a?(e.push(o[0]),e.push(o[1])):n?(e.push(i[0]),e.push(i[1])):(e.push(r[0]),e.push(r[1])),e.push(r[0]),e.push(r[1])}return h(e,this.gamepad.axes.length)}}class v extends a.a{constructor(){super(),this.gamepads=new Map,this.handleConnect=this.handleConnect.bind(this),this.handleDisconnect=this.handleDisconnect.bind(this),this.update=this.update.bind(this),this.animationFrame=null,this.currentTime=null,this.deltaTime=0,this.virtualCursor={x:0,y:0,maxX:1/0,minX:-1/0,maxY:1/0,minY:-1/0,modified:!1},this._editor=null,this.connectCallbacks=[],this.keysPressedThisFrame=new Set,this.oldKeysPressed=new Set,this.mouseButtonsPressedThisFrame=new Set,this.oldMouseDown=new Set,this.addEventHandlers()}addEventHandlers(){window.addEventListener(\"gamepadconnected\",this.handleConnect),window.addEventListener(\"gamepaddisconnected\",this.handleDisconnect)}removeEventHandlers(){window.removeEventListener(\"gamepadconnected\",this.handleConnect),window.removeEventListener(\"gamepaddisconnected\",this.handleDisconnect)}gamepadConnected(){return this.gamepads.size>0?Promise.resolve():new Promise((e=>{this.connectCallbacks.push(e)}))}getHints(){return Object.assign({usedKeys:new Set,importedSettings:null,generated:!1},this.getUserHints())}getUserHints(){return{}}resetControls(){for(const e of this.gamepads.values())e.resetMappings()}clearControls(){for(const e of this.gamepads.values())e.clearMappings()}handleConnect(e){for(const e of this.connectCallbacks)e();this.connectCallbacks=[];const t=e.gamepad,n=m(t);s.log(\"connected\",t);const a=new y(t,this);this.gamepads.set(n,a),null===this.animationFrame&&(this.animationFrame=requestAnimationFrame(this.update)),this.dispatchEvent(new CustomEvent(\"gamepadconnected\",{detail:a}))}handleDisconnect(e){const t=e.gamepad,n=m(t);s.log(\"disconnected\",t);const a=this.gamepads.get(n);this.gamepads.delete(n),this.dispatchEvent(new CustomEvent(\"gamepaddisconnected\",{detail:a})),0===this.gamepads.size&&(cancelAnimationFrame(this.animationFrame),this.animationFrame=null,this.currentTime=null)}dispatchKey(e,t){t?this.dispatchEvent(new CustomEvent(\"keydown\",{detail:e})):this.dispatchEvent(new CustomEvent(\"keyup\",{detail:e}))}dispatchMouse(e,t){t?this.dispatchEvent(new CustomEvent(\"mousedown\",{detail:e})):this.dispatchEvent(new CustomEvent(\"mouseup\",{detail:e}))}dispatchMouseMove(e,t){this.dispatchEvent(new CustomEvent(\"mousemove\",{detail:{x:e,y:t}}))}updateButton(e,t){if(\"key\"===t.type)e>=t.deadZone?t.high&&this.keysPressedThisFrame.add(t.high):e<=-t.deadZone&&t.low&&this.keysPressedThisFrame.add(t.low);else if(\"mousedown\"===t.type){Math.abs(e)>=t.deadZone&&this.mouseButtonsPressedThisFrame.add(t.button)}else if(\"virtual_cursor\"===t.type){const n=t.deadZone;let a;if(e>=n&&(a=t.high),e<=-n&&(a=t.low),a){const s=(Math.abs(e)-n)/(1-n),i=s*s*t.sensitivity*this.deltaTime;\"+x\"===a?this.virtualCursor.x+=i:\"-x\"===a?this.virtualCursor.x-=i:\"+y\"===a?this.virtualCursor.y+=i:\"-y\"===a&&(this.virtualCursor.y-=i),this.virtualCursor.modified=!0}}}update(e){this.oldKeysPressed=this.keysPressedThisFrame,this.oldMouseButtonsPressed=this.mouseButtonsPressedThisFrame,this.keysPressedThisFrame=new Set,this.mouseButtonsPressedThisFrame=new Set,null===this.currentTime?this.deltaTime=0:this.deltaTime=e-this.currentTime,this.deltaTime=Math.max(Math.min(this.deltaTime,1e3),0),this.currentTime=e,this.animationFrame=requestAnimationFrame(this.update);const t=navigator.getGamepads();for(const e of t){if(null===e)continue;const t=m(e),n=this.gamepads.get(t);for(let t=0;tthis.virtualCursor.maxX&&(this.virtualCursor.x=this.virtualCursor.maxX),this.virtualCursor.xthis.virtualCursor.maxY&&(this.virtualCursor.y=this.virtualCursor.maxY),this.virtualCursor.y{if(!navigator.getGamepads)return!0;if(navigator.userAgent.includes(\"Firefox\")&&navigator.userAgent.includes(\"Linux\")){const e=navigator.userAgent.match(/Firefox\\/(\\d+)/);return(e?e[1]:1/0)<123}return!(!navigator.userAgent.includes(\"Firefox\")||!navigator.userAgent.includes(\"Mac OS\"))},v.setConsole=e=>s=e;const w=e=>{for(;e.firstChild;)e.removeChild(e.firstChild)},b=e=>\"gamepadlib-axis-\".concat(e);class A extends a.a{constructor(e){super(),this.gamepadLib=e,this.root=Object.assign(document.createElement(\"div\"),{className:\"gamepadlib-root\"}),this.selector=Object.assign(document.createElement(\"select\"),{className:\"gamepadlib-selector\"}),this.content=Object.assign(document.createElement(\"div\"),{className:\"gamepadlib-content\"}),this.root.appendChild(this.selector),this.root.appendChild(this.content),this.onSelectorChange=this.onSelectorChange.bind(this),this.onGamepadsChange=this.onGamepadsChange.bind(this),this.selector.addEventListener(\"change\",this.onSelectorChange),this.gamepadLib.addEventListener(\"gamepadconnected\",this.onGamepadsChange),this.gamepadLib.addEventListener(\"gamepaddisconnected\",this.onGamepadsChange),this.buttonIdToElement=new Map,this.axisIdToElement=new Map,this.hidden=!1,this.msg=(e,t)=>e}onSelectorChange(){this.updateContent(),this.dispatchEvent(new CustomEvent(\"gamepad-changed\"))}onGamepadsChange(){this.updateAllContent(),this.dispatchEvent(new CustomEvent(\"gamepad-changed\"))}updateAllContent(){this.updateDropdown(),this.updateContent(),this.focus()}updateDropdown(){w(this.selector);const e=Array.from(this.gamepadLib.gamepads.entries());if(0!==e.length){this.selector.hidden=!1;for(const[t,n]of e){const e=document.createElement(\"option\");e.textContent=t,e.value=t,this.selector.appendChild(e)}}else this.selector.hidden=!0}keyToString(e){return\" \"===e?this.msg(\"key-space\"):\"ArrowUp\"===e?this.msg(\"key-up\"):\"ArrowDown\"===e?this.msg(\"key-down\"):\"ArrowLeft\"===e?this.msg(\"key-left\"):\"ArrowRight\"===e?this.msg(\"key-right\"):\"Enter\"===e?this.msg(\"key-enter\"):1===e.length?e.toUpperCase():e.replace(/[a-z]([A-Z])/,(e=>\"\".concat(e[0],\" \").concat(e[1])))}createButtonMapping(e,t){let{property:n=\"high\",allowClick:a=!0}=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};const s=document.createElement(\"input\");s.readOnly=!0,s.className=\"gamepadlib-keyinput\",s.title=this.msg(\"keyinput-title\"),s.dataset.index=t;const i=()=>{const a=e[t];if(s.dataset.empty=!1,\"key\"===a.type)null===a[n]?(s.value=this.msg(\"key-none\"),s.dataset.empty=!0):s.value=this.keyToString(a[n]);else if(\"mousedown\"===a.type){let e=this.msg(\"key-click\");0!==a.button&&(e+=\" (\".concat(a.button,\")\")),s.value=e}else s.value=\"??? \".concat(a.type)},o=()=>{e[t]=d(e[t]),r=!1,s.blur(),i(),s.dispatchEvent(new CustomEvent(\"mapping-changed\")),this.changed()};let r=!1;const l=a=>{if(r){a.preventDefault();const s=a.key;if([\"Alt\"].includes(s))return;const i=e[t],r=[\"ArrowUp\",\"ArrowDown\",\"ArrowRight\",\"ArrowLeft\",\"Enter\",\"Shift\",\"CapsLock\",\"ScrollLock\",\"Control\",\"Insert\",\"Home\",\"End\",\"PageUp\",\"PageDown\"];1===s.length||r.includes(s)?(i.type=\"key\",i[n]=s):\"Escape\"!==s&&(i.type=\"key\",i[n]=null),o()}else\"Enter\"===a.key&&(a.preventDefault(),a.target.click())},c=[\"Shift\",\"Control\"],p=()=>{s.dataset.acceptingInput=!1,r&&(r=!1,i())};return s.addEventListener(\"contextmenu\",(e=>{e.preventDefault()})),s.addEventListener(\"mouseup\",(n=>{if(n.preventDefault(),r)if(a){const a=e[t];a.type=\"mousedown\",a.button=n.button,o()}else p();else s.value=\"...\",s.dataset.acceptingInput=!0,r=!0})),s.addEventListener(\"keydown\",(e=>{c.includes(e.key)||l(e)})),s.addEventListener(\"keyup\",(e=>{c.includes(e.key)&&l(e)})),s.addEventListener(\"blur\",p),i(),s}createAxisMapping(e,t){const n=document.createElement(\"select\");n.className=\"gamepadlib-axis-mapping\",n.id=b(t),n.appendChild(Object.assign(document.createElement(\"option\"),{textContent:this.msg(\"axis-none\"),value:\"none\"})),n.appendChild(Object.assign(document.createElement(\"option\"),{textContent:this.msg(\"axis-cursor\"),value:\"cursor\"})),n.appendChild(Object.assign(document.createElement(\"option\"),{textContent:\"WASD\",value:\"wasd\"})),n.appendChild(Object.assign(document.createElement(\"option\"),{textContent:this.msg(\"axis-arrows\"),value:\"arrows\"})),n.appendChild(Object.assign(document.createElement(\"option\"),{textContent:this.msg(\"axis-custom\"),value:\"custom\"}));const a=()=>{\"key\"===e[t].type||\"mousedown\"===e[t].type?null===e[t].high&&null===e[t].low&&null===e[t+1].high&&null===e[t+1].low?n.value=\"none\":e[t].high===o[0].high&&e[t].low===o[0].low&&e[t+1].high===o[1].high&&e[t+1].low===o[1].low?n.value=\"wasd\":e[t].high===i[0].high&&e[t].low===i[0].low&&e[t+1].high===i[1].high&&e[t+1].low===i[1].low?n.value=\"arrows\":n.value=\"custom\":\"virtual_cursor\"===e[t].type?n.value=\"cursor\":n.value=\"none\"};a();const s=document.createElement(\"div\");s.className=\"gamepadlib-axis-circle-overlay\";const l=()=>{if(w(s),\"key\"===e[t].type){const n=[this.createButtonMapping(e,t+1,{property:\"low\",allowClick:!1}),this.createButtonMapping(e,t,{property:\"low\",allowClick:!1}),this.createButtonMapping(e,t,{property:\"high\",allowClick:!1}),this.createButtonMapping(e,t+1,{property:\"high\",allowClick:!1})];for(const e of n)e.classList.add(\"gamepadlib-axis-mapper\"),e.addEventListener(\"mapping-changed\",a),s.appendChild(e)}};return l(),n.addEventListener(\"change\",(()=>{\"custom\"===n.value?\"key\"!==e[t].type&&(e[t]=d(i[0]),e[t+1]=d(i[1])):\"arrows\"===n.value?(e[t]=d(i[0]),e[t+1]=d(i[1])):\"wasd\"===n.value?(e[t]=d(o[0]),e[t+1]=d(o[1])):\"cursor\"===n.value?(e[t]=d(r[0]),e[t+1]=d(r[1])):(e[t]=d({type:\"key\",high:null,low:null}),e[t+1]=d({type:\"key\",high:null,low:null})),l(),this.changed()})),{circleOverlay:s,selector:n}}hasControllerSelected(){return!!this.selector.value}updateContent(){if(w(this.content),this.hidden)return;const e=this.selector.value;if(!e){const e=document.createElement(\"div\");return e.textContent=this.msg(\"no-controllers\"),void this.content.appendChild(e)}const t=this.gamepadLib.gamepads.get(e);if(!t){const t=document.createElement(\"div\");return t.textContent=\"Cannot find controller: \".concat(e),void this.content.appendChild(t)}this.buttonIdToElement.clear(),this.axisIdToElement.clear();const n=document.createElement(\"div\");n.className=\"gamepadlib-content-buttons\";const a=t.buttonMappings;for(let e=0;ee&&m(e)===this.selector.value));if(t){for(let e=0;e{if(s.editingTarget)return e();s.runtime.once(\"PROJECT_LOADED\",e)}));const i=()=>null!==s.runtime._steppingInterval,o=e=>{switch(e){case\"right arrow\":return\"ArrowRight\";case\"up arrow\":return\"ArrowUp\";case\"left arrow\":return\"ArrowLeft\";case\"down arrow\":return\"ArrowDown\";case\"enter\":return\"Enter\";case\"space\":return\" \"}return e.toLowerCase().charAt(0)},r=()=>{const e=[s.runtime.getTargetForStage(),...s.runtime.targets].filter((e=>e.isOriginal)).map((e=>e.blocks)),t=new Set;for(const n of e)for(const e of Object.values(n._blocks))if(\"event_whenkeypressed\"===e.opcode||\"sensing_keyoptions\"===e.opcode){if(\"sensing_keyoptions\"===e.opcode&&!e.parent)continue;const n=e.fields.KEY_OPTION.value;t.add(o(n))}return t},d=\" // _gamepad_\",l=()=>{const e=s.runtime.getTargetForStage().comments;for(const t of Object.values(e))if(t.text.includes(d))return t;return null};f.setConsole(n);const c=new f;c.getUserHints=()=>{const e=(()=>{const e=l();if(!e)return null;const t=e.text.split(\"\\n\").find((e=>e.endsWith(d)));if(!t)return n.warn(\"Gamepad comment does not contain valid line\"),null;const a=t.substr(0,t.length-13);let s;try{if(s=JSON.parse(a),!s||\"object\"!=typeof s||!Array.isArray(s.buttons)||!Array.isArray(s.axes))throw new Error(\"Invalid data\")}catch(e){return n.warn(\"Gamepad comment has invalid JSON\",e),null}return s})();return e?{importedSettings:e}:{usedKeys:r()}},s.runtime.on(\"PROJECT_LOADED\",(()=>{c.resetControls()})),t.settings.get(\"hide\")&&await new Promise((e=>{const n=()=>{t.settings.removeEventListener(\"change\",a),e()},a=()=>{t.settings.get(\"hide\")||n()};c.gamepadConnected().then(n),t.settings.addEventListener(\"change\",a)}));const p=s.runtime.renderer,h=()=>s.runtime.stageWidth,u=()=>s.runtime.stageHeight,g=p.canvas,m=document.createElement(\"div\");m.className=\"sa-gamepad-container\",t.tab.displayNoneWhileDisabled(m,{display:\"flex\"});const y=document.createElement(\"span\");y.className=t.tab.scratchClass(\"button_outlined-button\",\"stage-header_stage-button\");const v=document.createElement(\"div\");v.className=t.tab.scratchClass(\"button_content\");const w=document.createElement(\"img\");let b;w.className=t.tab.scratchClass(\"stage-header_stage-button-icon\"),w.draggable=!1,w.src=t.self.getResource(\"/gamepad.svg\"),v.appendChild(w),y.appendChild(v),m.appendChild(y);let A=!1;const C=()=>{s.runtime.emitProjectChanged(),s.editingTarget===s.runtime.getTargetForStage()&&s.emitWorkspaceUpdate()},M=()=>{const e=b.export();if(!e)return void n.warn(\"Could not export gamepad settings\");const t=\"\".concat(a(\"config-header\"),\"\\n\").concat(JSON.stringify(e)).concat(d),i=l();if(i)i.text=t;else{s.runtime.getTargetForStage().createComment(Math.random()+\"\",null,t,50,50,350,150,!1)}C()},k=()=>{A&&M()},N=e=>{A=!!e.target.checked,A?M():(()=>{const e=l();e&&(delete s.runtime.getTargetForStage().comments[e.id],C())})()},L=()=>{document.body.classList.toggle(\"sa-gamepad-has-controller\",b.hasControllerSelected()),k()};y.addEventListener(\"click\",(()=>{b||(b=c.editor(),b.msg=a,b.addEventListener(\"mapping-changed\",k),b.addEventListener(\"gamepad-changed\",L));const e=b.generateEditor();L();const{backdrop:n,container:s,content:i,closeButton:o,remove:r}=t.tab.createModal(a(\"settings\"),{isOpen:!0,useEditorClasses:!0});if(n.addEventListener(\"click\",r),window.addEventListener(\"keydown\",(e=>{\"Escape\"!==e.key||e.target.closest(\"[data-accepting-input]\")||r()})),t.self.addEventListener(\"disabled\",r),n.classList.add(\"sa-gamepad-popup-outer\"),s.classList.add(\"sa-gamepad-popup\"),o.tabIndex=\"0\",o.setAttribute(\"role\",\"button\"),o.addEventListener(\"click\",r),o.addEventListener(\"keydown\",(e=>{\"Enter\"!==e.key&&\" \"!==e.key||r()})),i.classList.add(\"sa-gamepad-popup-content\"),f.browserHasBrokenGamepadAPI()){const e=document.createElement(\"div\");e.textContent=a(\"browser-support\"),e.className=\"sa-gamepad-browser-support-warning\",i.appendChild(e)}i.appendChild(e);const d=document.createElement(\"div\");d.className=\"sa-gamepad-extra-options\",i.appendChild(d);const l=()=>{b.updateAllContent(),g.checked=!1,A=!1},p=document.createElement(\"button\");p.className=\"sa-gamepad-reset-button\",p.textContent=a(\"reset\"),p.addEventListener(\"click\",(()=>{c.resetControls(),l()})),d.appendChild(p);const h=document.createElement(\"button\");h.className=\"sa-gamepad-reset-button\",h.textContent=a(\"clear\"),h.addEventListener(\"click\",(()=>{c.clearControls(),l()})),d.appendChild(h);const u=document.createElement(\"label\");u.className=\"sa-gamepad-store-settings\",u.textContent=a(\"store-in-project\");const g=document.createElement(\"input\");g.type=\"checkbox\",g.checked=A,g.addEventListener(\"change\",N),u.prepend(g),d.appendChild(u),b.focus()})),Object(x.a)();const D=document.createElement(\"img\");let I;D.hidden=!0,D.className=\"sa-gamepad-cursor\",D.src=t.self.getResource(\"/cursor.png\"),t.self.addEventListener(\"disabled\",(()=>{D.hidden=!0}));const T=e=>{D.hidden=!e,clearTimeout(I),e&&(document.body.classList.add(\"sa-gamepad-hide-cursor\"),I=setTimeout(S,8e3))},S=()=>{T(!1)},O=e=>{T(!0),D.classList.toggle(\"sa-gamepad-cursor-down\",e)},j=(e,t)=>{T(!0);const n=h()/2+e-3,a=u()/2-t-3;D.style.transform=\"translate(\".concat(n,\"px, \").concat(a,\"px)\")};let P;if(document.addEventListener(\"mousemove\",(()=>{T(!1),document.body.classList.remove(\"sa-gamepad-hide-cursor\")})),window.ResizeObserver){let e=h(),t=u();new ResizeObserver((n=>{for(const a of n)e=a.contentRect.width,t=a.contentRect.height})).observe(g),P=()=>[e,t]}else P=()=>{const e=g.getBoundingClientRect();return[e.width,e.height]};let Z=0,B=0;const z=e=>{if(t.self.disabled||!i())return;const[n,a]=P();s.postIOData(\"mouse\",E(E({},e),{},{canvasWidth:n,canvasHeight:a,x:(Z+h()/2)*(n/h()),y:(u()/2-B)*(a/u())}))},G=(e,n)=>{!t.self.disabled&&i()&&s.postIOData(\"keyboard\",{key:e,isDown:n})},_=()=>{c.virtualCursor.maxX=p._xRight,c.virtualCursor.minX=p._xLeft,c.virtualCursor.maxY=p._yTop,c.virtualCursor.minY=p._yBottom,D.hidden||j(Z,B)};for(s.on(\"STAGE_SIZE_CHANGED\",_),_(),c.addEventListener(\"keydown\",(e=>G(e.detail,!0))),c.addEventListener(\"keyup\",(e=>G(e.detail,!1))),c.addEventListener(\"mousedown\",(e=>{O(!0),z({isDown:!0,button:e.detail})})),c.addEventListener(\"mouseup\",(e=>{O(!1),z({isDown:!1,button:e.detail})})),c.addEventListener(\"mousemove\",(e=>{Z=e.detail.x,B=e.detail.y,j(Z,B),z({})}));;){const e=await t.tab.waitForElement('[class^=\"stage-header_stage-size-row\"], [class^=\"stage-header_fullscreen-buttons-row_\"]',{markAsSeen:!0,reduxEvents:[\"scratch-gui/mode/SET_PLAYER\",\"scratch-gui/mode/SET_FULL_SCREEN\",\"fontsLoaded/SET_FONTS_LOADED\",\"scratch-gui/locales/SELECT_LOCALE\"]});m.dataset.editorMode=t.tab.editorMode,e.closest('[class^=\"stage-header_stage-size-row\"]')?t.tab.appendToSharedSpace({space:\"stageHeader\",element:m,order:1}):t.tab.appendToSharedSpace({space:\"fullscreenStageHeader\",element:m,order:0}),s.renderer.addOverlay(D,\"scale\")}},\"style.css\":N.a,\"gamepadlib.css\":D.a,\"active.png\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAGAQMAAADaAn0LAAAABlBMVEX///8AAABVwtN+AAAADklEQVQI12MAAQMgBAIAAkwAYUis6mUAAAAASUVORK5CYII=\",\"close.svg\":\"data:image/svg+xml;base64,PHN2ZyBkYXRhLW5hbWU9IkxheWVyIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDcuNDggNy40OCI+PHBhdGggZD0iTTMuNzQgNi40OFYxTTEgMy43NGg1LjQ4IiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojZmZmO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6MnB4Ii8+PC9zdmc+\",\"cursor.png\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAGAQMAAADaAn0LAAAABlBMVEUAAAD///+l2Z/dAAAADklEQVQI12MAAQMgBAIAAkwAYUis6mUAAAAASUVORK5CYII=\",\"dot.svg\":\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4IiBoZWlnaHQ9IjgiIHZpZXdCb3g9IjAgMCAyLjExNyAyLjExNyI+PGNpcmNsZSBjeD0iMS4wNTgiIGN5PSIxLjA1OCIgcj0iMS4wNTgiIGZpbGw9InJlZCIvPjwvc3ZnPg==\",\"gamepad.svg\":\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGFyaWEtaGlkZGVuPSJ0cnVlIiB3aWR0aD0iMWVtIiBoZWlnaHQ9IjFlbSIgc3R5bGU9Ii1tcy10cmFuc2Zvcm06cm90YXRlKDM2MGRlZyk7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDM2MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpIiB2aWV3Qm94PSIwIDAgNTEyIDUxMiI+PHBhdGggZmlsbD0iIzU3NWU3NSIgZD0iTTM2OCAxNjhoLTk2di02NGgxNzZhMjQuMDI3IDI0LjAyNyAwIDAgMCAyNC0yNFYxNmgtMzJ2NTZIMjY0YTI0LjAyNyAyNC4wMjcgMCAwIDAtMjQgMjR2NzJoLTk2QTEyOC4xNDUgMTI4LjE0NSAwIDAgMCAxNiAyOTZ2MTAwLjk1M0E5MS4xNSA5MS4xNSAwIDAgMCAxMDcuMDQ3IDQ4OGgxLjhhOTAuODA3IDkwLjgwNyAwIDAgMCA2OS45NTMtMzIuNzZMMjMxLjUgMzkyaDQ4LjYyOGw1Mi42NjYgNjguNDY1QTkxLjA0NiA5MS4wNDYgMCAwIDAgNDk2IDQwNC45NTNWMjk2YTEyOC4xNDUgMTI4LjE0NSAwIDAgMC0xMjgtMTI4em05NiAyMzYuOTUzYTU5LjA0NyA1OS4wNDcgMCAwIDEtMTA1Ljg0OSAzNkwyOTUuODc4IDM2MGgtNzkuMzcybC02Mi4yOTQgNzQuNzU0QTU4Ljg5MyA1OC44OTMgMCAwIDEgMTA4Ljg1IDQ1NmgtMS44QTU5LjExMyA1OS4xMTMgMCAwIDEgNDggMzk2Ljk1M1YyOTZhOTYuMTA4IDk2LjEwOCAwIDAgMSA5Ni05NmgyMjRhOTYuMTA4IDk2LjEwOCAwIDAgMSA5NiA5NnoiLz48cGF0aCBmaWxsPSIjNTc1ZTc1IiBkPSJNMzYwIDI0OGgzMnYzMmgtMzJ6bTAgODBoMzJ2MzJoLTMyem0tNDAtNDBoMzJ2MzJoLTMyem04MCAwaDMydjMyaC0zMnptLTI0OC00MGgtMzJ2NDBIODB2MzJoNDB2NDBoMzJ2LTQwaDQwdi0zMmgtNDB2LTQweiIvPjwvc3ZnPg==\"}}}]);","name":"js/pentapod/addon-entry-gamepad.ea3a3242277a802048bf.js","input":"(window[\"webpackJsonpGUI\"] = window[\"webpackJsonpGUI\"] || []).push([[35],{\n\n/***/ 1379:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return addSmallStageClass; });\nfunction addSmallStageClass() {\n // TW: no-op; sa-small-stage class is handled by scratch-gui\n}\n\n/***/ }),\n\n/***/ 1491:\n/***/ (function(module, exports, __webpack_require__) {\n\nexports = module.exports = __webpack_require__(9)(false);\n// imports\n\n\n// module\nexports.push([module.i, \"[dir=\\\"ltr\\\"] .sa-gamepad-container {\\n margin-right: 0.2rem;\\n}\\n[dir=\\\"rtl\\\"] .sa-gamepad-container {\\n margin-left: 0.2rem;\\n}\\n\\n.sa-gamepad-popup-outer {\\n /* above fullscreen */\\n z-index: 99999;\\n}\\n.sa-gamepad-popup {\\n box-sizing: border-box;\\n width: 700px;\\n max-height: min(800px, 85vh);\\n height: 100%;\\n max-width: 85%;\\n margin: 50px auto;\\n display: flex;\\n flex-direction: column;\\n}\\n.sa-gamepad-popup-content {\\n padding: 1.5rem 2.25rem;\\n height: 100%;\\n overflow-y: auto;\\n}\\n\\n.sa-gamepad-popup [class*=\\\"modal_header-item-title\\\"] {\\n margin: 0 -20rem 0 0;\\n}\\n\\n.sa-gamepad-cursor {\\n position: absolute;\\n top: 0;\\n left: 0;\\n z-index: 9999;\\n user-select: none;\\n pointer-events: none;\\n will-change: transform;\\n image-rendering: optimizeSpeed;\\n image-rendering: crisp-edges;\\n image-rendering: pixelated;\\n}\\n.sa-gamepad-cursor-down {\\n filter: invert(100%);\\n}\\n\\n.sa-small-stage [class*=\\\"gui_body-wrapper_\\\"]:not(.sa-stage-hidden) .sa-gamepad-container {\\n display: none !important;\\n}\\n\\n.sa-gamepad-hide-cursor [class^=\\\"stage_stage_\\\"] {\\n cursor: none;\\n}\\n\\n.sa-gamepad-browser-support-warning {\\n font-weight: bold;\\n margin-bottom: 10px;\\n}\\n\\n.sa-gamepad-extra-options {\\n display: none;\\n}\\n.sa-gamepad-has-controller .sa-gamepad-extra-options {\\n display: block;\\n}\\n\\n.sa-gamepad-store-settings {\\n display: block;\\n}\\n.sa-gamepad-store-settings > input {\\n margin-right: 4px;\\n}\\n\\n.sa-gamepad-reset-button {\\n margin: 8px 8px 8px 0;\\n}\\n\", \"\"]);\n\n// exports\n\n\n/***/ }),\n\n/***/ 1492:\n/***/ (function(module, exports, __webpack_require__) {\n\nvar escape = __webpack_require__(261);\nexports = module.exports = __webpack_require__(9)(false);\n// imports\n\n\n// module\nexports.push([module.i, \".gamepadlib-selector {\\n width: 100%;\\n margin-bottom: 3px;\\n}\\n\\n.gamepadlib-content {\\n display: flex;\\n flex-direction: row;\\n flex-wrap: wrap;\\n}\\n.gamepadlib-content-buttons {\\n padding-right: 10px;\\n}\\n\\n.gamepadlib-mapping {\\n display: flex;\\n align-items: center;\\n margin-bottom: 3px;\\n}\\n.gamepadlib-mapping-label {\\n width: 100px;\\n text-align: center;\\n}\\n.gamepadlib-keyinput {\\n text-align: center;\\n width: 75px;\\n height: 25px;\\n border-radius: 0;\\n border: 1px solid var(--ui-black-transparent);\\n background: var(--input-background);\\n color: var(--text-primary);\\n box-sizing: border-box;\\n padding: 0;\\n margin: 0;\\n}\\n.gamepadlib-mapping[data-value=\\\"1\\\"] .gamepadlib-keyinput {\\n background: yellow;\\n color: var(--text-primary-default);\\n}\\n.gamepadlib-keyinput[data-accepting-input=\\\"true\\\"] {\\n background: var(--badge-background);\\n}\\n.gamepadlib-keyinput[data-empty=\\\"true\\\"]:not([data-accepting-input=\\\"true\\\"]) {\\n color: #aaa;\\n font-style: italic;\\n}\\n\\n.gamepadlib-axis {\\n margin-bottom: 8px;\\n text-align: center;\\n}\\n.gamepadlib-axis-circle {\\n position: relative;\\n width: 150px;\\n height: 150px;\\n border: 1px solid var(--ui-black-transparent);\\n overflow: hidden;\\n}\\n.gamepadlib-axis-dot {\\n position: absolute;\\n top: 50%;\\n left: 50%;\\n background-image: url(\" + escape(__webpack_require__(1493)) + \");\\n width: 8px;\\n height: 8px;\\n transform: translate(-50%, -50%);\\n pointer-events: none;\\n}\\n.gamepadlib-axis-mapping {\\n width: 100%;\\n}\\n\\n.gamepadlib-axis-circle-overlay {\\n position: absolute;\\n top: 0;\\n left: 0;\\n width: 100%;\\n height: 100%;\\n}\\n.gamepadlib-axis-circle-overlay > .gamepadlib-axis-mapper {\\n position: absolute;\\n}\\n.gamepadlib-axis-circle-overlay > .gamepadlib-axis-mapper:nth-of-type(1) {\\n left: 50%;\\n top: 0;\\n transform: translateX(-50%);\\n}\\n.gamepadlib-axis-circle-overlay > .gamepadlib-axis-mapper:nth-of-type(2) {\\n left: 0;\\n top: 50%;\\n transform: translateY(-50%);\\n}\\n.gamepadlib-axis-circle-overlay > .gamepadlib-axis-mapper:nth-of-type(3) {\\n right: 0;\\n top: 50%;\\n transform: translateY(-50%);\\n}\\n.gamepadlib-axis-circle-overlay > .gamepadlib-axis-mapper:nth-of-type(4) {\\n left: 50%;\\n bottom: 0;\\n transform: translateX(-50%);\\n}\\n\", \"\"]);\n\n// exports\n\n\n/***/ }),\n\n/***/ 1493:\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4IiBoZWlnaHQ9IjgiIHZpZXdCb3g9IjAgMCAyLjExNyAyLjExNyI+PGNpcmNsZSBjeD0iMS4wNTgiIGN5PSIxLjA1OCIgcj0iMS4wNTgiIGZpbGw9InJlZCIvPjwvc3ZnPg==\"\n\n/***/ }),\n\n/***/ 1522:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, \"resources\", function() { return /* binding */ resources; });\n\n// EXTERNAL MODULE: ./src/addons/event-target.js\nvar event_target = __webpack_require__(709);\n\n// CONCATENATED MODULE: ./src/addons/addons/gamepad/gamepadlib.js\n /* inserted by pull.js */\n\nlet gamepadlib_console = window.console;\n\n/*\nMapping types:\n\ntype: \"key\" maps a button to a keyboard key\nAll key names will be interpreted as a KeyboardEvent.key value (https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key/Key_Values)\nhigh: \"KeyName\" is the name of the key to dispatch when a button reads a HIGH value\nlow: \"KeyName\" is the name of the key to dispatch when a button reads a LOW value\ndeadZone: 0.5 controls the minimum value necessary to be read in either + or - to trigger either high or low\nThe high/low distinction is necessary for axes. Buttons will only use high\n\ntype: \"mousedown\" maps a button to control whether the mouse is down or not\ndeadZone: 0.5 controls the minimum value to trigger a mousedown\nbutton: 0, 1, 2, etc. controls which button to press\n\ntype: \"virtual_cursor\" maps a button to control the \"virtual cursor\"\ndeadZone: 0.5 again controls the minimum value to trigger a movement\nsensitivity: 10 controls the speed\nhigh: \"+y\"/\"-y\"/\"+x\"/\"-x\" defines what happens when an axis reads high\nlow: \"+y\"/\"-y\"/\"+x\"/\"-x\" defines what happens when an axis reads low\n+y increases y, -y decreases y, +x increases x, -x decreases x.\n*/\n\nconst defaultAxesMappings = {\n arrows: [{\n type: \"key\",\n high: \"ArrowRight\",\n low: \"ArrowLeft\",\n deadZone: 0.5\n }, {\n type: \"key\",\n high: \"ArrowDown\",\n low: \"ArrowUp\",\n deadZone: 0.5\n }],\n wasd: [{\n type: \"key\",\n high: \"d\",\n low: \"a\",\n deadZone: 0.5\n }, {\n type: \"key\",\n high: \"s\",\n low: \"w\",\n deadZone: 0.5\n }],\n cursor: [{\n type: \"virtual_cursor\",\n high: \"+x\",\n low: \"-x\",\n sensitivity: 0.6,\n deadZone: 0.2\n }, {\n type: \"virtual_cursor\",\n high: \"-y\",\n low: \"+y\",\n sensitivity: 0.6,\n deadZone: 0.2\n }]\n};\nconst emptyMapping = () => ({\n type: \"key\",\n high: null,\n low: null\n});\nconst transformAndCopyMapping = mapping => {\n if (typeof mapping !== \"object\" || !mapping) {\n gamepadlib_console.warn(\"invalid mapping\", mapping);\n return emptyMapping();\n }\n const copy = Object.assign({}, mapping);\n if (copy.type === \"key\") {\n if (typeof copy.deadZone === \"undefined\") {\n copy.deadZone = 0.5;\n }\n if (typeof copy.high === \"undefined\") {\n copy.high = \"\";\n }\n if (typeof copy.low === \"undefined\") {\n copy.low = \"\";\n }\n } else if (copy.type === \"mousedown\") {\n if (typeof copy.deadZone === \"undefined\") {\n copy.deadZone = 0.5;\n }\n if (typeof copy.button === \"undefined\") {\n copy.button = 0;\n }\n } else if (copy.type === \"virtual_cursor\") {\n if (typeof copy.high === \"undefined\") {\n copy.high = \"\";\n }\n if (typeof copy.low === \"undefined\") {\n copy.low = \"\";\n }\n if (typeof copy.sensitivity === \"undefined\") {\n copy.sensitivity = 10;\n }\n if (typeof copy.deadZone === \"undefined\") {\n copy.deadZone = 0.5;\n }\n } else {\n gamepadlib_console.warn(\"unknown mapping type\", copy.type);\n return emptyMapping();\n }\n return copy;\n};\nconst prepareMappingForExport = mapping => Object.assign({}, mapping);\nconst prepareAxisMappingForExport = prepareMappingForExport;\nconst prepareButtonMappingForExport = mapping => {\n const copy = prepareMappingForExport(mapping);\n delete copy.deadZone;\n delete copy.low;\n return copy;\n};\nconst padWithEmptyMappings = (array, length) => {\n // Keep adding empty mappings until the list is full\n while (array.length < length) {\n array.push(emptyMapping());\n }\n // In case the input array is longer than the desired length\n array.length = length;\n return array;\n};\nconst createEmptyMappingList = length => padWithEmptyMappings([], length);\nconst getMovementConfiguration = usedKeys => ({\n usesArrows: usedKeys.has(\"ArrowUp\") || usedKeys.has(\"ArrowDown\") || usedKeys.has(\"ArrowRight\") || usedKeys.has(\"ArrowLeft\"),\n usesWASD: usedKeys.has(\"w\") && usedKeys.has(\"s\") || usedKeys.has(\"a\") && usedKeys.has(\"d\")\n});\nconst getGamepadId = gamepad => \"\".concat(gamepad.id, \" (\").concat(gamepad.index, \")\");\nclass GamepadData {\n /**\n * @param {Gamepad} gamepad Source Gamepad\n * @param {GamepadLib} gamepadLib Parent GamepadLib\n */\n constructor(gamepad, gamepadLib) {\n this.gamepad = gamepad;\n this.gamepadLib = gamepadLib;\n this.resetMappings();\n }\n resetMappings() {\n this.hints = this.gamepadLib.getHints();\n this.buttonMappings = this.getDefaultButtonMappings().map(transformAndCopyMapping);\n this.axesMappings = this.getDefaultAxisMappings().map(transformAndCopyMapping);\n }\n clearMappings() {\n this.buttonMappings = createEmptyMappingList(this.gamepad.buttons.length);\n this.axesMappings = createEmptyMappingList(this.gamepad.axes.length);\n }\n getDefaultButtonMappings() {\n let buttons;\n if (this.hints.importedSettings) {\n buttons = this.hints.importedSettings.buttons;\n } else {\n const usedKeys = this.hints.usedKeys;\n const alreadyUsedKeys = new Set();\n const {\n usesArrows,\n usesWASD\n } = getMovementConfiguration(usedKeys);\n if (usesWASD) {\n alreadyUsedKeys.add(\"w\");\n alreadyUsedKeys.add(\"a\");\n alreadyUsedKeys.add(\"s\");\n alreadyUsedKeys.add(\"d\");\n }\n const possiblePauseKeys = [\n // Restart keys, pause keys, other potentially dangerous keys\n \"p\", \"q\", \"r\"];\n const possibleActionKeys = [\" \", \"Enter\", \"e\", \"f\", \"z\", \"x\", \"c\", ...Array.from(usedKeys).filter(i => i.length === 1 && !possiblePauseKeys.includes(i))];\n const findKey = keys => {\n for (const key of keys) {\n if (usedKeys.has(key) && !alreadyUsedKeys.has(key)) {\n alreadyUsedKeys.add(key);\n return key;\n }\n }\n return null;\n };\n const getPrimaryAction = () => {\n if (usesArrows && usedKeys.has(\"ArrowUp\")) {\n return \"ArrowUp\";\n }\n if (usesWASD && usedKeys.has(\"w\")) {\n return \"w\";\n }\n return findKey(possibleActionKeys);\n };\n const getSecondaryAction = () => findKey(possibleActionKeys);\n const getPauseKey = () => findKey(possiblePauseKeys);\n const getUp = () => {\n if (usesArrows || !usesWASD) return \"ArrowUp\";\n return \"w\";\n };\n const getDown = () => {\n if (usesArrows || !usesWASD) return \"ArrowDown\";\n return \"s\";\n };\n const getRight = () => {\n if (usesArrows || !usesWASD) return \"ArrowRight\";\n return \"d\";\n };\n const getLeft = () => {\n if (usesArrows || !usesWASD) return \"ArrowLeft\";\n return \"a\";\n };\n const action1 = getPrimaryAction();\n let action2 = getSecondaryAction();\n let action3 = getSecondaryAction();\n let action4 = getSecondaryAction();\n // When only 1 or 2 action keys are detected, bind the other buttons to the same things.\n if (action1 && !action2 && !action3 && !action4) {\n action2 = action1;\n action3 = action1;\n action4 = action1;\n }\n if (action1 && action2 && !action3 && !action4) {\n action3 = action1;\n action4 = action2;\n }\n\n // Set indices \"manually\" because we don't evaluate them in order.\n buttons = [];\n buttons[0] = {\n /*\n Xbox: A\n SNES-like: B\n */\n type: \"key\",\n high: action1\n };\n buttons[1] = {\n /*\n Xbox: B\n SNES-like: A\n */\n type: \"key\",\n high: action2\n };\n buttons[2] = {\n /*\n Xbox: X\n SNES-like: Y\n */\n type: \"key\",\n high: action3\n };\n buttons[3] = {\n /*\n Xbox: Y\n SNES-like: X\n */\n type: \"key\",\n high: action4\n };\n buttons[4] = {\n /*\n Xbox: LB\n SNES-like: Left trigger\n */\n type: \"mousedown\"\n };\n buttons[5] = {\n /*\n Xbox: RB\n */\n type: \"mousedown\"\n };\n buttons[6] = {\n /*\n Xbox: LT\n */\n type: \"mousedown\"\n };\n buttons[7] = {\n /*\n Xbox: RT\n SNES-like: Right trigger\n */\n type: \"mousedown\"\n };\n buttons[9] = {\n /*\n Xbox: Menu\n SNES-like: Start\n */\n type: \"key\",\n high: getPauseKey()\n };\n buttons[8] = {\n /*\n Xbox: Change view\n SNES-like: Select\n */\n type: \"key\",\n high: getPauseKey()\n };\n // Xbox: Left analog press\n buttons[10] = emptyMapping();\n // Xbox: Right analog press\n buttons[11] = emptyMapping();\n buttons[12] = {\n /*\n Xbox: D-pad up\n */\n type: \"key\",\n high: getUp()\n };\n buttons[13] = {\n /*\n Xbox: D-pad down\n */\n type: \"key\",\n high: getDown()\n };\n buttons[14] = {\n /*\n Xbox: D-pad left\n */\n type: \"key\",\n high: getLeft()\n };\n buttons[15] = {\n /*\n Xbox: D-pad right\n */\n type: \"key\",\n high: getRight()\n };\n }\n return padWithEmptyMappings(buttons, this.gamepad.buttons.length);\n }\n getDefaultAxisMappings() {\n let axes = [];\n if (this.hints.importedSettings) {\n axes = this.hints.importedSettings.axes;\n } else {\n // Only return default axis mappings when there are 4 axes, like an xbox controller\n // If there isn't exactly 4, we can't really predict what the axes mean\n // Some controllers map the dpad to *both* buttons and axes at the same time, which would cause conflicts.\n if (this.gamepad.axes.length === 4) {\n const usedKeys = this.hints.usedKeys;\n const {\n usesArrows,\n usesWASD\n } = getMovementConfiguration(usedKeys);\n if (usesWASD) {\n axes.push(defaultAxesMappings.wasd[0]);\n axes.push(defaultAxesMappings.wasd[1]);\n } else if (usesArrows) {\n axes.push(defaultAxesMappings.arrows[0]);\n axes.push(defaultAxesMappings.arrows[1]);\n } else {\n axes.push(defaultAxesMappings.cursor[0]);\n axes.push(defaultAxesMappings.cursor[1]);\n }\n axes.push(defaultAxesMappings.cursor[0]);\n axes.push(defaultAxesMappings.cursor[1]);\n }\n }\n return padWithEmptyMappings(axes, this.gamepad.axes.length);\n }\n}\nconst defaultHints = () => ({\n usedKeys: new Set(),\n importedSettings: null,\n generated: false\n});\nclass gamepadlib_GamepadLib extends event_target[\"a\" /* default */] {\n constructor() {\n super();\n\n /** @type {Map} */\n this.gamepads = new Map();\n this.handleConnect = this.handleConnect.bind(this);\n this.handleDisconnect = this.handleDisconnect.bind(this);\n this.update = this.update.bind(this);\n this.animationFrame = null;\n this.currentTime = null;\n this.deltaTime = 0;\n this.virtualCursor = {\n x: 0,\n y: 0,\n maxX: Infinity,\n minX: -Infinity,\n maxY: Infinity,\n minY: -Infinity,\n modified: false\n };\n this._editor = null;\n this.connectCallbacks = [];\n this.keysPressedThisFrame = new Set();\n this.oldKeysPressed = new Set();\n this.mouseButtonsPressedThisFrame = new Set();\n this.oldMouseDown = new Set();\n this.addEventHandlers();\n }\n addEventHandlers() {\n window.addEventListener(\"gamepadconnected\", this.handleConnect);\n window.addEventListener(\"gamepaddisconnected\", this.handleDisconnect);\n }\n removeEventHandlers() {\n window.removeEventListener(\"gamepadconnected\", this.handleConnect);\n window.removeEventListener(\"gamepaddisconnected\", this.handleDisconnect);\n }\n gamepadConnected() {\n if (this.gamepads.size > 0) {\n return Promise.resolve();\n }\n return new Promise(resolve => {\n this.connectCallbacks.push(resolve);\n });\n }\n getHints() {\n return Object.assign(defaultHints(), this.getUserHints());\n }\n getUserHints() {\n // to be overridden by users\n return {};\n }\n resetControls() {\n for (const gamepad of this.gamepads.values()) {\n gamepad.resetMappings();\n }\n }\n clearControls() {\n for (const gamepad of this.gamepads.values()) {\n gamepad.clearMappings();\n }\n }\n handleConnect(e) {\n for (const callback of this.connectCallbacks) {\n callback();\n }\n this.connectCallbacks = [];\n const gamepad = e.gamepad;\n const id = getGamepadId(gamepad);\n gamepadlib_console.log(\"connected\", gamepad);\n const gamepadData = new GamepadData(gamepad, this);\n this.gamepads.set(id, gamepadData);\n if (this.animationFrame === null) {\n this.animationFrame = requestAnimationFrame(this.update);\n }\n this.dispatchEvent(new CustomEvent(\"gamepadconnected\", {\n detail: gamepadData\n }));\n }\n handleDisconnect(e) {\n const gamepad = e.gamepad;\n const id = getGamepadId(gamepad);\n gamepadlib_console.log(\"disconnected\", gamepad);\n const gamepadData = this.gamepads.get(id);\n this.gamepads.delete(id);\n this.dispatchEvent(new CustomEvent(\"gamepaddisconnected\", {\n detail: gamepadData\n }));\n if (this.gamepads.size === 0) {\n cancelAnimationFrame(this.animationFrame);\n this.animationFrame = null;\n this.currentTime = null;\n }\n }\n dispatchKey(key, pressed) {\n if (pressed) {\n this.dispatchEvent(new CustomEvent(\"keydown\", {\n detail: key\n }));\n } else {\n this.dispatchEvent(new CustomEvent(\"keyup\", {\n detail: key\n }));\n }\n }\n dispatchMouse(button, down) {\n if (down) {\n this.dispatchEvent(new CustomEvent(\"mousedown\", {\n detail: button\n }));\n } else {\n this.dispatchEvent(new CustomEvent(\"mouseup\", {\n detail: button\n }));\n }\n }\n dispatchMouseMove(x, y) {\n this.dispatchEvent(new CustomEvent(\"mousemove\", {\n detail: {\n x,\n y\n }\n }));\n }\n updateButton(value, mapping) {\n if (mapping.type === \"key\") {\n if (value >= mapping.deadZone) {\n if (mapping.high) {\n this.keysPressedThisFrame.add(mapping.high);\n }\n } else if (value <= -mapping.deadZone) {\n if (mapping.low) {\n this.keysPressedThisFrame.add(mapping.low);\n }\n }\n } else if (mapping.type === \"mousedown\") {\n const isDown = Math.abs(value) >= mapping.deadZone;\n if (isDown) {\n this.mouseButtonsPressedThisFrame.add(mapping.button);\n }\n } else if (mapping.type === \"virtual_cursor\") {\n const deadZone = mapping.deadZone;\n let action;\n if (value >= deadZone) action = mapping.high;\n if (value <= -deadZone) action = mapping.low;\n if (action) {\n // an axis value just beyond the deadzone should have a multiplier near 0, a high value should have a multiplier of 1\n const multiplier = (Math.abs(value) - deadZone) / (1 - deadZone);\n const speed = multiplier * multiplier * mapping.sensitivity * this.deltaTime;\n if (action === \"+x\") {\n this.virtualCursor.x += speed;\n } else if (action === \"-x\") {\n this.virtualCursor.x -= speed;\n } else if (action === \"+y\") {\n this.virtualCursor.y += speed;\n } else if (action === \"-y\") {\n this.virtualCursor.y -= speed;\n }\n this.virtualCursor.modified = true;\n }\n }\n }\n update(time) {\n this.oldKeysPressed = this.keysPressedThisFrame;\n this.oldMouseButtonsPressed = this.mouseButtonsPressedThisFrame;\n this.keysPressedThisFrame = new Set();\n this.mouseButtonsPressedThisFrame = new Set();\n if (this.currentTime === null) {\n this.deltaTime = 0; // doesn't matter what this is, it's just the first frame\n } else {\n this.deltaTime = time - this.currentTime;\n }\n this.deltaTime = Math.max(Math.min(this.deltaTime, 1000), 0);\n this.currentTime = time;\n this.animationFrame = requestAnimationFrame(this.update);\n const gamepads = navigator.getGamepads();\n for (const gamepad of gamepads) {\n if (gamepad === null) {\n continue;\n }\n const id = getGamepadId(gamepad);\n const data = this.gamepads.get(id);\n for (let i = 0; i < gamepad.buttons.length; i++) {\n const button = gamepad.buttons[i];\n const value = button.value;\n const mapping = data.buttonMappings[i];\n this.updateButton(value, mapping);\n }\n for (let i = 0; i < gamepad.axes.length; i++) {\n const axis = gamepad.axes[i];\n const mapping = data.axesMappings[i];\n this.updateButton(axis, mapping);\n }\n }\n if (this._editor) {\n this._editor.update(gamepads);\n }\n for (const key of this.keysPressedThisFrame) {\n if (!this.oldKeysPressed.has(key)) {\n this.dispatchKey(key, true);\n }\n }\n for (const key of this.oldKeysPressed) {\n if (!this.keysPressedThisFrame.has(key)) {\n this.dispatchKey(key, false);\n }\n }\n for (const button of this.mouseButtonsPressedThisFrame) {\n if (!this.oldMouseButtonsPressed.has(button)) {\n this.dispatchMouse(button, true);\n }\n }\n for (const button of this.oldMouseButtonsPressed) {\n if (!this.mouseButtonsPressedThisFrame.has(button)) {\n this.dispatchMouse(button, false);\n }\n }\n if (this.virtualCursor.modified) {\n this.virtualCursor.modified = false;\n if (this.virtualCursor.x > this.virtualCursor.maxX) {\n this.virtualCursor.x = this.virtualCursor.maxX;\n }\n if (this.virtualCursor.x < this.virtualCursor.minX) {\n this.virtualCursor.x = this.virtualCursor.minX;\n }\n if (this.virtualCursor.y > this.virtualCursor.maxY) {\n this.virtualCursor.y = this.virtualCursor.maxY;\n }\n if (this.virtualCursor.y < this.virtualCursor.minY) {\n this.virtualCursor.y = this.virtualCursor.minY;\n }\n this.dispatchMouseMove(this.virtualCursor.x, this.virtualCursor.y);\n }\n }\n editor() {\n if (!this._editor) {\n this._editor = new gamepadlib_GamepadEditor(this);\n }\n return this._editor;\n }\n}\ngamepadlib_GamepadLib.browserHasBrokenGamepadAPI = () => {\n // Check that the gamepad API is supported at all\n if (!navigator.getGamepads) {\n return true;\n }\n // Firefox on Linux before version 123 has a broken gamepad API that results in strange and unusable mappings\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1680982\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1643835\n if (navigator.userAgent.includes(\"Firefox\") && navigator.userAgent.includes(\"Linux\")) {\n const agentMatch = navigator.userAgent.match(/Firefox\\/(\\d+)/);\n // If we couldn't find the version number, we'll assume that this is some distant future version of\n // Firefox that we just can't comprehend with the technology of today. Surely gamepad will work well\n // by then.\n const firefoxMajorVersion = agentMatch ? agentMatch[1] : Infinity;\n return firefoxMajorVersion < 123;\n }\n // Firefox on macOS has other bugs that result in strange and unusable mappings\n // eg. https://bugzilla.mozilla.org/show_bug.cgi?id=1434408\n if (navigator.userAgent.includes(\"Firefox\") && navigator.userAgent.includes(\"Mac OS\")) {\n return true;\n }\n return false;\n};\ngamepadlib_GamepadLib.setConsole = n => gamepadlib_console = n;\nconst removeAllChildren = el => {\n while (el.firstChild) {\n el.removeChild(el.firstChild);\n }\n};\nconst buttonHtmlId = index => \"gamepadlib-button-\".concat(index);\nconst axisHtmlId = n => \"gamepadlib-axis-\".concat(n);\nclass gamepadlib_GamepadEditor extends event_target[\"a\" /* default */] {\n constructor(gamepadLib) {\n super();\n\n /** @type {GamepadLib} */\n this.gamepadLib = gamepadLib;\n this.root = Object.assign(document.createElement(\"div\"), {\n className: \"gamepadlib-root\"\n });\n this.selector = Object.assign(document.createElement(\"select\"), {\n className: \"gamepadlib-selector\"\n });\n this.content = Object.assign(document.createElement(\"div\"), {\n className: \"gamepadlib-content\"\n });\n this.root.appendChild(this.selector);\n this.root.appendChild(this.content);\n this.onSelectorChange = this.onSelectorChange.bind(this);\n this.onGamepadsChange = this.onGamepadsChange.bind(this);\n this.selector.addEventListener(\"change\", this.onSelectorChange);\n this.gamepadLib.addEventListener(\"gamepadconnected\", this.onGamepadsChange);\n this.gamepadLib.addEventListener(\"gamepaddisconnected\", this.onGamepadsChange);\n this.buttonIdToElement = new Map();\n this.axisIdToElement = new Map();\n this.hidden = false;\n\n // should be overridden later\n this.msg = (id, opts) => id;\n }\n onSelectorChange() {\n this.updateContent();\n this.dispatchEvent(new CustomEvent(\"gamepad-changed\"));\n }\n onGamepadsChange() {\n this.updateAllContent();\n this.dispatchEvent(new CustomEvent(\"gamepad-changed\"));\n }\n updateAllContent() {\n this.updateDropdown();\n this.updateContent();\n this.focus();\n }\n updateDropdown() {\n removeAllChildren(this.selector);\n const gamepads = Array.from(this.gamepadLib.gamepads.entries());\n if (gamepads.length === 0) {\n this.selector.hidden = true;\n return;\n }\n this.selector.hidden = false;\n for (const [id, _] of gamepads) {\n const option = document.createElement(\"option\");\n option.textContent = id;\n option.value = id;\n this.selector.appendChild(option);\n }\n }\n keyToString(key) {\n if (key === \" \") return this.msg(\"key-space\");\n if (key === \"ArrowUp\") return this.msg(\"key-up\");\n if (key === \"ArrowDown\") return this.msg(\"key-down\");\n if (key === \"ArrowLeft\") return this.msg(\"key-left\");\n if (key === \"ArrowRight\") return this.msg(\"key-right\");\n if (key === \"Enter\") return this.msg(\"key-enter\");\n if (key.length === 1) {\n return key.toUpperCase();\n }\n // Convert eg. \"PageUp\" -> \"Page Up\"\n return key.replace(/[a-z]([A-Z])/, n => \"\".concat(n[0], \" \").concat(n[1]));\n }\n createButtonMapping(mappingList, index) {\n let {\n property = \"high\",\n allowClick = true\n } = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n const input = document.createElement(\"input\");\n input.readOnly = true;\n input.className = \"gamepadlib-keyinput\";\n input.title = this.msg(\"keyinput-title\");\n input.dataset.index = index;\n const update = () => {\n const mapping = mappingList[index];\n input.dataset.empty = false;\n if (mapping.type === \"key\") {\n if (mapping[property] === null) {\n input.value = this.msg(\"key-none\");\n input.dataset.empty = true;\n } else {\n input.value = this.keyToString(mapping[property]);\n }\n } else if (mapping.type === \"mousedown\") {\n let value = this.msg(\"key-click\");\n if (mapping.button !== 0) {\n value += \" (\".concat(mapping.button, \")\");\n }\n input.value = value;\n } else {\n // should never happen\n input.value = \"??? \".concat(mapping.type);\n }\n };\n const changedMapping = () => {\n mappingList[index] = transformAndCopyMapping(mappingList[index]);\n isAcceptingInput = false;\n input.blur();\n update();\n input.dispatchEvent(new CustomEvent(\"mapping-changed\"));\n this.changed();\n };\n let isAcceptingInput = false;\n const handleClick = e => {\n e.preventDefault();\n if (isAcceptingInput) {\n if (allowClick) {\n const mapping = mappingList[index];\n mapping.type = \"mousedown\";\n mapping.button = e.button;\n changedMapping();\n } else {\n handleBlur();\n }\n } else {\n input.value = \"...\";\n input.dataset.acceptingInput = true;\n isAcceptingInput = true;\n }\n };\n const handleKeyEvent = e => {\n if (isAcceptingInput) {\n e.preventDefault();\n const key = e.key;\n // TW: We allow binding to control and shift\n if ([\"Alt\"].includes(key)) {\n return;\n }\n const mapping = mappingList[index];\n const KEYS = [\"ArrowUp\", \"ArrowDown\", \"ArrowRight\", \"ArrowLeft\", \"Enter\",\n // TW: We support more keys\n // \"Backspace\",\n // \"Delete\",\n \"Shift\", \"CapsLock\", \"ScrollLock\", \"Control\",\n // \"Escape\",\n \"Insert\", \"Home\", \"End\", \"PageUp\", \"PageDown\"];\n if (key.length === 1 || KEYS.includes(key)) {\n mapping.type = \"key\";\n mapping[property] = key;\n } else if (key !== \"Escape\") {\n mapping.type = \"key\";\n mapping[property] = null;\n }\n changedMapping();\n } else if (e.key === \"Enter\") {\n e.preventDefault();\n e.target.click();\n }\n };\n const MODIFIER_KEYS = [\"Shift\", \"Control\"];\n const handleKeyDown = e => {\n if (!MODIFIER_KEYS.includes(e.key)) handleKeyEvent(e);\n };\n const handleKeyUp = e => {\n if (MODIFIER_KEYS.includes(e.key)) handleKeyEvent(e);\n };\n const handleBlur = () => {\n input.dataset.acceptingInput = false;\n if (isAcceptingInput) {\n isAcceptingInput = false;\n update();\n }\n };\n input.addEventListener(\"contextmenu\", e => {\n e.preventDefault();\n });\n input.addEventListener(\"mouseup\", handleClick);\n input.addEventListener(\"keydown\", handleKeyDown);\n input.addEventListener(\"keyup\", handleKeyUp);\n input.addEventListener(\"blur\", handleBlur);\n update();\n return input;\n }\n createAxisMapping(mappingList, index) {\n const selector = document.createElement(\"select\");\n selector.className = \"gamepadlib-axis-mapping\";\n selector.id = axisHtmlId(index);\n selector.appendChild(Object.assign(document.createElement(\"option\"), {\n textContent: this.msg(\"axis-none\"),\n value: \"none\"\n }));\n selector.appendChild(Object.assign(document.createElement(\"option\"), {\n textContent: this.msg(\"axis-cursor\"),\n value: \"cursor\"\n }));\n selector.appendChild(Object.assign(document.createElement(\"option\"), {\n // doesn't really make sense to translate\n textContent: \"WASD\",\n value: \"wasd\"\n }));\n selector.appendChild(Object.assign(document.createElement(\"option\"), {\n textContent: this.msg(\"axis-arrows\"),\n value: \"arrows\"\n }));\n selector.appendChild(Object.assign(document.createElement(\"option\"), {\n textContent: this.msg(\"axis-custom\"),\n value: \"custom\"\n }));\n const updateDropdownValue = () => {\n if (mappingList[index].type === \"key\" || mappingList[index].type === \"mousedown\") {\n if (mappingList[index].high === null && mappingList[index].low === null && mappingList[index + 1].high === null && mappingList[index + 1].low === null) {\n selector.value = \"none\";\n } else if (mappingList[index].high === defaultAxesMappings.wasd[0].high && mappingList[index].low === defaultAxesMappings.wasd[0].low && mappingList[index + 1].high === defaultAxesMappings.wasd[1].high && mappingList[index + 1].low === defaultAxesMappings.wasd[1].low) {\n selector.value = \"wasd\";\n } else if (mappingList[index].high === defaultAxesMappings.arrows[0].high && mappingList[index].low === defaultAxesMappings.arrows[0].low && mappingList[index + 1].high === defaultAxesMappings.arrows[1].high && mappingList[index + 1].low === defaultAxesMappings.arrows[1].low) {\n selector.value = \"arrows\";\n } else {\n selector.value = \"custom\";\n }\n } else if (mappingList[index].type === \"virtual_cursor\") {\n selector.value = \"cursor\";\n } else {\n // should never happen\n selector.value = \"none\";\n }\n };\n updateDropdownValue();\n const circleOverlay = document.createElement(\"div\");\n circleOverlay.className = \"gamepadlib-axis-circle-overlay\";\n const updateOverlay = () => {\n removeAllChildren(circleOverlay);\n if (mappingList[index].type === \"key\") {\n const buttons = [this.createButtonMapping(mappingList, index + 1, {\n property: \"low\",\n allowClick: false\n }), this.createButtonMapping(mappingList, index, {\n property: \"low\",\n allowClick: false\n }), this.createButtonMapping(mappingList, index, {\n property: \"high\",\n allowClick: false\n }), this.createButtonMapping(mappingList, index + 1, {\n property: \"high\",\n allowClick: false\n })];\n for (const button of buttons) {\n button.classList.add(\"gamepadlib-axis-mapper\");\n button.addEventListener(\"mapping-changed\", updateDropdownValue);\n circleOverlay.appendChild(button);\n }\n }\n };\n updateOverlay();\n selector.addEventListener(\"change\", () => {\n if (selector.value === \"custom\") {\n // If key mappings already exist, leave them as-is\n if (mappingList[index].type !== \"key\") {\n mappingList[index] = transformAndCopyMapping(defaultAxesMappings.arrows[0]);\n mappingList[index + 1] = transformAndCopyMapping(defaultAxesMappings.arrows[1]);\n }\n } else if (selector.value === \"arrows\") {\n mappingList[index] = transformAndCopyMapping(defaultAxesMappings.arrows[0]);\n mappingList[index + 1] = transformAndCopyMapping(defaultAxesMappings.arrows[1]);\n } else if (selector.value === \"wasd\") {\n mappingList[index] = transformAndCopyMapping(defaultAxesMappings.wasd[0]);\n mappingList[index + 1] = transformAndCopyMapping(defaultAxesMappings.wasd[1]);\n } else if (selector.value === \"cursor\") {\n mappingList[index] = transformAndCopyMapping(defaultAxesMappings.cursor[0]);\n mappingList[index + 1] = transformAndCopyMapping(defaultAxesMappings.cursor[1]);\n } else {\n mappingList[index] = transformAndCopyMapping(emptyMapping());\n mappingList[index + 1] = transformAndCopyMapping(emptyMapping());\n }\n updateOverlay();\n this.changed();\n });\n return {\n circleOverlay,\n selector\n };\n }\n hasControllerSelected() {\n return !!this.selector.value;\n }\n updateContent() {\n removeAllChildren(this.content);\n if (this.hidden) {\n return;\n }\n const selectedId = this.selector.value;\n if (!selectedId) {\n const message = document.createElement(\"div\");\n message.textContent = this.msg(\"no-controllers\");\n this.content.appendChild(message);\n return;\n }\n const gamepadData = this.gamepadLib.gamepads.get(selectedId);\n if (!gamepadData) {\n // Users should never be able to see this\n const message = document.createElement(\"div\");\n message.textContent = \"Cannot find controller: \".concat(selectedId);\n this.content.appendChild(message);\n return;\n }\n this.buttonIdToElement.clear();\n this.axisIdToElement.clear();\n const mappingsContainer = document.createElement(\"div\");\n mappingsContainer.className = \"gamepadlib-content-buttons\";\n const buttonMappings = gamepadData.buttonMappings;\n for (let i = 0; i < buttonMappings.length; i++) {\n const container = document.createElement(\"div\");\n container.className = \"gamepadlib-mapping\";\n container.dataset.id = i;\n const label = document.createElement(\"label\");\n label.className = \"gamepadlib-mapping-label\";\n label.textContent = this.msg(\"button-n\", {\n n: i\n });\n const id = buttonHtmlId(i);\n label.htmlFor = id;\n const options = document.createElement(\"div\");\n options.className = \"gamepadlib-mapping-options\";\n const mappingInput = this.createButtonMapping(buttonMappings, i);\n mappingInput.id = id;\n options.appendChild(mappingInput);\n container.appendChild(label);\n container.appendChild(options);\n mappingsContainer.appendChild(container);\n this.buttonIdToElement.set(i, container);\n }\n const axesContainer = document.createElement(\"div\");\n axesContainer.className = \"gamepadlib-content-axes\";\n const axesMappings = gamepadData.axesMappings;\n for (let i = 0; i < axesMappings.length; i += 2) {\n const container = document.createElement(\"div\");\n container.className = \"gamepadlib-axis\";\n const label = document.createElement(\"label\");\n label.textContent = this.msg(\"axes-a-b\", {\n a: i,\n b: i + 1\n });\n label.htmlFor = axisHtmlId(i);\n const circle = document.createElement(\"div\");\n circle.className = \"gamepadlib-axis-circle\";\n const {\n circleOverlay,\n selector\n } = this.createAxisMapping(axesMappings, i);\n circle.appendChild(circleOverlay);\n const dot = document.createElement(\"div\");\n dot.className = \"gamepadlib-axis-dot\";\n circle.appendChild(dot);\n container.appendChild(label);\n container.appendChild(circle);\n container.appendChild(selector);\n axesContainer.appendChild(container);\n this.axisIdToElement.set(i, dot);\n }\n this.content.appendChild(mappingsContainer);\n this.content.appendChild(axesContainer);\n }\n update(gamepads) {\n if (this.hidden) {\n return;\n }\n const selectedId = this.selector.value;\n if (!selectedId) {\n return;\n }\n const gamepad = Array.from(gamepads).find(i => i && getGamepadId(i) === this.selector.value);\n if (!gamepad) {\n return;\n }\n for (let i = 0; i < gamepad.buttons.length; i++) {\n const element = this.buttonIdToElement.get(i);\n if (element) {\n const button = gamepad.buttons[i];\n const value = button.value.toString();\n if (value !== element.dataset.value) {\n element.dataset.value = value;\n }\n }\n }\n for (let i = 0; i < gamepad.axes.length; i += 2) {\n const element = this.axisIdToElement.get(i);\n if (element) {\n const x = gamepad.axes[i];\n const y = gamepad.axes[i + 1] || 0;\n const size = 150 / 2;\n element.style.transform = \"translate(-50%, -50%) translate(\".concat(x * size, \"px, \").concat(y * size, \"px)\");\n }\n }\n }\n export() {\n const selectedId = this.selector.value;\n if (!selectedId) {\n return null;\n }\n const gamepadData = this.gamepadLib.gamepads.get(selectedId);\n if (!gamepadData) {\n return null;\n }\n return {\n axes: gamepadData.axesMappings.map(prepareAxisMappingForExport),\n buttons: gamepadData.buttonMappings.map(prepareButtonMappingForExport)\n };\n }\n changed() {\n this.dispatchEvent(new CustomEvent(\"mapping-changed\"));\n }\n hide() {\n this.hidden = true;\n this.updateContent();\n }\n focus() {\n if (this.selector.value) {\n this.selector.focus();\n }\n }\n generateEditor() {\n this.hidden = false;\n this.updateAllContent();\n return this.root;\n }\n}\n/* harmony default export */ var gamepadlib = (gamepadlib_GamepadLib);\n// EXTERNAL MODULE: ./src/addons/libraries/common/cs/small-stage.js\nvar small_stage = __webpack_require__(1379);\n\n// CONCATENATED MODULE: ./src/addons/addons/gamepad/userscript.js\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n\n\n/* harmony default export */ var userscript = (async function (_ref) {\n let {\n addon,\n console,\n msg\n } = _ref;\n const vm = addon.tab.traps.vm;\n\n // Wait for the project to finish loading. Renderer and scripts will not be fully available until this happens.\n await new Promise(resolve => {\n if (vm.editingTarget) return resolve();\n vm.runtime.once(\"PROJECT_LOADED\", resolve);\n });\n const vmStarted = () => vm.runtime._steppingInterval !== null;\n const scratchKeyToKey = key => {\n switch (key) {\n case \"right arrow\":\n return \"ArrowRight\";\n case \"up arrow\":\n return \"ArrowUp\";\n case \"left arrow\":\n return \"ArrowLeft\";\n case \"down arrow\":\n return \"ArrowDown\";\n case \"enter\":\n return \"Enter\";\n case \"space\":\n return \" \";\n }\n return key.toLowerCase().charAt(0);\n };\n const getKeysUsedByProject = () => {\n const allBlocks = [vm.runtime.getTargetForStage(), ...vm.runtime.targets].filter(i => i.isOriginal).map(i => i.blocks);\n const result = new Set();\n for (const blocks of allBlocks) {\n for (const block of Object.values(blocks._blocks)) {\n if (block.opcode === \"event_whenkeypressed\" || block.opcode === \"sensing_keyoptions\") {\n // For blocks like \"key (my variable) pressed?\", the sensing_keyoptions still exists but has a null parent.\n if (block.opcode === \"sensing_keyoptions\" && !block.parent) {\n continue;\n }\n const key = block.fields.KEY_OPTION.value;\n result.add(scratchKeyToKey(key));\n }\n }\n }\n return result;\n };\n const GAMEPAD_CONFIG_MAGIC = \" // _gamepad_\";\n const findOptionsComment = () => {\n const target = vm.runtime.getTargetForStage();\n const comments = target.comments;\n for (const comment of Object.values(comments)) {\n if (comment.text.includes(GAMEPAD_CONFIG_MAGIC)) {\n return comment;\n }\n }\n return null;\n };\n const parseOptionsComment = () => {\n const comment = findOptionsComment();\n if (!comment) {\n return null;\n }\n const lineWithMagic = comment.text.split(\"\\n\").find(i => i.endsWith(GAMEPAD_CONFIG_MAGIC));\n if (!lineWithMagic) {\n console.warn(\"Gamepad comment does not contain valid line\");\n return null;\n }\n const jsonText = lineWithMagic.substr(0, lineWithMagic.length - GAMEPAD_CONFIG_MAGIC.length);\n let parsed;\n try {\n parsed = JSON.parse(jsonText);\n if (!parsed || typeof parsed !== \"object\" || !Array.isArray(parsed.buttons) || !Array.isArray(parsed.axes)) {\n throw new Error(\"Invalid data\");\n }\n } catch (e) {\n console.warn(\"Gamepad comment has invalid JSON\", e);\n return null;\n }\n return parsed;\n };\n gamepadlib.setConsole(console);\n const gamepad = new gamepadlib();\n gamepad.getUserHints = () => {\n const parsedOptions = parseOptionsComment();\n if (parsedOptions) {\n return {\n importedSettings: parsedOptions\n };\n }\n return {\n usedKeys: getKeysUsedByProject()\n };\n };\n vm.runtime.on(\"PROJECT_LOADED\", () => {\n gamepad.resetControls();\n });\n if (addon.settings.get(\"hide\")) {\n await new Promise(resolve => {\n const end = () => {\n addon.settings.removeEventListener(\"change\", listener);\n resolve();\n };\n const listener = () => {\n if (!addon.settings.get(\"hide\")) {\n end();\n }\n };\n gamepad.gamepadConnected().then(end);\n addon.settings.addEventListener(\"change\", listener);\n });\n }\n const renderer = vm.runtime.renderer;\n const stageWidth = () => vm.runtime.stageWidth;\n const stageHeight = () => vm.runtime.stageHeight;\n const canvas = renderer.canvas;\n const container = document.createElement(\"div\");\n container.className = \"sa-gamepad-container\";\n addon.tab.displayNoneWhileDisabled(container, {\n display: \"flex\"\n });\n const buttonContainer = document.createElement(\"span\");\n buttonContainer.className = addon.tab.scratchClass(\"button_outlined-button\", \"stage-header_stage-button\");\n const buttonContent = document.createElement(\"div\");\n buttonContent.className = addon.tab.scratchClass(\"button_content\");\n const buttonImage = document.createElement(\"img\");\n buttonImage.className = addon.tab.scratchClass(\"stage-header_stage-button-icon\");\n buttonImage.draggable = false;\n buttonImage.src = addon.self.getResource(\"/gamepad.svg\") /* rewritten by pull.js */;\n buttonContent.appendChild(buttonImage);\n buttonContainer.appendChild(buttonContent);\n container.appendChild(buttonContainer);\n let editor;\n let shouldStoreSettingsInProject = false;\n const didChangeProject = () => {\n vm.runtime.emitProjectChanged();\n if (vm.editingTarget === vm.runtime.getTargetForStage()) {\n vm.emitWorkspaceUpdate();\n }\n };\n const storeMappings = () => {\n const exported = editor.export();\n if (!exported) {\n console.warn(\"Could not export gamepad settings\");\n return;\n }\n const text = \"\".concat(msg(\"config-header\"), \"\\n\").concat(JSON.stringify(exported)).concat(GAMEPAD_CONFIG_MAGIC);\n const existingComment = findOptionsComment();\n if (existingComment) {\n existingComment.text = text;\n } else {\n const target = vm.runtime.getTargetForStage();\n target.createComment(\n // comment ID, just has to be a random string\n Math.random() + \"\",\n // block ID\n null,\n // text\n text,\n // x, y, width, height\n 50, 50, 350, 150,\n // minimized\n false);\n }\n didChangeProject();\n };\n const removeStoredMappings = () => {\n const comment = findOptionsComment();\n if (comment) {\n const target = vm.runtime.getTargetForStage();\n delete target.comments[comment.id];\n didChangeProject();\n }\n };\n const handleGamepadMappingChanged = () => {\n if (shouldStoreSettingsInProject) {\n storeMappings();\n }\n };\n const handleStoreSettingsCheckboxChanged = e => {\n shouldStoreSettingsInProject = !!e.target.checked;\n if (shouldStoreSettingsInProject) {\n storeMappings();\n } else {\n removeStoredMappings();\n }\n };\n const handleEditorControllerChanged = () => {\n document.body.classList.toggle(\"sa-gamepad-has-controller\", editor.hasControllerSelected());\n handleGamepadMappingChanged();\n };\n buttonContainer.addEventListener(\"click\", () => {\n if (!editor) {\n editor = gamepad.editor();\n editor.msg = msg;\n editor.addEventListener(\"mapping-changed\", handleGamepadMappingChanged);\n editor.addEventListener(\"gamepad-changed\", handleEditorControllerChanged);\n }\n const editorEl = editor.generateEditor();\n handleEditorControllerChanged();\n const {\n backdrop,\n container,\n content,\n closeButton,\n remove\n } = addon.tab.createModal(msg(\"settings\"), {\n isOpen: true,\n useEditorClasses: true\n });\n const handleKeyDown = e => {\n if (e.key === \"Escape\" && !e.target.closest(\"[data-accepting-input]\")) {\n remove();\n }\n };\n backdrop.addEventListener(\"click\", remove);\n window.addEventListener(\"keydown\", handleKeyDown);\n addon.self.addEventListener(\"disabled\", remove);\n backdrop.classList.add(\"sa-gamepad-popup-outer\");\n container.classList.add(\"sa-gamepad-popup\");\n closeButton.tabIndex = \"0\";\n closeButton.setAttribute(\"role\", \"button\");\n closeButton.addEventListener(\"click\", remove);\n closeButton.addEventListener(\"keydown\", e => {\n if (e.key === \"Enter\" || e.key === \" \") {\n remove();\n }\n });\n content.classList.add(\"sa-gamepad-popup-content\");\n if (gamepadlib.browserHasBrokenGamepadAPI()) {\n const warning = document.createElement(\"div\");\n warning.textContent = msg(\"browser-support\");\n warning.className = \"sa-gamepad-browser-support-warning\";\n content.appendChild(warning);\n }\n content.appendChild(editorEl);\n const extraOptionsContainer = document.createElement(\"div\");\n extraOptionsContainer.className = \"sa-gamepad-extra-options\";\n content.appendChild(extraOptionsContainer);\n const mappingsWereResetOrCleared = () => {\n editor.updateAllContent();\n storeSettingsCheckbox.checked = false;\n shouldStoreSettingsInProject = false;\n };\n const resetButton = document.createElement(\"button\");\n resetButton.className = \"sa-gamepad-reset-button\";\n resetButton.textContent = msg(\"reset\");\n resetButton.addEventListener(\"click\", () => {\n gamepad.resetControls();\n mappingsWereResetOrCleared();\n });\n extraOptionsContainer.appendChild(resetButton);\n const clearButton = document.createElement(\"button\");\n clearButton.className = \"sa-gamepad-reset-button\";\n clearButton.textContent = msg(\"clear\");\n clearButton.addEventListener(\"click\", () => {\n gamepad.clearControls();\n mappingsWereResetOrCleared();\n });\n extraOptionsContainer.appendChild(clearButton);\n const storeSettingsLabel = document.createElement(\"label\");\n storeSettingsLabel.className = \"sa-gamepad-store-settings\";\n storeSettingsLabel.textContent = msg(\"store-in-project\");\n const storeSettingsCheckbox = document.createElement(\"input\");\n storeSettingsCheckbox.type = \"checkbox\";\n storeSettingsCheckbox.checked = shouldStoreSettingsInProject;\n storeSettingsCheckbox.addEventListener(\"change\", handleStoreSettingsCheckboxChanged);\n storeSettingsLabel.prepend(storeSettingsCheckbox);\n extraOptionsContainer.appendChild(storeSettingsLabel);\n editor.focus();\n });\n Object(small_stage[\"a\" /* default */])();\n const virtualCursorElement = document.createElement(\"img\");\n virtualCursorElement.hidden = true;\n virtualCursorElement.className = \"sa-gamepad-cursor\";\n virtualCursorElement.src = addon.self.getResource(\"/cursor.png\") /* rewritten by pull.js */;\n addon.self.addEventListener(\"disabled\", () => {\n virtualCursorElement.hidden = true;\n });\n let hideCursorTimeout;\n const hideRealCursor = () => {\n document.body.classList.add(\"sa-gamepad-hide-cursor\");\n };\n const showRealCursor = () => {\n document.body.classList.remove(\"sa-gamepad-hide-cursor\");\n };\n const virtualCursorSetVisible = visible => {\n virtualCursorElement.hidden = !visible;\n clearTimeout(hideCursorTimeout);\n if (visible) {\n hideRealCursor();\n hideCursorTimeout = setTimeout(virtualCursorHide, 8000);\n }\n };\n const virtualCursorHide = () => {\n virtualCursorSetVisible(false);\n };\n const virtualCursorSetDown = down => {\n virtualCursorSetVisible(true);\n virtualCursorElement.classList.toggle(\"sa-gamepad-cursor-down\", down);\n };\n const virtualCursorSetPosition = (x, y) => {\n virtualCursorSetVisible(true);\n const CURSOR_SIZE = 6;\n const stageX = stageWidth() / 2 + x - CURSOR_SIZE / 2;\n const stageY = stageHeight() / 2 - y - CURSOR_SIZE / 2;\n virtualCursorElement.style.transform = \"translate(\".concat(stageX, \"px, \").concat(stageY, \"px)\");\n };\n document.addEventListener(\"mousemove\", () => {\n virtualCursorSetVisible(false);\n showRealCursor();\n });\n let getCanvasSize;\n // Support modern ResizeObserver and slow getBoundingClientRect version for improved browser support (matters for TurboWarp)\n if (window.ResizeObserver) {\n let canvasWidth = stageWidth();\n let canvasHeight = stageHeight();\n const resizeObserver = new ResizeObserver(entries => {\n for (const entry of entries) {\n canvasWidth = entry.contentRect.width;\n canvasHeight = entry.contentRect.height;\n }\n });\n resizeObserver.observe(canvas);\n getCanvasSize = () => [canvasWidth, canvasHeight];\n } else {\n getCanvasSize = () => {\n const rect = canvas.getBoundingClientRect();\n return [rect.width, rect.height];\n };\n }\n\n // Both in Scratch space\n let virtualX = 0;\n let virtualY = 0;\n const postMouseData = data => {\n if (addon.self.disabled || !vmStarted()) return;\n const [rectWidth, rectHeight] = getCanvasSize();\n vm.postIOData(\"mouse\", _objectSpread(_objectSpread({}, data), {}, {\n canvasWidth: rectWidth,\n canvasHeight: rectHeight,\n x: (virtualX + stageWidth() / 2) * (rectWidth / stageWidth()),\n y: (stageHeight() / 2 - virtualY) * (rectHeight / stageHeight())\n }));\n };\n const postKeyboardData = (key, isDown) => {\n if (addon.self.disabled || !vmStarted()) return;\n vm.postIOData(\"keyboard\", {\n key,\n isDown\n });\n };\n const handleGamepadButtonDown = e => postKeyboardData(e.detail, true);\n const handleGamepadButtonUp = e => postKeyboardData(e.detail, false);\n const handleGamepadMouseDown = e => {\n virtualCursorSetDown(true);\n postMouseData({\n isDown: true,\n button: e.detail\n });\n };\n const handleGamepadMouseUp = e => {\n virtualCursorSetDown(false);\n postMouseData({\n isDown: false,\n button: e.detail\n });\n };\n const handleGamepadMouseMove = e => {\n virtualX = e.detail.x;\n virtualY = e.detail.y;\n virtualCursorSetPosition(virtualX, virtualY);\n postMouseData({});\n };\n const updateStageSize = () => {\n gamepad.virtualCursor.maxX = renderer._xRight;\n gamepad.virtualCursor.minX = renderer._xLeft;\n gamepad.virtualCursor.maxY = renderer._yTop;\n gamepad.virtualCursor.minY = renderer._yBottom;\n if (!virtualCursorElement.hidden) {\n virtualCursorSetPosition(virtualX, virtualY);\n }\n };\n vm.on(\"STAGE_SIZE_CHANGED\", updateStageSize);\n updateStageSize();\n gamepad.addEventListener(\"keydown\", handleGamepadButtonDown);\n gamepad.addEventListener(\"keyup\", handleGamepadButtonUp);\n gamepad.addEventListener(\"mousedown\", handleGamepadMouseDown);\n gamepad.addEventListener(\"mouseup\", handleGamepadMouseUp);\n gamepad.addEventListener(\"mousemove\", handleGamepadMouseMove);\n while (true) {\n const target = await addon.tab.waitForElement('[class^=\"stage-header_stage-size-row\"], [class^=\"stage-header_fullscreen-buttons-row_\"]', {\n markAsSeen: true,\n reduxEvents: [\"scratch-gui/mode/SET_PLAYER\", \"scratch-gui/mode/SET_FULL_SCREEN\", \"fontsLoaded/SET_FONTS_LOADED\", \"scratch-gui/locales/SELECT_LOCALE\"]\n });\n container.dataset.editorMode = addon.tab.editorMode;\n if (target.closest('[class^=\"stage-header_stage-size-row\"]')) {\n addon.tab.appendToSharedSpace({\n space: \"stageHeader\",\n element: container,\n order: 1\n });\n } else {\n addon.tab.appendToSharedSpace({\n space: \"fullscreenStageHeader\",\n element: container,\n order: 0\n });\n }\n vm.renderer.addOverlay(virtualCursorElement, \"scale\");\n }\n});\n// EXTERNAL MODULE: ./node_modules/css-loader!./src/addons/addons/gamepad/style.css\nvar style = __webpack_require__(1491);\nvar style_default = /*#__PURE__*/__webpack_require__.n(style);\n\n// EXTERNAL MODULE: ./node_modules/css-loader!./src/addons/addons/gamepad/gamepadlib.css\nvar gamepad_gamepadlib = __webpack_require__(1492);\nvar gamepadlib_default = /*#__PURE__*/__webpack_require__.n(gamepad_gamepadlib);\n\n// CONCATENATED MODULE: ./node_modules/url-loader/dist/cjs.js!./src/addons/addons/gamepad/active.png\n/* harmony default export */ var active = (\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAGAQMAAADaAn0LAAAABlBMVEX///8AAABVwtN+AAAADklEQVQI12MAAQMgBAIAAkwAYUis6mUAAAAASUVORK5CYII=\");\n// CONCATENATED MODULE: ./node_modules/url-loader/dist/cjs.js!./src/addons/addons/gamepad/close.svg\n/* harmony default export */ var gamepad_close = (\"data:image/svg+xml;base64,PHN2ZyBkYXRhLW5hbWU9IkxheWVyIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDcuNDggNy40OCI+PHBhdGggZD0iTTMuNzQgNi40OFYxTTEgMy43NGg1LjQ4IiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojZmZmO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6MnB4Ii8+PC9zdmc+\");\n// CONCATENATED MODULE: ./node_modules/url-loader/dist/cjs.js!./src/addons/addons/gamepad/cursor.png\n/* harmony default export */ var cursor = (\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAGAQMAAADaAn0LAAAABlBMVEUAAAD///+l2Z/dAAAADklEQVQI12MAAQMgBAIAAkwAYUis6mUAAAAASUVORK5CYII=\");\n// CONCATENATED MODULE: ./node_modules/url-loader/dist/cjs.js!./src/addons/addons/gamepad/dot.svg\n/* harmony default export */ var dot = (\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4IiBoZWlnaHQ9IjgiIHZpZXdCb3g9IjAgMCAyLjExNyAyLjExNyI+PGNpcmNsZSBjeD0iMS4wNTgiIGN5PSIxLjA1OCIgcj0iMS4wNTgiIGZpbGw9InJlZCIvPjwvc3ZnPg==\");\n// CONCATENATED MODULE: ./node_modules/url-loader/dist/cjs.js!./src/addons/addons/gamepad/gamepad.svg\n/* harmony default export */ var gamepad_gamepad = (\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGFyaWEtaGlkZGVuPSJ0cnVlIiB3aWR0aD0iMWVtIiBoZWlnaHQ9IjFlbSIgc3R5bGU9Ii1tcy10cmFuc2Zvcm06cm90YXRlKDM2MGRlZyk7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDM2MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpIiB2aWV3Qm94PSIwIDAgNTEyIDUxMiI+PHBhdGggZmlsbD0iIzU3NWU3NSIgZD0iTTM2OCAxNjhoLTk2di02NGgxNzZhMjQuMDI3IDI0LjAyNyAwIDAgMCAyNC0yNFYxNmgtMzJ2NTZIMjY0YTI0LjAyNyAyNC4wMjcgMCAwIDAtMjQgMjR2NzJoLTk2QTEyOC4xNDUgMTI4LjE0NSAwIDAgMCAxNiAyOTZ2MTAwLjk1M0E5MS4xNSA5MS4xNSAwIDAgMCAxMDcuMDQ3IDQ4OGgxLjhhOTAuODA3IDkwLjgwNyAwIDAgMCA2OS45NTMtMzIuNzZMMjMxLjUgMzkyaDQ4LjYyOGw1Mi42NjYgNjguNDY1QTkxLjA0NiA5MS4wNDYgMCAwIDAgNDk2IDQwNC45NTNWMjk2YTEyOC4xNDUgMTI4LjE0NSAwIDAgMC0xMjgtMTI4em05NiAyMzYuOTUzYTU5LjA0NyA1OS4wNDcgMCAwIDEtMTA1Ljg0OSAzNkwyOTUuODc4IDM2MGgtNzkuMzcybC02Mi4yOTQgNzQuNzU0QTU4Ljg5MyA1OC44OTMgMCAwIDEgMTA4Ljg1IDQ1NmgtMS44QTU5LjExMyA1OS4xMTMgMCAwIDEgNDggMzk2Ljk1M1YyOTZhOTYuMTA4IDk2LjEwOCAwIDAgMSA5Ni05NmgyMjRhOTYuMTA4IDk2LjEwOCAwIDAgMSA5NiA5NnoiLz48cGF0aCBmaWxsPSIjNTc1ZTc1IiBkPSJNMzYwIDI0OGgzMnYzMmgtMzJ6bTAgODBoMzJ2MzJoLTMyem0tNDAtNDBoMzJ2MzJoLTMyem04MCAwaDMydjMyaC0zMnptLTI0OC00MGgtMzJ2NDBIODB2MzJoNDB2NDBoMzJ2LTQwaDQwdi0zMmgtNDB2LTQweiIvPjwvc3ZnPg==\");\n// CONCATENATED MODULE: ./src/addons/addons/gamepad/_runtime_entry.js\n/* generated by pull.js */\n\n\n\n\n\n\n\n\nconst resources = {\n \"userscript.js\": userscript,\n \"style.css\": style_default.a,\n \"gamepadlib.css\": gamepadlib_default.a,\n \"active.png\": active,\n \"close.svg\": gamepad_close,\n \"cursor.png\": cursor,\n \"dot.svg\": dot,\n \"gamepad.svg\": gamepad_gamepad\n};\n\n/***/ })\n\n}]);","inputSourceMap":null}