PK!V  hoist/__init__.pyimport aiohttp __version__ = '0.1.1' from pathlib import Path from aiohttp import web import asyncio import json import os import sys import uuid from collections import namedtuple from typing import Optional, Union import webbrowser import websockets from jinja2 import Template from . import util ENV = 'env' CMD = 'cmd' REF = 'ref' SEQ = 'seq' PAR = 'par' DEFAULT_SECTION = 'hoist.defaults' CMD_KEYS = {CMD, REF, SEQ, PAR} RESERVED_KEYS = CMD_KEYS | {ENV} Command = namedtuple('Command', ['command', 'environ', 'alias']) Parallel = namedtuple('Parallel', ['commands']) Sequence = namedtuple('Sequence', ['commands']) FlowType = Union[Parallel, Sequence] def resolve_commands(config, input_arguments, command_name, parent_commands=None): parent_commands = list(parent_commands or []) command = util.nested_keys(config, command_name) if command is None: raise Exception(f'Command {command_name!r} not found') if len(CMD_KEYS & set(command)) != 1: raise Exception(f'Invalid command: {command}') if REF in command: command = dict(command) command[PAR] = [command.pop(REF)] if PAR in command: resolved = [] for ref in command[PAR]: resolved.append(resolve_commands( config=config, input_arguments=input_arguments, command_name=ref, parent_commands=parent_commands + [command] )) return Parallel(commands=resolved) if SEQ in command: resolved = [] for ref in command[SEQ]: resolved.append(resolve_commands( config=config, input_arguments=input_arguments, command_name=ref, parent_commands=parent_commands + [command] )) return Sequence(resolved) commands = [command] + parent_commands defaults = dict(util.nested_keys(config, DEFAULT_SECTION) or {}) environment_variables = dict(defaults.pop(ENV, {})) input_variables = dict(defaults) for cmd in commands: for key in cmd: if key not in RESERVED_KEYS: input_variables[key] = cmd[key] environment_variables.update(cmd.get(ENV, {})) input_variables.update(input_arguments) for mapping in (environment_variables, input_variables): for key, value in mapping.items(): if isinstance(value, str): mapping[key] = Template(value).render(env=os.environ) command_values = command[CMD] if not isinstance(command_values, list): command_values = [command_values] return Sequence(commands=[ Command( command=Template(command_value).render(env=os.environ, **input_variables), environ=environment_variables, alias=input_variables.get('alias'), ) for command_value in command_values ]) async def gather_stream(queue, connections): while True: message = await queue.get() if message is None: return for connection in set(connections): try: await connection.send(json.dumps(message)) except: pass async def stream_pipe(stream, out): while True: line = await stream.readline() line = line.decode().rstrip() await out(line) if not line: break async def execute_command(command_data, loop, queue): env = os.environ.copy() for key, value in command_data.environ.items(): env[key] = str(value) process = await asyncio.create_subprocess_shell( command_data.command, loop=loop, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE, env=env, bufsize=0, ) def queue_output(type): async def out(message): output_message = dict( alias=command_data.alias or command_data.command, id=str(uuid.uuid4()), cmd=command_data.command, pid=process.pid, std=type, message=message, ) await queue.put(output_message) return out await asyncio.gather( stream_pipe(process.stdout, queue_output(type='out')), stream_pipe(process.stderr, queue_output(type='err')), ) def init_loop(): if sys.platform == 'win32': loop = asyncio.ProactorEventLoop() asyncio.set_event_loop(loop) return asyncio.get_event_loop() async def serve_websockets(host, port, connections): async def consumer_handler(websocket, path): connections.add(websocket) try: print(f'Websocket connection established!') await websocket.recv() except websockets.exceptions.ConnectionClosed: print(f'Websocket connection closed!') finally: connections.remove(websocket) print(f'Opening socket: ws://{host}:{port}') await websockets.serve(consumer_handler, host, port) async def check_signal(signal): while True: await asyncio.sleep(0.5) if signal(): sys.exit(0) async def iterate(command: Union[FlowType, Command], loop, queue): if isinstance(command, Parallel): await asyncio.gather(*[ iterate(command=child_command, loop=loop, queue=queue) for child_command in command.commands ]) elif isinstance(command, Sequence): for child_command in command.commands: await iterate(command=child_command, loop=loop, queue=queue) elif isinstance(command, Command): await execute_command(command_data=command, loop=loop, queue=queue) async def execute_workflow(command: Union[FlowType, Command], loop, queue, connections, signal): if connections is not None: print('Waiting for first websocket connection...') while not connections: await asyncio.sleep(0.1) await iterate(command, loop, queue) signal.append(None) def start_hoist(command: FlowType, host: str, port: Optional[int]): loop = init_loop() queue = asyncio.Queue() connections = set() signal = [] webapp_port = util.find_free_port() browser_url = f'http://{host}:{webapp_port}/index.html?host={host}&port={port}' print(f'Opening browser: {browser_url}') webbrowser.open_new_tab(browser_url) loop.run_until_complete( asyncio.gather( serve_websockets(host=host, port=port, connections=connections), run_web_app(host=host, port=webapp_port), execute_workflow(command=command, loop=loop, queue=queue, connections=connections, signal=signal), gather_stream(queue=queue, connections=connections), check_signal(lambda: signal) ) ) def log_workflow(command, indent=0): offset = indent * ' ' if isinstance(command, (Parallel, Sequence)): print(offset, '-', type(command).__name__) for child in command.commands: log_workflow(child, indent + 2) else: print(offset, '*', command) async def run_web_app(host, port): app = web.Application() app.router.add_static('/', path=str(Path(__file__).parent / 'web_files')) runner = aiohttp.web.AppRunner(app) await runner.setup() site = aiohttp.web.TCPSite(runner, host=host, port=port) await site.start() def main(): try: input_arguments = util.parse_args() config = util.load_config(input_arguments.pop('hoist_file')) hoist_addr, hoist_port = input_arguments.pop('hoist_addr'), input_arguments.pop('hoist_port') command_names = input_arguments.pop('command') all_commands = [] for command_name in command_names: all_commands.append(resolve_commands(config, input_arguments, command_name)) command = Sequence(all_commands) print('=' * 80) print() log_workflow(command=command) print() print('=' * 80) print() start_hoist(command=command, host=hoist_addr, port=hoist_port) except KeyboardInterrupt: pass if __name__ == '__main__': main() PK!C?;;hoist/__main__.pyimport hoist if __name__ == '__main__': hoist.main() PK!Y_L hoist/util.pyimport argparse from typing import Dict, Any import toml import socket from contextlib import closing def load_config(path: str) -> Dict: with open(path) as f: return toml.load(f) def parse_args() -> Dict[str, str]: parser = argparse.ArgumentParser() parser.add_argument('command', nargs='*', default=['hoist.main'], help='The command(s) to execute') parser.add_argument('--hoist-file', '-f', default='hoist.toml', help='The TOML file containing hoist commands') parser.add_argument('--hoist-addr', '-a', default='localhost', help='Websockets host name to bind to') parser.add_argument('--hoist-port', '-p', default=0, help='Websockets port to bind to') parsed, unknown = parser.parse_known_args() for arg in unknown: if arg.startswith(('-', '--')): parser.add_argument(arg) variables = vars(parser.parse_args()) if variables['hoist_port'] == 0: variables['hoist_port'] = find_free_port() return variables def nested_keys(dictionary: Dict, key_path: str) -> Any: keys = key_path.split('.') for key in keys: try: dictionary = dictionary[key] except KeyError: return None return dictionary def find_free_port(): """ https://stackoverflow.com/a/45690594 """ with closing(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as s: s.bind(('', 0)) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) return s.getsockname()[1] PK!#hoist/web_files/asset-manifest.json{ "main.css": "/static/css/main.a5870b6d.chunk.css", "main.js": "/static/js/main.59cfe229.chunk.js", "main.js.map": "/static/js/main.59cfe229.chunk.js.map", "runtime~main.js": "/static/js/runtime~main.a8a9905a.js", "runtime~main.js.map": "/static/js/runtime~main.a8a9905a.js.map", "static/js/2.deb8772f.chunk.js": "/static/js/2.deb8772f.chunk.js", "static/js/2.deb8772f.chunk.js.map": "/static/js/2.deb8772f.chunk.js.map", "index.html": "/index.html", "precache-manifest.aa20685a6206e3acf7c0796e9d63e96d.js": "/precache-manifest.aa20685a6206e3acf7c0796e9d63e96d.js", "service-worker.js": "/service-worker.js", "static/css/main.a5870b6d.chunk.css.map": "/static/css/main.a5870b6d.chunk.css.map" }PK!Ikhoist/web_files/favicon.ico F )  95@@ nPNG  IHDR(-SPLTE""""""""""""""""""2PX=r)7;*:>H-BGE8do5Xb6[eKK1MU9gs3S\I:gt'03@{VTA}V@y6\fH-CIIE+;@7_i7_jFJKH-BHa,@FCL&.0WNI$)+BJR?v>s>uS=qPPP,?D4U^%+-MK%+,2OX+!gHgEߏܵ} ݻkdJo3L"JQ$ļff,5i9̟H/mBww;D +&WDo@ʴRIBom.۳IENDB`PNG  IHDRשePLTE""""""""""""""""""""""""2RZNJ3R[J)59Y0KS4W`QL%+-0JR)6::gtC"##?vU?wuS/HNM_\M8doDD>t+=B[,>C>tu;kxGR/HN&-/@y>s>t@z]P$'(D].''`C$F (x"6XcTL@I;dd-|P,Ȕ9Rf3FVmM X@Y7N= ʪu }֬+eaiq 76=h Zl}ʱ[FI9Ak9 39ΡqB~bU_^[w{zvz(((fqGkYf~:*4Q\O><דWZ|ދ7jTn`$H+GO*xX*|^dIENDB`PNG  IHDR@@:PLTE"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""%+-@yW`^SC,>C*8uK`A}L8do=r%+,@y^S)59=qPU"#$P\0JQQ"##U#&&_>t>s`_5Yc1OW5Zd1NV+=B1MU+;@/GM\*;?3S\)8<2RZ_+=A],@F,@E&-/0KS7alO9dp8amB~EPN'023T]]?x3U^C6\gU&.0D7_iRHIM$(*?vZX-AG#$%[8co[WC'25?v8bn%*+LN2PX)7;=p~(58^P4WaQT0JRQTI6]hRT0LSF9eqEE9gsFC#&'\`&/16\fBA{R](47%,.*:>*9=9fr:gt7^iU?wZX^QH)6:V'034U^E.EL.FMK@zStRNS* +Ԑ,=V IDATx˵C!C|^yR]MO]0N2"(0V(Y%PDT-~(m!K Y~If{a3Op&Фx#jڶmmc)]m)ƧgfhkҠggǙ+XuiyVתk\[:,6jIJ ;";XfS8=o;(ӥBke\7p+mNaKT1/1O0.h͇YA ->ۋXբ}ߨ ;Nvθ1O@&v/_\\.+0;!f % JYOŽ'/]_;'"&Nn aQ^cxAIENDB`PK!vW  hoist/web_files/index.htmlHoist
PK!n22hoist/web_files/manifest.json{ "short_name": "React App", "name": "Create React App Sample", "icons": [ { "src": "favicon.ico", "sizes": "64x64 32x32 24x24 16x16", "type": "image/x-icon" } ], "start_url": ".", "display": "standalone", "theme_color": "#000000", "background_color": "#ffffff" } PK!Ehoist/web_files/precache-manifest.aa20685a6206e3acf7c0796e9d63e96d.jsself.__precacheManifest = [ { "revision": "1f109193c6057e47a95a", "url": "/static/css/main.a5870b6d.chunk.css" }, { "revision": "1f109193c6057e47a95a", "url": "/static/js/main.59cfe229.chunk.js" }, { "revision": "42ac5946195a7306e2a5", "url": "/static/js/runtime~main.a8a9905a.js" }, { "revision": "8ecbb70267b851bc6075", "url": "/static/js/2.deb8772f.chunk.js" }, { "revision": "79c249a46225288e941e40d75fd56f30", "url": "/index.html" } ];PK!_ !hoist/web_files/service-worker.js/** * Welcome to your Workbox-powered service worker! * * You'll need to register this file in your web app and you should * disable HTTP caching for this file too. * See https://goo.gl/nhQhGp * * The rest of the code is auto-generated. Please don't update this file * directly; instead, make changes to your Workbox build configuration * and re-run your build process. * See https://goo.gl/2aRDsh */ importScripts("https://storage.googleapis.com/workbox-cdn/releases/3.6.3/workbox-sw.js"); importScripts( "/precache-manifest.aa20685a6206e3acf7c0796e9d63e96d.js" ); workbox.clientsClaim(); /** * The workboxSW.precacheAndRoute() method efficiently caches and responds to * requests for URLs in the manifest. * See https://goo.gl/S9QRab */ self.__precacheManifest = [].concat(self.__precacheManifest || []); workbox.precaching.suppressWarnings(); workbox.precaching.precacheAndRoute(self.__precacheManifest, {}); workbox.routing.registerNavigationRoute("/index.html", { blacklist: [/^\/_/,/\/[^\/]+\.[^\/]+$/], }); PK!n2hoist/web_files/static/css/main.a5870b6d.chunk.css@import url(https://fonts.googleapis.com/css?family=Roboto+Mono|Roboto);body{margin:0;padding:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}code{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}body{font-family:Roboto,sans-serif}#controls{color:#e6e6fa;background-color:rgba(0,0,0,.67);z-index:100;position:absolute;right:32px;border:1px solid rgba(176,196,222,.2);width:256px;font-size:12px}#controls .item label{padding:10px;min-width:224px;display:block;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}#controls .item label:hover{cursor:pointer;background-color:rgba(176,196,222,.07)}header{background-color:#000a12;padding-left:20px;padding-top:6px;padding-bottom:4px;height:64px}header h1{color:#f5f5f5;font-size:32px;padding:0!important;margin:0!important}header h1.offline{color:#cd5c5c}header h1 span{color:#4682b4;font-size:14px}header>span{color:#b0c4de;font-style:italic;font-size:12px;padding:0!important;margin:0!important}.grid{display:grid;min-height:calc(100vh - 74px)}nav{grid-column:1/2;color:#f5f5f5;grid-row:1/12;background-color:#000a12}nav div{font-weight:700;padding:8px 8px 8px 18px;font-size:14px}nav a{text-decoration:none;color:#b0c4de}nav a:hover{color:#4682b4}main{position:relative;grid-column:2/12;grid-row:1/12;background-color:#000;font-family:Roboto Mono,monospace;overflow:auto;max-height:calc(100vh - 74px)}.std{white-space:pre;font-size:12px;overflow-x:hidden}.std .index{color:#4682b4;float:left;min-width:42px;padding-right:4px;text-align:right;background-color:#0f0f0f}.std.err{color:#e53935}.std.out,.unread{color:#f5f5f5}.unread{background-color:#2f2f2f;font-family:Roboto Mono,monospace;font-size:10px;margin-left:8px;border-radius:8px;text-align:center;padding-left:4px;padding-right:4px} /*# sourceMappingURL=main.a5870b6d.chunk.css.map */PK!.{ span {\n color: lightsteelblue;\n font-style: italic;\n font-size: 12px;\n padding: 0 !important;\n margin: 0 !important;\n}\n\n\n.grid {\n display: grid;\n min-height: calc(100vh - 64px - 10px);\n}\n\nnav {\n grid-column: 1 / 2;\n color: whitesmoke;\n grid-row: 1 / 12;\n background-color: #000a12;\n}\n\nnav div {\n font-weight: bold;\n padding: 8px;\n padding-left: 18px;\n font-size: 14px;\n}\n\nnav a {\n text-decoration: none;\n color: lightsteelblue;\n}\n\nnav a:hover {\n color: steelblue;\n}\n\nmain {\n position: relative;\n grid-column: 2 / 12;\n grid-row: 1 / 12;\n background-color: #000;\n font-family: 'Roboto Mono', monospace;\n overflow: auto;\n max-height: calc(100vh - 64px - 10px);\n}\n\n.std {\n white-space: pre;\n font-size: 12px;\n overflow-x: hidden;\n}\n\n.std .index {\n color: steelblue;\n float: left;\n min-width: 42px;\n padding-right: 4px;\n text-align: right;\n background-color: #0f0f0f;\n}\n\n.std.err {\n color: #e53935;\n}\n\n.std.out {\n color: whitesmoke;\n}\n\n.unread {\n background-color: #2f2f2f;\n color: whitesmoke;\n font-family: 'Roboto Mono', monospace;\n font-size: 10px;\n margin-left: 8px;\n border-radius: 8px;\n text-align: center;\n padding-left: 4px;\n padding-right: 4px;\n}\n","body {\n margin: 0;\n padding: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Roboto\", \"Oxygen\",\n \"Ubuntu\", \"Cantarell\", \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\",\n sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\ncode {\n font-family: source-code-pro, Menlo, Monaco, Consolas, \"Courier New\",\n monospace;\n}\n","@import url('https://fonts.googleapis.com/css?family=Roboto+Mono|Roboto');\n\nbody {\n font-family: 'Roboto', sans-serif;\n}\n\n#controls {\n color: lavender;\n background-color: #000000aa;\n z-index: 100;\n position: absolute;\n right: 32px;\n border: 1px solid #B0C4DE33;\n width: 256px;\n font-size: 12px;\n}\n\n#controls .item label {\n padding: 10px;\n min-width: 224px;\n display: block;\n user-select: none;\n}\n\n#controls .item label:hover {\n cursor: pointer;\n background-color: #B0C4DE11;\n}\n\nheader {\n background-color: #000a12;\n padding-left: 20px;\n padding-top: 6px;\n padding-bottom: 4px;\n height: 64px;\n}\n\nheader h1 {\n color: whitesmoke;\n font-size: 32px;\n padding: 0 !important;\n margin: 0 !important;\n}\n\nheader h1.offline {\n color: indianred;\n}\n\nheader h1 span {\n color: steelblue;\n font-size: 14px;\n}\n\nheader > span {\n color: lightsteelblue;\n font-style: italic;\n font-size: 12px;\n padding: 0 !important;\n margin: 0 !important;\n}\n\n\n.grid {\n display: grid;\n min-height: calc(100vh - 64px - 10px);\n}\n\nnav {\n grid-column: 1 / 2;\n color: whitesmoke;\n grid-row: 1 / 12;\n background-color: #000a12;\n}\n\nnav div {\n font-weight: bold;\n padding: 8px;\n padding-left: 18px;\n font-size: 14px;\n}\n\nnav a {\n text-decoration: none;\n color: lightsteelblue;\n}\n\nnav a:hover {\n color: steelblue;\n}\n\nmain {\n position: relative;\n grid-column: 2 / 12;\n grid-row: 1 / 12;\n background-color: #000;\n font-family: 'Roboto Mono', monospace;\n overflow: auto;\n max-height: calc(100vh - 64px - 10px);\n}\n\n.std {\n white-space: pre;\n font-size: 12px;\n overflow-x: hidden;\n}\n\n.std .index {\n color: steelblue;\n float: left;\n min-width: 42px;\n padding-right: 4px;\n text-align: right;\n background-color: #0f0f0f;\n}\n\n.std.err {\n color: #e53935;\n}\n\n.std.out {\n color: whitesmoke;\n}\n\n.unread {\n background-color: #2f2f2f;\n color: whitesmoke;\n font-family: 'Roboto Mono', monospace;\n font-size: 10px;\n margin-left: 8px;\n border-radius: 8px;\n text-align: center;\n padding-left: 4px;\n padding-right: 4px;\n}"]}PK!G-hoist/web_files/static/js/2.deb8772f.chunk.js(window.webpackJsonp=window.webpackJsonp||[]).push([[2],[function(e,t,n){"use strict";e.exports=n(8)},function(e,t,n){"use strict";function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}n.d(t,"a",function(){return r})},function(e,t,n){"use strict";n.d(t,"a",function(){return l});var r=n(1);function l(e){for(var t=1;t=t?e.call(null):r.id=requestAnimationFrame(l)})};return r}var d=150,p=function(e,t){return e};function m(e){var t,n,o=e.getItemOffset,c=e.getEstimatedTotalSize,m=e.getItemSize,v=e.getOffsetForIndexAndAlignment,y=e.getStartIndexForOffset,g=e.getStopIndexForStartIndex,b=e.initInstanceProps,k=e.shouldResetStyleCacheOnItemSizeChange,w=e.validateProps;return n=t=function(e){function t(t){var n;return(n=e.call(this,t)||this)._instanceProps=b(n.props,i(i(n))),n._outerRef=void 0,n._resetIsScrollingTimeoutId=null,n.state={instance:i(i(n)),isScrolling:!1,scrollDirection:"forward",scrollOffset:"number"===typeof n.props.initialScrollOffset?n.props.initialScrollOffset:0,scrollUpdateWasRequested:!1},n._callOnItemsRendered=void 0,n._callOnItemsRendered=a(function(e,t,r,l){return n.props.onItemsRendered({overscanStartIndex:e,overscanStopIndex:t,visibleStartIndex:r,visibleStopIndex:l})}),n._callOnScroll=void 0,n._callOnScroll=a(function(e,t,r){return n.props.onScroll({scrollDirection:e,scrollOffset:t,scrollUpdateWasRequested:r})}),n._getItemStyle=void 0,n._getItemStyle=function(e){var t,r=n.props,l=r.direction,i=r.itemSize,a=r.layout,u=n._getItemStyleCache(k&&i,k&&a,k&&l);if(u.hasOwnProperty(e))t=u[e];else{var c,s=o(n.props,e,n._instanceProps),f=m(n.props,e,n._instanceProps),d="horizontal"===l||"horizontal"===a;u[e]=((c={position:"absolute"})["rtl"===l?"right":"left"]=d?s:0,c.top=d?0:s,c.height=d?"100%":f,c.width=d?f:"100%",t=c)}return t},n._getItemStyleCache=void 0,n._getItemStyleCache=a(function(e,t,n){return{}}),n._onScrollHorizontal=function(e){var t=e.currentTarget,r=t.clientWidth,l=t.scrollLeft,i=t.scrollWidth;n.setState(function(e){if(e.scrollOffset===l)return null;var t=n.props.direction,o=l;return"rtl"===t&&(o=l<=0?-o:i-r-l),{isScrolling:!0,scrollDirection:e.scrollOffset0)for(var N=C;N<=E;N++)P.push(Object(u.createElement)(t,{data:d,key:h(N,d),index:N,isScrolling:k?x:void 0,style:this._getItemStyle(N)}));var O=c(this.props,this._instanceProps);return Object(u.createElement)(y||g||"div",{className:n,onScroll:S,ref:this._outerRefSetter,style:r({position:"relative",height:i,width:w,overflow:"auto",WebkitOverflowScrolling:"touch",willChange:"transform",direction:l},b)},Object(u.createElement)(a||s||"div",{children:P,ref:o,style:{height:T?"100%":O,pointerEvents:x?"none":"",width:T?O:"100%"}}))},n._callPropsCallbacks=function(){if("function"===typeof this.props.onItemsRendered&&this.props.itemCount>0){var e=this._getRangeToRender(),t=e[0],n=e[1],r=e[2],l=e[3];this._callOnItemsRendered(t,n,r,l)}if("function"===typeof this.props.onScroll){var i=this.state,o=i.scrollDirection,a=i.scrollOffset,u=i.scrollUpdateWasRequested;this._callOnScroll(o,a,u)}},n._getRangeToRender=function(){var e=this.props,t=e.itemCount,n=e.overscanCount,r=this.state,l=r.isScrolling,i=r.scrollDirection,o=r.scrollOffset;if(0===t)return[0,0,0,0];var a=y(this.props,o,this._instanceProps),u=g(this.props,a,o,this._instanceProps),c=l&&"backward"!==i?1:Math.max(1,n),s=l&&"forward"!==i?1:Math.max(1,n);return[Math.max(0,a-c),Math.max(0,Math.min(t-1,u+s)),a,u]},t}(u.PureComponent),t.defaultProps={direction:"ltr",itemData:void 0,layout:"vertical",overscanCount:2,useIsScrolling:!1},n}var h=function(e,t){e.children,e.direction,e.height,e.layout,e.innerTagName,e.outerTagName,e.width,t.instance},v=m({getItemOffset:function(e,t){var n=e.itemSize;e.size;return t*n},getItemSize:function(e,t){var n=e.itemSize;e.size;return n},getEstimatedTotalSize:function(e){var t=e.itemCount;return e.itemSize*t},getOffsetForIndexAndAlignment:function(e,t,n,r){var l=e.direction,i=e.height,o=e.itemCount,a=e.itemSize,u=e.layout,c=e.width,s="horizontal"===l||"horizontal"===u?c:i,f=Math.max(0,Math.min(o*a-s,t*a)),d=Math.max(0,t*a-s+a);switch(n){case"start":return f;case"end":return d;case"center":return Math.round(d+(f-d)/2);case"auto":default:return r>=d&&r<=f?r:r-dR.length&&R.push(e)}function D(e,t,n){return null==e?0:function e(t,n,r,l){var a=typeof t;"undefined"!==a&&"boolean"!==a||(t=null);var u=!1;if(null===t)u=!0;else switch(a){case"string":case"number":u=!0;break;case"object":switch(t.$$typeof){case i:case o:u=!0}}if(u)return r(l,t,""===n?"."+U(t,0):n),1;if(u=0,n=""===n?".":n+":",Array.isArray(t))for(var c=0;cthis.eventPool.length&&this.eventPool.push(e)}function fe(e){e.eventPool=[],e.getPooled=ce,e.release=se}l(ue.prototype,{preventDefault:function(){this.defaultPrevented=!0;var e=this.nativeEvent;e&&(e.preventDefault?e.preventDefault():"unknown"!==typeof e.returnValue&&(e.returnValue=!1),this.isDefaultPrevented=oe)},stopPropagation:function(){var e=this.nativeEvent;e&&(e.stopPropagation?e.stopPropagation():"unknown"!==typeof e.cancelBubble&&(e.cancelBubble=!0),this.isPropagationStopped=oe)},persist:function(){this.isPersistent=oe},isPersistent:ae,destructor:function(){var e,t=this.constructor.Interface;for(e in t)this[e]=null;this.nativeEvent=this._targetInst=this.dispatchConfig=null,this.isPropagationStopped=this.isDefaultPrevented=ae,this._dispatchInstances=this._dispatchListeners=null}}),ue.Interface={type:null,target:null,currentTarget:function(){return null},eventPhase:null,bubbles:null,cancelable:null,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:null,isTrusted:null},ue.extend=function(e){function t(){}function n(){return r.apply(this,arguments)}var r=this;t.prototype=r.prototype;var i=new t;return l(i,n.prototype),n.prototype=i,n.prototype.constructor=n,n.Interface=l({},r.Interface,e),n.extend=r.extend,fe(n),n},fe(ue);var de=ue.extend({data:null}),pe=ue.extend({data:null}),me=[9,13,27,32],he=$&&"CompositionEvent"in window,ve=null;$&&"documentMode"in document&&(ve=document.documentMode);var ye=$&&"TextEvent"in window&&!ve,ge=$&&(!he||ve&&8=ve),be=String.fromCharCode(32),ke={beforeInput:{phasedRegistrationNames:{bubbled:"onBeforeInput",captured:"onBeforeInputCapture"},dependencies:["compositionend","keypress","textInput","paste"]},compositionEnd:{phasedRegistrationNames:{bubbled:"onCompositionEnd",captured:"onCompositionEndCapture"},dependencies:"blur compositionend keydown keypress keyup mousedown".split(" ")},compositionStart:{phasedRegistrationNames:{bubbled:"onCompositionStart",captured:"onCompositionStartCapture"},dependencies:"blur compositionstart keydown keypress keyup mousedown".split(" ")},compositionUpdate:{phasedRegistrationNames:{bubbled:"onCompositionUpdate",captured:"onCompositionUpdateCapture"},dependencies:"blur compositionupdate keydown keypress keyup mousedown".split(" ")}},we=!1;function xe(e,t){switch(e){case"keyup":return-1!==me.indexOf(t.keyCode);case"keydown":return 229!==t.keyCode;case"keypress":case"mousedown":case"blur":return!0;default:return!1}}function Te(e){return"object"===typeof(e=e.detail)&&"data"in e?e.data:null}var Se=!1;var _e={eventTypes:ke,extractEvents:function(e,t,n,r){var l=void 0,i=void 0;if(he)e:{switch(e){case"compositionstart":l=ke.compositionStart;break e;case"compositionend":l=ke.compositionEnd;break e;case"compositionupdate":l=ke.compositionUpdate;break e}l=void 0}else Se?xe(e,n)&&(l=ke.compositionEnd):"keydown"===e&&229===n.keyCode&&(l=ke.compositionStart);return l?(ge&&"ko"!==n.locale&&(Se||l!==ke.compositionStart?l===ke.compositionEnd&&Se&&(i=ie()):(re="value"in(ne=r)?ne.value:ne.textContent,Se=!0)),l=de.getPooled(l,t,n,r),i?l.data=i:null!==(i=Te(n))&&(l.data=i),H(l),i=l):i=null,(e=ye?function(e,t){switch(e){case"compositionend":return Te(t);case"keypress":return 32!==t.which?null:(we=!0,be);case"textInput":return(e=t.data)===be&&we?null:e;default:return null}}(e,n):function(e,t){if(Se)return"compositionend"===e||!he&&xe(e,t)?(e=ie(),le=re=ne=null,Se=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1