Saravanan666/pypi-org huggingface dataset:
Package: pyFTracks
Fission Track Modelling and Analysis with pythonpyFTracks is a Python utility which predicts Fission-track ages and track-lengths
distributions for some given thermal-histories and given kinetic parameters.
It is an open source version of programs such as AFTSolve or HeFty developped by
Richard Ketcham and describe in Ketcham, 2000, 2005.We provide the code in the hope that it will be useful to the community.We have chosen Python to allow for interaction with the broad range of scientific libraries
available in that language. Python is becoming a language of choice for teaching programming,
it has also many advantages for Research Workflow, such as rapid prototyping and interactivity.InstallationThe code is available on pypi and should work on any Linux distributions, MacOSX and Windows 10.
To install it just run:pipinstallpyFTracksin the console.You can install the package from the latest github source by doing:pipinstallgit+https://github.com/rbeucher/pyFTracks.gitDependenciesThe pip install should take care of the dependencies, if not you might want to
check that you have the following packages installed on your system:Python >= 3.5.xCython >= 0.29.14matplotlib >= 3.1.1numpy >= 1.17.4scipy >= 1.3.2pandas >= 0.25.3tables >= 3.6.1RecommendedWe recommend using Jupyter:jupyterLicensingpyFTracks is an open-source project licensed under the MiT License. See LICENSE.md for details.ContributingContactDr Romain BEUCHER,
The Australian National Universityromain.beucher@anu.edu.au
Package: pyftt
Fast Tensor TraceJulio CandanedoThe Fast-Tensor-Trace algorthim is implemented here in pure python (+numpy with no other dependecies).
The purpose is to trace two multidimensional sparse-arrays (arrays with mostly 0s) similar to
numpy.einsum function for dense (regular) numpy.arrays.Main Aspects of the Code are:
1. sparse-array class defintion
2. the ftt function
Package: pyftype
一个类型检测库。特性类型检测完全模块化，需要检测新的类型，直接参考modules中的检测，编写即可。主要面向逆向工程方向的类型检测，也支持一般类型检测。安装❯ pip install pyftype

❯ pyftype -h
usage: pyftype [-h] [-V] p

positional arguments:
  p              path

options:
  -h, --help     show this help message and exit
  -V, --version  show program's version number and exit

❯ pyftype Makefile
File extension: txt
File MIME type: application/txt用法importpyftype# filef=open(path,"rb")data=f.read()kind=pyftype.guess(data)# pathkind=pyftype.guess(path)# bytesbuf=bytearray([0xFF,0xD8,0xFF,0x00,0x08])kind=pyftype.guess(buf)具体参考examples目录参考https://github.com/h2non/filetype.pyhttps://github.com/kin9-0rz/cigam
Package: pyfuelprices
pyfuelpricesA generic python module to retrieve fuel prices for different fuel suppliers.Install# Install toolpip3installpyfuelprices# Install locallyjustinstallUsageTODODatasourcesSources used to provide data for this module include:AU: FuelWatch (https://www.fuelwatch.wa.gov.au)AT: Spritpreisrechner (https://www.spritpreisrechner.at/)BE: DirectLease TankService (https://directlease.nl/tankservice/) - Use Netherlands data source below to access.DE: TankerKoenig (https://tankerkoenig.de/)GB: CMA Temporary Road Fuel Price ODS (https://www.gov.uk/guidance/access-fuel-price-data)NL: DirectLease TankService (https://directlease.nl/tankservice/)US: GasBuddy (https://www.gasbuddy.com/)Development# Get a comprehensive list of development toolsjust--list
Package: pyfuf
A simple wrapper for fuff fuzzer in pythonInstall!pipinstallpyfuforgitclonegit@github.com:0xleft/pyfuf.gitcdpyfuf
pipinstall.UsageThere is a good example inexample.pyfile.importpyfuf# callback function when a line from fuff is parseddefcallback(line):# if the line is a finding, parse itifpyfuf.get_line_type(line)==pyfuf.LineType.FINDING:finding=pyfuf.parse_finding_line(line)# print the parsed finding objectprint(finding)# arguments for fuffargs=pyfuf.FuffCommandBuilder()args.set_target("http://localhost/FUZZ.php")args.set_wordlist("wordlist.txt")args.set_method("GET")args.set_user_agent("PyFuf")args.follow_redirects()args.ignore_wordlist_comments()# start fuzzingpyfuf.fuzz(args,callback)TODOAdd testsAdd docsMake codebase cleaner
Package: py-fumen
py-fumenPython implementation of knewjade's fumenUsesThe usage of this package is very similar to the original fumen package.Decodefrom py_fumen.decoder import decode

decode_pages = decode("v115@vhHJEJWPJyKJz/I1QJUNJvIJAgH")

for page in decode_pages:
    print(page.get_field().string())Encodefrom py_fumen.encoder import encode
from py_fumen.field import Field, create_inner_field
from py_fumen.page import Page

pages = []
pages.append(
    Page(field=create_inner_field(Field.create(
        'LLL_____SS' +
        'LOO____SST' +
        'JOO___ZZTT' +
        'JJJ____ZZT',
        '__________',
    )),
    comment='Perfect Clear Opener'))

print(encode(pages))InstallationIn command prompt or terminal or equivalent, runpip install py-fumenDifference between the knewjade's fumenSome of functions and variables are non-private because of the disparity between python and typescript (e.g. quiz variable in the Quiz class).Function and varibale names are changed with python naming convention.create_inner_field function and create_new_inner_field are moved to field.py because of cross importing issue.page.py is created for better OOP.js_escape.py is added to imitate javascript's escape/unescape.buffer.ts is renamed to fumen_buffer.py and Buffer object to FumenBuffer.getters and setters are changed into methods (e.g. Page.get_field()).
Package: py-fumen-py
py-fumen-pyMore Python-ish Python implementation ofKnewjade's tetris-fumenOriginal project:hsohliyt105's py-fumenInstallationpython3-mpipinstallpy-fumen-pyUsagefrompy_fumen_pyimport*Modulebold namesare automatically imported withfrom py_fumen_py import *NameDescriptionImportable NamesactionCodec for action in a fumen stringAction,ActionCodeccommentCodec for comment in a fumen stringCommentCodecconstantConstants used in the projectFieldConstants,FieldConstants110,FumenStringConstantsfieldPlaying field objectFieldfumen_bufferBuffer objects for saved dataFumenBuffer,FumenBufferReader,FumenBufferWriterfumen_codecThe Fumen codecdecode,encodejs_escapeescape()ported from JavaScriptescape,unescape,escaped_compareoperationTetrimino placement objectMino,Rotation,OperationpagePage objectFlags,Refs,PagequizQuiz objectQuizExampleDecodingfrompy_fumen_pyimport*pages=decode('v115@9gQ4EeAtBewhR4CeBtBewhg0Q4CeAtglRpwhi0Aeil?RpwhJeAgWSANxiSASowNE1oo2AzyBUAT5AAA')fori,pageinenumerate(pages):print(i)print(page.field)Encodingfrompy_fumen_pyimport*field=Field(field='\n'.join(['S_____Z__I','SS___ZZ__I','JS___ZLOOI','JJJ_LLLOOI',]),garbage='__________')pages=[Page(field=field,operation=None,comment='MKO you say?',flags=Flags(),refs=Refs())]print(encode(pages))Difference Compared withtetris-fumenandpy-fumenAction encoding and decoding are moved toactionComment encoding and decoding are moved tocommentAddedFieldConstants110toconstantto accomodate for Fumen version110decoderandencoderare combined into onefumen-codecmodulefieldandinner_fieldare combined into onefieldmoduleAction, comment and field reading/writing are moved tofumen_bufferPlacement tetriminoenumobjects are moved tooperationquizworks completely differently (based onthis editorinstead oftetris-fumen)
Package: py-fumen-util
py-fumen-utilPython implementation ofswng's FumenUtil, usingpy-fumen-pyDependencypy-fumen-py: Python implementation of knewjade'stetris-fumennode moduleInstallationpython3-mpipinstallpy-fumen-utilUsagepython3-mpy_fumen_utilcommand[commmand...]filecommand: Command(s) to execute on the Fumen(s).file: File with Fumen strings, separated with whitespace and/or linebreak. Use "-" to read from standard input.Commandsommands are case-insensitive.CommandDescriptionAliasjoinJoin multiple Fumens into onecombine concatsplitSplit each page into a FumenassembleAssemble Fumen placements into one pagecompile, ungluedisassembleDisassemble each Fumen page into tetrimino placementsdecompile, gluegrayGray out the last page of each FumengreygrayallGray out all pages of each FumengreyallprunePrune colored minos from the last page of each FumenpruneallPrune colored minos from all pages of each FumenlockLock the last page of each Fumen and append a new pagemirrorMirror Fumen pagesflipuncommentUncomment Fumen pages
Package: pyfuncbuffer
pyfuncbufferA simple to use decorator to buffer function calls. Supports python versions 3.7 and up.
Works for both regular and async functions.Install$pipinstallpyfuncbufferExample usageLet's say you have a scraper, and don't want sites to timeout you.
You can use the@buffer()wrapper to make your function calls buffered!frompyfuncbufferimportbuffer# We specify scrape_links to always buffer at least 0.5 seconds# and by a random delay of 0 to 0.5@buffer(seconds=0.5,random_delay=0.5)defscrape_links(url)->[]:...links=scrape_links("https://example.org")whileTrue:link=links.pop(0)links.append(scrape_links(link))The@buffer()wrapper works both for regular functions, and instance methods!Parametersseconds: RequiredSeconds to buffer. Can be an int or a float.random_delay: OptionalSeconds to define a random delay between 0 and random_delay.
Can be an int or a float. Alternativelly if a tuple is passed,
delay is chosen betweenrandom_delay[0]andrandom_delay[1].always_buffer: OptionalWhether or not to always buffer. If specified,buffer_on_same_argumentsis ignored.buffer_on_same_arguments: OptionalOnly buffer if the arguments on the buffered function are the same.
False by default.share_buffer: OptionalShare buffer between processes. This is only useful when using
multiprocessing, and still wanting to have function calls
buffered even if called in seperate processes.TestingTesting is done usingpytestandpytest-asyncio.Run$python-mpytesttests/test_pyfuncbuffer.pyin the project root to run all the tests.
Package: pyfunc-invoker
PyFuncThis package provides a mechanism to write Function-as-a-Service style code in
Python for handling HTTP events, including CloudEvents delivered via HTTP.This framework is primarily intended to work withKnative, but also works to provide a generic server for
handling CloudEvents over HTTP (e.g. from Kubernetes or on a local machine).The framework uses reflection to find a suitable function to wrap; it should not
be necessary to import any of the following modules in your own code unless you
want (e.g. for type definitions):pyfunc(this module; on PyPi aspyfunc)flaskcloudeventsInstead, simply ensure that you have a single non-_prefixed function which
uses some combination of the following:HTTP request arguments (namedreq,request,body,headersor of theflask.Requesttype)CloudEvent arguments (namedevent,payload,data,attributesor of thecloudevents.sdk.event.v1.Eventtype)Usage:importloggingfromtypingimportAnycounter=0defhandler(data:Any,attributes:dict,req:Any):globalcountercounter=counter+1logging.info(f"Got data:{data}")logging.info(f"From{req.origin}, my{counter}th request!")attributes["type"]="com.example.reply"attributes["datacontenttype"]="text/plain"returnattributes,"It's a demo"UsageTo check the current working directory for a module calledhandlerand functionhandler:python -m pyfuncTo check the current working directory for a module calledmyhandlerand functionfunc:PYTHON_HANDLER=myhandler.func python -m pyfuncTo check a specific directory./myfuncs/http/for a module calledhandlerand functionhandler:python -m pyfunc ./myfuncs/http/To check a specific directory./myfuncs/http/for a module calledmyhandlerand functionfunc:PYTHON_HANDLER=myhandler.func python -m pyfunc ./myfuncs/http/
Package: pyfuncpatmatch
pyfuncpatmatchPattern matching (like haskell) for python fonctionsInstallpipinstallpyfuncpatmatchUsagebasic recursive fibonaccifrompyfuncpatmatchimportpatfunc@patfunc([0],{},lambda_:0)@patfunc([1],{},lambda_:1)deffib_rec(n:int):returnfib_rec(n-1)+fib_rec(n-2)less basicfrompyfuncpatmatchimportpatfuncdeffor_admin(xp,is_admin=True):print("Admin has 2000xp")deffor_newbie(xp,is_admin=False):print("You are new")@patfunc([],{"is_admin":True},for_admin)@patfunc([1],{"is_admin":False},for_newbie)defprint_for(xp,is_admin=False):print("Someone has xp:",xp)in action:>>>print_for(1,True)Adminhas2000xp>>>print_for(1,False)Youarenew>>>print_for(20,False)Someonehasxp:20with list extractfrompyfuncpatmatchimportpatfunc,PatListExtract@patfunc([PatListExtract()],{},lambdax,y:print(x))defprint_initial(name:str):...in action>>>print_initial("SuperName")S>>>print_initial("a")abut with empty value(you could have not this error, but, still)>>>print_initial("")Traceback(mostrecentcalllast):File"<stdin>",line1,in<module>File".../pyfuncpatmatch/pyfuncpatmatch.py",line64,in__call__kv,av,status=self._exe_extract_paterns(list(args),kwds)^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^File".../pyfuncpatmatch/pyfuncpatmatch.py",line140,in_exe_extract_paternsfst=value[0]~~~~~^^^IndexError:stringindexoutofrangeso you need to put a pattern matching with an empty value(like this:)frompyfuncpatmatchimportpatfunc,PatListExtract@patfunc([""],{},lambdax:print("Empty Name"))@patfunc([PatListExtract()],{},lambdax,y:print(x))defprint_initial(name:str):...and it will be like this:>>>print_initial("")EmptyName>>>print_initial("a")a>>>print_initial("SupperName")S
Package: pyfuncrun
Run a python function in a module from command line and shiftsys.argv,
so function can parsesys.argvproperly.Install$pipinstallpyfuncrunUsage$pyfuncrun<path.to.func><funcarguments><argumentsforfunctoparseinsys.argv>Examplefunc.py:importsysdefprint_sys_argv():printsys.argvdeffunc_with_args(a,b):print((a+b),sys.argv)deffunc_with_kwargs(a,b,c=1):print((a+b+c),sys.argv)Run:$pyfuncrunfunc.print_sys_argv12['pyfuncrun',1,2]$pyfuncrunfunc.func_with_args12(3,['pyfuncrun'])$pyfuncrunfunc.func_with_kwargs1234(6,['pyfuncrun',4])
Package: pyfunctional-elunico
pyfunctionalFind iton PyPIThis is a collection of functional tools I like to use in PythonContentsdefalleq(iterable:Iterable[S])->boolreturns True if an iterable is empty or if all elements are equal to the firstdeftranspose(double_iterable:Iterable[Iterable[S]])an iterable object that takes a nested iterable and transposes it lazilydefrepeat(element:E,count:int)an iterable object that takes an element and a count and returns that elementcounttimesdefattempt(block:Callable[[Any],T],default:T=None,catch:Union[Type[Exception],Iterable[Type[Exception]]]=(Exception,),args:Iterable[Any],kwargs:Dict[Any,Any])->Ta function that takes a callable, a default value, a list of excpetion types, an arg tuple, and a kwarg dict and calls the callable, catching the exceptions specified, and returning the function value on success, the default value on a known caught exception, and allowing any other none-accounted for exceptions bubble up.defrreduce(reduction:Callable[[R,E],R],indexable:Indexable,initvalue:Union[R,Sentinel]=sentinel)->RPerforms the same operation asfunctools.reducebut working from the right side (high indices) of the collection rather than the start (lower indices) of the collection. Requires the collection to supportlen()and indexing (iterators do not support__getitem__but lists and tuples--for example--do)Not the specification forIndexablebelowfromtypingimportProtocolclassIndexable(Protocol):def__getitem__(self,index:int)->Any:...def__len__(self)->int:...defcommute(fn:Callable[[S,T],R])->Callable[[T,S],R]Commutes the operands of a binary function. Does not (yet) work for varargs or functions other than 2-aritydefidentity(x:T)->TThe identity functiondefbind(fn:Callable[[Any],R],arg:Any,position:int=0)->Callable[[Any],R]Given an-arity functionfn, bindargto thepositionth argument offnand return a new function which takesn-1args. The new function behaves as if the positional argument atposititonwas removed from the argument order.The argument count is 0 basedIffn.__code__.co_argcountis less or equal toposititonthe function will raise aValueErrordeffull(fn:Callable[[Any],R],*args:Any)->Callable[[],R]Like functools.partial, except requires you to fill inallthe arguments offn. Returns a new function
that passes*argstofnbut takes no arguments itself and returns the return value offn
Package: pyfunctions
pyfunctions常用函数的封装,包括不限于python爬虫的请求、解析等InstallationYou can getpyfunctionsvia pip:pip install pyfunctionsClone the source to get the latest version:$gitclonehttps://github.com/broholens/pyfunctions.git
$pipinstall-rrequirements.txtQuickStartfrompyfunctionsimportfuntext=fun.url2text('http://www.mogojob.com/')>>>'首页 职位大厅 招聘企业 猎头服务 商务服务 我要招人\n\n企业入口  个人登录\n\n\n\n全国 	北京 上海 西安 广州 杭州 深圳 成都 重庆 武汉 南京 天津         ...客服工作时间 : 周一至周五 09:00 - 18:00\n\n投递信息 我的简历 退出系统\n\n'开发小记发布包使用setup.py,修改内容后执行python setup.py upload发布包遇到错误:bdist_wheel报错首次发布失败(包名重复),更正后再次执行遭遇tag already exists,需要删除tag.git tag -d v2018.5.24pipreqs自动生成项目requirements.txt:pipreqs . --encoding=utf8response._content获取图片内容
Package: pyfunctor
pyfunctor is a Python Functor library that provides classes implementing
lazy evaluation, pipeline operators and block syntax.An example of usages is following:>>> from pyfunctor.functor import *
>>> f = (Functor(range(10)) >> c_(map)(lambda x: x * 2)
...      >> c_(filter)(lambda x: x < 7)
...      >> c_(sorted).key(lambda x: -x))
>>> run(f)  # lazy evaluation
[6, 4, 2, 0]The ‘Functor’ class packs a value into a context.
The pipeline operator ‘>>’ composes functions, but it is not calculated until
‘run’ function is applied to the ‘Functor’ instance.Furthermore, ‘Functor’ instance will work together with the ‘with’ statement.
The instance is only once evaluated after the with-block is done.>>> with Functor(range(10)) as box:
...     @c_(map)
...     def f(x):
...         y = x % 3
...         z = x + y
...         return x + y + z
...
...     @c_(sorted, keyword='key')
...     def g(x):
...         return (x % 7, x % 3, x)
>>> box.value
[0, 14, 8, 16, 10, 18, 4, 12, 6, 20]In general, functors are things that can be mapped over, like Lists, Maybes and such.
The ‘Functor’ class implements the identity functor to provide a default implementation.
As other examples, ‘ListF’ and ‘Maybe’ are provided.>>> from pyfunctor.list import *
>>> run(ListF([1, 2, 3]) >> (lambda x: x + 1))
[2, 3, 4]
>>> f = lift(lambda x, y: (x, y))
>>> run(f(ListF(range(3)), ListF('ab')))
[(0, 'a'), (0, 'b'), (1, 'a'), (1, 'b'), (2, 'a'), (2, 'b')]>>> from pyfunctor.maybe import *
>>> @lift
... def func(x):
...     if x > 0: return x * 2
...     else: raise Exception()
>>> func(Just(1)).run()
Just(2)
>>> func(Just(0)).run()
Nothing
Package: pyfun-events
Function framework for PythonThis framework provides a mechanism to write Function-as-a-Service
style code in Python for handling CloudEvents delivered via HTTP.This framework is primarily intended to work withKnative, but also works to provide
a generic server for handling CloudEvents over HTTP (e.g. from
Kubernetes or on a local machine).Usage:importloggingfrompyfun_eventsimportHandle,Getcounter=0# @Handle assumes json body. For string or other body conversion, try:# @Handle(str)@HandledefDoEvent(data:str,context:dict):logging.info(data)counter=counter+1@Handle(path="/secret")defDoOther(data:str,context:dict):ifdata.get("handshake")=="backwards":counter=0return"It's gone, man"@GetdefInfo():return"Got{0}".format(counter)@Get("/dance"):defParty():return"<BLINK>Like it's 1999</BLINK>"Running manuallyCopypackaging/config.pyandpackaging/requirements.txtinto your
application directory alongside your other code. You can then start the Flaskk webserver running your function with:FLASK_APP=config
flaskrunRunning on KnativeThere is a supplied build template inpackaging/build-template.yaml, which you can apply to your cluster with:kubectlapply-fpackaging/build-template.yamlorkubectlapply-fhttps://github.com/evankanderson/pyfun/tree/master/packaging/build-template.yamlThen update your Knative Service like so:apiVersion: serving.knative.dev/v1alpha1
kind: Service
metadata:name: message-dumper
spec:runLatest:configuration:+     build:+       source:+          git:+            url: YOUR_REPO_URL+            revision: HEAD+       template:+         name: pyfn+         arguments:+         - name: IMAGE+           value: YOUR_DOCKER_IMAGE+       serviceAccountName: builderrevisionTemplate:spec:container:image: YOUR_DOCKER_IMAGE
Package: pyfunk
# Gakp-pyfunkA set of functional tools for python. It is supposed to have the same interface as Gakp-jsfunk and Gakp-lispfunk## Example```pythonfrom pyfunk.combinators import composefrom pyfunk.collections import fmapfrom pyfunk.functors.io import IOdef get_file(filename):"""@sig get_file :: String -> IO String """def open_file():with open(filename) as f:return f.read()return IO(open_file)def get_tokens(str):return str.split()def get_lenght_of_tokens(tokens):return len(tokens)tokenLength = compose(fmap(get_lenght_of_tokens), fmap(get_tokens), get_file)print(tokenLength('.gitignore').unsafeIO())```## ContributingAnyone can contribute using the fork and pull model.
Package: pyFunloader
A very fast downloader module that is based on pyCurl and multithreading.You can pause, resume, stop and retry your downloads. If you run into issues with pyCurl installation, try:env PYCURL_SSL_LIBRARY=openssl LDFLAGS="-L/path/to/openssl-parent-libdir" CFLAGS="-I/path/to/openssl-parent-include-dir" pip3 install --no-cache-dir --compile --ignore-installed pycurlExample code:from pyFunloader import Funload, humanize

import asyncio

async def test():
    action = Funload(
        url="https://proof.ovh.net/files/1Gb.dat",
        destination="downloads/", # optional, / at the end is necessary for directory detection
        progress_bar=True, # optional
        in_memory=False, # optional, if true, file can be acquired by action.memory_file afterwards
        block=False, # optional
        timeout=10, # optional
        useragent="Some user agent", # optional
        buffer=20000 # optional
    )

    await action.start()

    while True:
        print(
f"""
File: {action.destination}
Size: {humanize(action.file_size)}
Downloaded: {humanize(action.downloaded)}
Speed: {action.speed}
Estimate: {action.estimate}
Elapsed Time: {action.elapsed_time}
Status: {action.status}
Percentage: {action.percentage}
"""
        )

        if action.is_finished:
            break

        await asyncio.sleep(1)

asyncio.run(test())
Package: pyfurby
# PyFurby
Control a Raspberry Pi Zero enpowered furby via a served Jupyter notebook or via a restless API.The victim, looking scared…[![fear](images/fear.thumbnail.jpg)<br/>(click to enlarge)](images/fear.JPG)## Module details and functionalitySee [API notes](API.md)The objective is to make the furby easy to control and customise.
Say in a Furby served Jupyter notebook within the local network:from pyfurby import Furby
furby = Furby()
furby.wait_until_squeezed()
furby.say(‘Get your filthy hands off me’)
furby.wait_until_moved()
furby.say(‘Put me down you degenerate’)It contains several methods, ranging from the comicalfurby.flutter() # it flutters its eyelidsto the usefulfurby.recite_ip()And can be set commands remotely:furby.restless()## BackgroundThe idea and the majority of the setup came form [a blog post](https://howchoo.com/g/otewzwmwnzb/amazon-echo-furby-using-raspberry-pi-furlexa)
However, there were lots of problems and differences.
Namelythe code here is differentthe components are squeezed in differentlygyroscope## Project
This project can be divided into:[hardware](hardware.md)[software](software.md)On the software side, I was disappointed that Alexa not on an Echo cannot play music.
However, making it serve a jupyter notebook and having a nice API (pyfurby) mean that it’s rather fun.
As a result it is not a Furbexa, but a pyfurby. What do you reckon Furby?from pyfurby import Furby
furby = Furby()
furby.say(‘I rather have my fur back on, you creep!’)In fact, I am going to find someone who can sew to make it a lab coat so it can give instructions at open days.